在某项目中,前端jsp传入的用户id数据通过session域传入后台servlet进行处理的过程中,无意间出现了InvocationTargetException异常

前端部分代码如下:测试代码,非原项目代码

 // 登录处理源码
if ("student".equals(role)) {
// 学生登录
// 创建学生服务对象
StudentService ss = new StudentServiceImpl();
// 调用服务中的登录进程
Student student = ss.login(uid, upwd);
// 判断此学生是否存在
if(student != null) {
// 如果存在,则登录成功, 存储学生信息
/* javax.servlet.http.HttpSession源码
* public void setAttribute(String name, Object value);
*/
// 第一种设置域属性方式:sid 在实体类中定义的是int类型,setAttribute中传入值则自动装箱成Integer
// req.getSession().setAttribute("uid", student.getSid());
// 第二种设置属性方式:为了验证,此处给指定字符串数据
req.getSession().setAttribute("uid", "1");
req.getSession().setAttribute("uname", student.getSname());
// 页面跳转
resp.sendRedirect(req.getContextPath() + "/index.jsp");
return;
} else {
// 失败信息
req.setAttribute("error", "用户名或密码错误,请重新登录!");
// 请求转发
req.getRequestDispatcher("login.jsp").forward(req, resp);
return;
}
}
 <-- 登录成功后的跳转链接 -->
<div>
<a href="student.action?operation=queryInfo&uid=${uid }" class="left-font03">查看个人信息</a>
</div>
 // 获取详细信息的servlet代码
