JSP中request.setAttribute()出现取不到值的情况

jsp1的代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <meta http-equiv="Cache-Control"content="text/html";charset="utf-8">
</head>
<body>
<a href="jsp2.jsp">处理页</a>
<% request.setAttribute("pwd","111111");%>
</body>
</html>

 jsp2的代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<%
    String pwd = (String) request.getAttribute("pwd");
%>
<html>
<head>
    <title>Title</title>
  <meta http-equiv="content-type"content="text/html";charet="utf-8">
</head>
<body>
pwd参数的值为:<%=pwd%><br>
</body>
</html>

 运行结果:

 jsp2取不到jsp1中request.setAttribute()的值,为什么会出现这个问题? 

 那么我们就可以从request的生命周期来思考了:

request

请求作用域,就是客户端的一次请求。比如访问某个页面,就是一次请求。页面访问结束,该页面的request就结束了

既然如此,那么我们在jsp1的时候已经完成了一次请求,这时request的生命周期结束,当进入jsp2的时候,request.setAttribute()已经成为null,(两次请求生成了两个不同的request对象)

 如何解决这个问题?

我们先研究一下web中传值的时候三个容器,还有一个request,前面已经讲过

application


全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序启动到停止。

session


会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。

打开一个浏览器请求一个网站的页面后,Session开始,当session超过时间限制(一般是20分种)后,session注销而失效或是人为使用session.invalidate();使用session失效。

用浏览器打开一个web程序,一个浏览器窗口就会有一个session,且是唯一的,过了session的生存周期就没了,或者是你关了窗口也就没了。

不同浏览器的session在计算机中并不是同一个。

既然如此,我们将request改为session

问题解决了,为什么?因为session的生命周期是你打开浏览器窗口到你关闭浏览器窗口。

我们再改为application试试

