在某项目中,前端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. bzoj1038&&500AC!

    序列dp 先开始想了一个类似区间dp的东西...少了一维 然后发现似乎不太对,因为女生的最大差和男生的最大差并不相等 dp[i][j][x][y]表示当前有i个人,j个男生,男生和女生的后缀最大差是x ...

  2. UIAlterController 的使用

    相对于IOS8.4之后苹果对提示框做了进一步的封装,这将与之前的提示框有很大的同. 之前的 UIAlterView  是弹出一个提示框. 而今天学习的提示框是 通过视图控制器进行弹出,这就意味着,我们 ...

  3. IntentService使用以及源码分析

    一 概述 我们知道,在Android开发中,遇到耗时的任务操作时,都是放到子线程去做,或者放到Service中去做,在Service中开一个子线程来执行耗时操作. 那么,在Service里面我们需要自 ...

  4. SCUT - 261 - 对称与反对称 - 构造 - 简单数论

    https://scut.online/p/261 由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理! 由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理! 由于M不是质数,要用扩展欧几 ...

  5. bzoj 4698: Sdoi2008 Sandy的卡片【SAM】

    差分之后用SAM求LCS,然后答案就是LCS+1 #include<iostream> #include<cstdio> #include<cstring> usi ...

  6. hdu 3622 Bomb Game【二分+2-SAT+tarjan】

    用read()会挂 二分半径,显然最优的是所有原都用这个最小半径,然后2-SAT把相交的圆建图,跑tarjan判一下可行性即可 #include<iostream> #include< ...

  7. RobotFrameWork自动化系列:安装配置

    1.   RobotFrameWork安装配置 1.1. 安装环境 64位win10家庭中文版 网上很多这方面的教程,但是比较零散,这里是自己安装配置的一个简单的笔记. 1.2. 安装说明 由于Rob ...

  8. scrapy 连接错误

    twisted.python.failure.failure twisted.internet.error.connectionlost: connection to the other side w ...

  9. 交表(Send a Table)

    #include<stdio.h> #include<string.h> #define N 50010 int phi[N],n,sum[N]; void phi_table ...

  10. android 多线程(二)

    1. 使用 AsyncTask 实现进度条 package com.test.network; import android.os.AsyncTask; import android.support. ...