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的结果一样。