在某项目中,前端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. codeforces 673B B. Problems for Round(模拟)

    题目链接: B. Problems for Round time limit per test 2 seconds memory limit per test 256 megabytes input ...

  2. Xcode6.3真机测试无法选择目标机器问题

    Xcode刚刚升级到了6.3版本,但是真机测试出现了一点问题.对于某些手机无法选中,如下: 上图中的“xxoo的iPhone”无法选中,不过这个问题在stackoverflow中有解答,可以通过其他手 ...

  3. JS 之正则表达式

    字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界. -或- 对 ...

  4. mysite-exampleservice和mysite-vsg

    可能找到了这两个nova安装的地方,下午分析 搜素site_name test 这条线 cord-compute-maas-playbook这条线 这个可以作为验证

  5. 1-1 课程导学 & 1-2 项目需求分析,技术分解.

    1-1 课程导学 1-2 项目需求分析,技术分解. 要有一定的dart基础,了解安卓和ios的一些普通的开发

  6. H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(转载)

    转自:http://www.cnblogs.com/zyl910/archive/2011/12/08/h264_level.html 对于H.264(MPEG-4 AVC)而言,级别(Level)是 ...

  7. python __builtins__ copyright类 (14)

    14.'copyright', 版权 class _Printer(builtins.object) | interactive prompt objects for printing the lic ...

  8. 鸟哥私房菜基础篇:Linux 磁碟与档案系统管理习题

    猫宁!!! 参考链接:http://linux.vbird.org/linux_basic/0230filesystem.php 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-我们常常说,开机的时候 ...

  9. vim 不同的插入方式

    在命令行模式下进入到输入模式 可以敲击 i.a.o. s. I. A. O. S 它们之间的区别做下备忘:i:在光标所在字符前开始插入a:在光标所在字符后开始插入o:在光标所在行的下面另起一新行插入s ...

  10. JS获取屏幕的大小

    <html><script>function a(){document.write("屏幕分辨率为:"+screen.width+"*" ...