和session的结果一样。 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于JSP+JavaBean+Servlet三层架构员工考勤管理系统源码+数据库+项目说明.zip # JavaWeb_Attendance 1. 软件开发流程(可说明软件的开发流程包括几个阶段,每个阶段做什么任务,出什么文档)z 1) 分析理解前端页面,将前端的html页面改成Jsp页面,JSP页面加入page标签 2) 将JSP页面的静态数据 修改为从数据库查询到的动态数据,通过JSTL的ForEach进行循环遍历数据,并通过EL表达式出数据。 3) 修改JSP代码的分页查询部分代码, 并将(总记录条数,总页码数,每页要显示的数据List<T> 当前页码,每页显示的记录条数(默认为5) 封装到PageBean类) 4) 通过JSP的<a>标签的href属性 或 form的action属性 或 js代码的自定义提交方法进行跳转到Servlet层 5) Servlet层调用Dao层的操作数据库的方法,包括: 数据库的增删改查。添加、删除、查询、多表查询、模糊搜索。 6) 面向接口编程,先写dao接口 再写dao的实现类。 7) 操作完数据库,如果是查询数据 将结果集返回到servlet页面,通过setAttribute(key,value)将数据存入request作用域,跳转回JSP页面,再通过JSP页面的EL表达式获存入的数据。 8) 如果是修改数据,修改完成后直接跳转页面就可 2. 项目整体功能概要(大体说明整个项目的功能) 所有功能全部实现 - 登录、注册(用户添加) - 登录后的首页,显示的是本地时间 - 用户管理 * 分页查询用户信息 * 修改用户用户信息(数据回显,修改) * 删除用户信息 * 添加用户信息 * 模糊搜索用户信息 * 批量删除用户信息 - 部门管理 * 分页查询部门信息 * 修改部门信息(数据回显,修改) * 删除部门信息(部门下人数为0才可删除,不为0就不能是删除) * 添加部门信息 * 模糊搜索部门信息 * 批量删除部门信息 - 日报管理 * 分页查询日报信息 * 修改日报信息(数据回显,修改) * 删除日报信息 * 添加日报信息 * 模糊搜索日报信息 * 批量删除日报信息 - 加班管理 * 加班申请分页查询 * 修改加班申请(数据回显,修改) * 删除加班申请 * 添加 * 模糊搜索 * 批量删除加班信息 - 休假管理 * 休假申请分页查询 * 修改休假申请(数据回显,修改) * 删除加休假申请 * 添加休假申请 * 模糊搜索休假信息 * 批量删除休假信息 - 审批管理(审批加班申请 和 审批休假申请) * 待处理的加班申请 的 分页查询 * 通过加班申请 * 驳回加班申请 * 待处理的休假申请 的 分页查询 * 通过休假申请 * 驳回休假申请 * 模糊搜索 待处理的 加班申请和休假申请 - 个人信息修改 * 根据登录的id查询数据库进行 数据的回显,保存后完成信息修改 - 我的桌面 * 当审批信息后,该页面就会显示通过还是驳回的信息及审批时间 4. 个人承担的开发任务说明(标明个人模块的完成情况,所开发的每个模块功能详细说明及界面) - 登录、注册(用户添加) 从输入框输入数据,在servlet层通过request.getParameter()获form表单提交的参数,将获得的用户名、密码作为参数调用dao层的方法进行查询数据库,select * from t_user_info where username=? andpassword =? 如果数据库查询结果集不为空,则说明数据库有该用户名和密码,可以登录成功。登录成功返回main.jsp页面,登录失败则提示账号或密码错误的信息。 public int searchId(Users u) { String sql = "select id from t_user_info where name = ? and password = ? "; conn = du.getConn(); ps = du.getPs(conn,sql); int myId = 0; try { ps.setString(1,u.getName());
----------重定向---------------------------------------------------------------------------------- //将工程重定向到我们的腾讯网页 response.sendRedirect("http://www.qq.com"); //重定向的好处:不但可以跳转到本工程的资源 也可以跳转到其它资源 response.sendRedirect("userInfo"); //重定向的跳转方式为get(如果下一个servlet没有get方法 将出现异常) 注意事项:a标签和重定向差不多 通过a标签进行跳转时也是调用doGet()方法 //从地址栏上方进入网页也是调用的servlet的get方法 //在使用doGet()方法时还要做验证 看用户是否已经登录 -----转发--------------------------------------------------------------------------- request.setAttribute("un",userName) String userName=(String)response.getAttribute("un"); //但是由于请求资源传递不是连续的 它一次请求后寿命结束 为了延续它的寿命 在页面跳转时 我们不用重定向 我们使用转发 如下: //获得资源定位 然后将请求转发出去----首先将资源定位到list 然后将当前的request和response转发出去--转发 request.getRequestDispatcher("list").forward(request,response); //参数传递 J2EE1.4以下就是将引用直接拷贝过去 J2EE拷贝的是副本 //如果在doPost方法写转发就会进入对方的doPost() 方法 包含转发的方法是什么方法就进入对方的什么方法 //转发的缺点:只能在本工程内转发 //转发和重定向是都是一瞬间就跳转到了要转发的页面 间的内容基本没有时间显示 解决这个问题的方法如下: 包含转发 request.getRequestDispatcher("login.html").include(request.response); //就是将该页面所包含的所有的网页代码包含到我所要跳转的目的地去
### 回答1: request.setAttribute()方法失效可能有以下几种原因: 1. 在请求转发或重定向之后调用了request.setAttribute()方法,因为请求转发或重定向会创建一个新的request对象,原来的request对象的属性会丢失。 2. 在JSP页面使用了<jsp:include>标签或<jsp:forward>标签,这些标签也会创建一个新的request对象,原来的request对象的属性也会丢失。 3. 在使用request.setAttribute()方法之前,已经使用了response.getWriter()方法输出了响应内容,因为在输出响应内容之后,就不能再设置请求属性了。 4. 在使用request.setAttribute()方法之前,已经使用了response.sendRedirect()方法重定向到了另一个页面,因为重定向会创建一个新的request对象,原来的request对象的属性也会丢失。 解决方法: 1. 在请求转发或重定向之前设置请求属性。 2. 在使用<jsp:include>标签或<jsp:forward>标签时,可以使用request.getAttribute()方法获原来的request对象的属性。 3. 在使用response.getWriter()方法输出响应内容之前,不要再设置请求属性。 4. 在使用response.sendRedirect()方法重定向之前,可以使用session.setAttribute()方法将请求属性保存到session,然后在重定向后再从session请求属性。 ### 回答2: 在Java Web开发request.setAttribute()是一种常用的传递数据的方式。一般来说,我们在Servlet通过request.setAttribute()方法设置一个,然后这个就可以被共享到该请求的所有代码范围内。 然而,当我们在使用request.setAttribute()方法时,有时候会发现它失效了,也就是说在其他代码,我们无法获到我们所设置的。针对此问题,常见有以下几种解决方法: 1. 使用session来代替request.setAttribute() 当使用request.setAttribute()方法设置的不生效时,我们可以尝试使用session来替代。使用session来传递数据的好处是能在不同请求和页面间共享数据,从而避免了request.setAttribute()方法失效的问题。 2. 确认代码的执行顺序 如果request.setAttribute()方法没有生效,我们需要确认代码的执行顺序。有时候我们在设置request的属性之后,用了forward请求转发语句,由于forward请求是在浏览器端重新发起了新的请求,所以原请求内所设置的属性会丢失。 3. 检查RequestDispatcher.include()方法 在同一个Servlet内多次调用RequestDispatcher.include()方法时,参数request对象的属性会被认为是不请求相关的,所以也会导致request.setAttribute()方法失效。这时可以直接在include方式之前将属性设置在request即可。 4. 检查变量名和属性名是否一致 当request.setAttribute()方法失效时,我们还需要检查设置的变量名和属性名是否一致,如果不一致,在其他代码这个属性时,获的就是空。所以我们要确保变量名和属性名一致,以免出现混淆。 总结一下,request.setAttribute()方法失效的原因有很多种,我们需要具体问题具体分析,排除一个一个问题,才能找到问题所在。 ### 回答3: request.setattribute是Java Servlet API的一个方法,用于将数据存储到HttpServletRequest对象。但有时在实际应用,我们会发现request.setattribute失效,即调用该方法存储的数据在跳转页面后无法获。 通常情况下,request.setattribute失效的原因有以下几点: 1.数据存储的对象不正确或数据类型不匹配:调用request.setattribute方法时,第一个参数表示存储数据的键,第二个参数表示存储的数据对象。如果参数不正确,比如存储键时使用了空格或特殊字符,或者存储的对象不是JavaBean或基本数据类型等,都会导致存储失败。 2.多个请求之间未正确设置请求属性:如果请求属性是在一个Servlet设置的,而另一个Servlet需要获这个请求属性,那么必须使用请求重定向或者请求转发。如果使用了错误的方法,或者没有进行相应的设置,就会导致request.setattribute失效。 3.请求被重新发送:有时候请求被重新发送,导致存储在HttpServletRequest对象的数据被覆盖或失效。这种情况可能是由于浏览器的刷新按钮、回退按钮或者页面自动刷新等引起的。 4.会话过期:如果会话过期,那么存储在HttpServletRequest对象的数据会被删除,导致request.setattribute方法失效。 为了避免request.setattribute失效,我们可以通过以下几点来保证数据的正确存储和获: 1.检查存储键和数据类型是否正确:在调用request.setattribute方法时,要注意存储键和数据类型是否匹配,可以使用System.out.println等打印控制台信息来检查存储结果。 2.正确使用请求重定向和请求转发:请求重定向和请求转发是保证多个请求之间正确设置请求属性的重要方式。使用请求重定向的时候,用request.getparameter()方法获请求参数并存储在URL,然后通过response.sendredirect()方法将请求转发到指定页面。使用请求转发的时候,可以使用request.setattribute()方法将请求属性设置在HttpServletRequest对象,并使用request.getattribute()方法获请求属性。 3.避免请求的重新发送:尽可能地避免使用浏览器的刷新、回退、去除缓存等操作,以及页面自动刷新功能。 4.检查会话过期时间:可以通过在web.xml文件设置会话过期时间来保证数据能够正确存储和获。如果会话过期,可以使用session.invalidate()方法来删除会话的所有数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值