public void queryInfo(HttpServletRequest req, HttpServletResponse resp){
StudentService ss = new StudentServiceImpl();
// 直接从url中的参数中获取uid,为String类型数据
//String uid = req.getParameter("uid"); // 第一种获取uid方式:从登录时保存在session中属性获取,此属性为int类型,通过setAttribute方法自动装箱成Integer类型属性传递
// int sid = (Integer) req.getSession().getAttribute("uid"); // 第二种获取uid方式:从登录时保存在session中属性获取,此属性为String类型
String uid = req.getSession().getAttribute("uid"); // 出现InvocationTargetException异常的源头就在此,由于使用getAttribute方法获取保存在对应域内的属性值默认属性为Object,
// 此时强转类型需要使用与原类型匹配的类型,否则在下面语句转换数据为int类型时会出错
int sid = Integer.parseInt(uid);
Student student = ss.queryById(sid);
if(cs.queryById(sid) != null ){
req.setAttribute("student", student);
try { // 请求转发 req.getRequestDispatcher("student/information.jsp").forward(req, resp);
return;
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
} // 重写service方法,通过反射提取方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取当前对象所属类的Class对象
Class<?> c = this.getClass();
// 接收想要被调用的方法的名字
String name = req.getParameter("operation");
try {
// 通过class对象获取要调用的方法
// 如果被调用方法出错,此处就会抓取异常信息,也就是InvocationTargetException异常的来源
Method method = c.getMethod(name, HttpServletRequest.class, HttpServletResponse.class);
// 通过反射调用该方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}

下面这段代码需要特别注意:

  如果在保存属性时,属性内容,setAttribute中传递的是数字,非字符串,则在接收属性时,不再需要使用 Integer.parseInt(uid) 对其进行转换,直接使用 (Integer) req.getSession().getAttribute("uid");进行强转即可得到对应的数字。此时如果使用String类型变量来接收该属性,则会存在数据类型不匹配的隐患,然后再使用Integer.parseInt(uid)进行强制类型转换,就会出现异常,从而导致通过反射调用该方法是出现 InvocationTargetException 异常。

  如果在保存属性时,属性内容,setAttribute中传递的是由数字用双引号转化的字符串,则需要用一个String类型的变量接收获取的属性,String uid = req.getSession().getAttribute("uid");然后再使用Integer.parseInt(uid)对其进行强转后才能向实体对象中保存或做其他用途。

 // 第一种获取uid方式:从登录时保存在session中属性获取,此属性为int类型,通过setAttribute方法自动装箱成Integer类型属性传递
// int sid = (Integer) req.getSession().getAttribute("uid");
// 第二种获取uid方式:从登录时保存在session中属性获取,此属性为String类型
String uid = req.getSession().getAttribute("uid");
// 出现InvocationTargetException异常的源头就在此,由于使用getAttribute方法获取保存在对应域内的属性值默认属性为Object,
// 此时强转类型需要使用与原类型匹配的类型,否则在下面语句转换数据为int类型时会出错


个人总结分享,共同学习。

InvocationTargetException异常的深入研究-servlet的setAttribute与getAttribute的更多相关文章

  1. 引入工程报包导入异常:import javax.servlet.annotation.WebFilter;

    引入工程报包导入异常:import javax.servlet.annotation.WebFilter; (2013-02-21 16:38:00)   分类: java 今天上午导入了一个项目,用 ...

  2. 反射调用方法报InvocationTargetException异常

    利用 Method 对象的 invoke 方法调用目标对象的方法时, 若在目标对象的方法内部抛出异常, 会被包装成 InvocationTargetException 异常抛出,  可以通过调用 In ...

  3. InvocationTargetException异常解析

    InvocationTargetException异常由Method.invoke(obj, args...)方法抛出.) { throw new ZeroException("参数不能小于 ...

  4. InvocationTargetException异常

    package com.smbea.demo.reflect; /** * 越界异常 * @author hapday * @date 2017年1月20日 @time下午7:59:01 */ pub ...

  5. Servlet中Request的getAttribute getParameter 区别

    1.从更深的层次考虑,request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据. request.getParameter()方法返回Str ...

  6. JavaScript常用的方法和函数(setAttribute和getAttribute )

    仅记录学习的新知识和示例,无干货. 1.setAttribute和getAttribute          (Attribute:属性) setAttribute:为元素添加指定的属性,并为其赋值: ...

  7. Java异常的深入研究与分析

    前言 本文是异常内容的集大成者,力求全面,深入的异常知识研究与分析.本文由金丝燕网独家撰写,参考众多网上资源,经过内容辨别取舍,文字格式校验等步骤编辑而成,以飨读者.对于本文的内容,建议小白需要多多思 ...

  8. SSH答疑解惑系列(二)——java.lang.reflect.InvocationTargetException异常

    在项目中遇到了invocationTargetException的问题,在这里跟大家分享一下. 报错信息如下: 使用反射时,比如执行invoke方法,如果被反射执行的方法体抛出了Exception,这 ...

  9. Java基础学习总结(76)——Java异常深入学习研究

        异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 异常处理的流程     当程序中抛 ...

随机推荐

  1. Eclipse慢慢学会的快捷键

    Java编辑器 添加单个import Ctrl+Shift+M Java编辑器 组织多个import Ctrl+Shift+O Ctrl+M切换窗口的大小 Ctrl+D删除当前行 ---------- ...

  2. codevs3955最长严格上升子序列

    传送门  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 给一个数组a1, a2 ... an,找到最长的上升降子序列 ...

  3. [yii]Fetch data from database and create listbox in yii

    <?php $records = User::model()->findAll(); $list = CHtml::listData($records, 'id', 'username') ...

  4. C++ 指针p1 p2,p1-p2 与*p1-*p2的区别

    p1-p2 指 指针的地址值相减,计算两个指针之间的偏移量 *p1-*p2 指 指针指向的内存地址里面存的数值相减

  5. kali的更新源

    先安装的系统最好更新更新 apt-get update apt-get upgrade 因为默认会去国外的网站去下载....慢 为了速度 可以修改更新源 vim /etc/apt/sources.li ...

  6. (水题)Codeforces - 327C - Magic Five

    https://codeforces.com/problemset/problem/327/C 因为答案可以有前导零,所以0和5一视同仁.每个小节内,以排在第 $i$ 个的5为结尾的序列即为在前面 $ ...

  7. = =写个prim希望能够巨巨们看的懂

    prim算法---典型的贪心算法 求最小生成树的算法 (Minimum Spanning Tree)最小生成树: 算法思想:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V, ...

  8. Java 在线反编译

    使用jd-gui反编译java提示 // INTERNAL ERROR // 的类,用在线反编译直接反编译.class http://www.showmycode.com/

  9. Unity里的人物驱动/换装备/换武器/换衣服/卡通重定位(转)

    Unity里的人物驱动/换装备/换武器/换衣服/动画重定位 刚学的过程被这个问题困扰最多. 首先,基本的,大家都知道驱动人物需要骨架.绑骨的Mesh和动画(这三个要是不知道的话就得考虑看看计算机图形学 ...

  10. python之重写父类方法

    #修改父类的方法#重写父类的方法的目的是为了给他扩展功能,父类的方法已经不能满足需求#核心思想就一句话,先调用一下你要重写的父类方法,class Coon(object): #基本类 def __in ...