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

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

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

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

  如果在保存属性时,属性内容,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)对其进行强转后才能向实体对象中保存或做其他用途。

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

    PQ工具“ColorAdjustTool.exe”,请注意芯片的选择: RDA512C选择533 RDA8501选择331 RDA8503选择131  工模菜单 COLOR LUT: R/G/B/Y/ ...

  2. VPS 安全措施(CentOS 6)

    新到手一台VPS,要做的第一件事大概是做好安全措施. 下面针对CentOS 6随便写点,我目前做的几步是: 修改root密码 SSH-key登录 配置iptable 安装fail2ban 1.修改ro ...

  3. vs 发布网站的时候不编译

    vs2010 vs2008

  4. merge和rebase

    git里面对于分支的合并处理其实有两种.合并与分基. 对于合并,非常简单.git merge [branch-name] 表示把目标分支合并进当前所在分支   至于分基,简单地讲就是换根.具体细节就不 ...

  5. (水题)洛谷 - P1308 - 统计单词数

    https://www.luogu.org/problemnew/show/P1308 简单哈希一下判断,练练手. 注意fgets()的用法,第一个参数传存储位置,第二个参数传内存上限,第三个传std ...

  6. bzoj 2780: [Spoj]8093 Sevenk Love Oimaster【广义SAM】

    AC自动机比较简单,把询问串做成AC自动机然后模板串边跑变更新即可 SAM是把模板串做成广义SAM,然后每个节点存有几个模板串经过,具体方法是每次更新暴力向上跳直到有时间戳我不会证为什么时间复杂度是对 ...

  7. CIFAR10自定义网络实战

    目录 CIFAR10 MyDenseLayer CIFAR10 MyDenseLayer import os import tensorflow as tf from tensorflow.keras ...

  8. 跟我一起玩Win32开发(9):绘图(B)

    我们今天继续涂鸦,实践证明,涂鸦是人生一大乐趣. 首先,我们写一个程序骨架子,以便做实验. #include <Windows.h> LRESULT CALLBACK MainWinPro ...

  9. HAL之EXIT

    在STM32cubeMX中 1 在GPIO管脚上选定EXIT功能 2 在GPIO模式中设定触发边沿类型 3 在NVIC中设定NVIC分组及使能EIXT_Line0_interrupt 在MDK中的GP ...

  10. MySQL执行带out的存储过程

    CALL `sp_sys_get_code`(3,'sys_customer',@code); SELECT @code