在某项目中,前端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. [Selenium] close alert window

    public static boolean isAlertPresent(WebDriver driver) { try { driver.switchTo().alert(); return tru ...

  2. [Selenium] 使用Firefox Driver 示例

    //导入Selenium 库和FirefoxDriver 库 package com.learningselenium.simplewebdriver; import org.openqa.selen ...

  3. 看鸟哥的Linux私房菜的一些命令自我总结(一)

    -显示目前所支持的语言  echo &LANG -修改语言成为英文系统  LANG=en_US -显示日历的命令 cal [[month] year] -惯用关机命令 shutdown 参数: ...

  4. Android 实用技巧 --- 命令godir (转载)

    转自:http://blog.csdn.net/bigmarco/article/details/6995426 source build/envsetup.sh后可以使用很多android集成的sh ...

  5. 洛谷 - P2945 - 沙堡Sand Castle - 排序

    https://www.luogu.org/problemnew/show/P2945 好像猜一猜就觉得排序之后是最优的,懒得证明了.每个城墙向他最接近的城墙靠近,绝对是最优的.

  6. Codeforces627A【数学·有意思】

    题意: 求有多少对( a , b ),a+b=s,a^b=x.(正整数) 思路: a+b=a^b+a&b*2; #include <iostream> #include <c ...

  7. HDOJ4857【拓扑排序】

    首先 CLJ ORZ 这道题做了两次,第一次瞎搞... 第二次,好吧,骄傲地说水过... 题意:不说了: 思路: 题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来: 第一次做的时候,我记得我 ...

  8. bzoj 3998: [TJOI2015]弦论【SA+二分||SAM】

    SA的话t==0直接预处理出每个后缀的不同串贡献二分即可,然后t==1就按字典序枚举后缀,然后跳右端点计算和当前后缀的前缀相同的子串个数,直到第k个 不过bzoj上会T #include<ios ...

  9. bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】

    01分数规划,二分答案然后把判别式变成Σp[i]-Σs[i]*mid>=0,然后树上背包判断,设f[i][j]为在i点子树里选j个的最大收益,随便背包一下就好 最丧病的是神卡常--转移的时候要另 ...

  10. Python基础知识(1)

    Python 3 1:print:输出信息    例子:   ( 所有的标点符号都要是英文状态下输入,要不然会报错) print(“hello world”) 2:注意 : python 和 pyth ...