page作用域:在一个页面范围内有效,通过pageContext对象访问
page作用域指本jsp页面的范围
pageContext.setAttribute
pageContext.getAttribute
作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。
testOne.jsp
<body>
<!--
在testOne.jsp页面中,调用pageContext对象的setAttribute()方法、
将一个String对象保存到page作用域,然后在本页面中调用pageContext对象的
getAttribute()方法可以访问到这个String对象,而在testTwo.jsp
页面中,也就是另一个page作用域中,则无法访问到该String对象,
显示是:testTwo:null,当然,这个结果是通过pageContext对象的include()
方法将testTwo.jsp的响应结果包含到testOne.jsp页面中的。
-->
<%
String name="page";
pageContext.setAttribute("name", name);
%>
<strong>
testOne:<%=pageContext.getAttribute("name")%>
</strong>
<%@ include file="testTwo.jsp" %>
<%
pageContext.include("testTwo.jsp");
%>
</body>
testTwo.jsp
<strong>
testTwo:<%=pageContext.getAttribute("name")%>
</strong>
request作用域:在一个服务器请求范围内有效,对应的作用域访问对象为request
request作用域内的对象则是与客户端的请求绑定在一起
作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。
testOne.jsp
<body>
<!--
在testOne.jsp页面中,通过RequestDispatcher对象的forward()方法转发至testTow.jsp,
属于一次请求,在同一个request作用域内,所有在testTwo.jsp 页面中可以访问到这个String对象
-->
<%
String name ="requset";
request.setAttribute("name", name);
request.getRequestDispatcher("testTwo.jsp").forward(request, response);
%>
</body>
testTwo.jsp
<strong>
testTwo:<%= request.getAttribute("name") %>
<!--结果显示: testTwo:requset -->
</strong>
session作用域:在一次会话范围内容有效,对应的作用域访问对象为session
session的作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。
testOne.jsp
<body>
<!-- 使用response对象将页面重定向至testTwo.jsp,在testTwo.jsp中能够读取到sessionName变量
,由此可见session作用域内的数据在会话有效期内都可以访问。使用response.sendRedirect()
重定向到另外一个页面时,相当于重新发起了一次请求,所以上一次请求中的reqName变量则随之失效
-->
<%
String req = "request";
String ses = "session";
request.setAttribute("reqName", req);
session.setAttribute("sessionName", ses);
response.sendRedirect("testTwo.jsp");
%>
</body>
testTwo.jsp
<strong>
request:<%= request.getAttribute("reqName") %>
session:<%= session.getAttribute("sessionName") %>
<!--结果是: request:null session:session -->
</strong>
application作用域:在一个应用服务器范围内有效,对应的作用域访问对象为application
作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。
testOne.jsp
<body>
<!-- 运行testOne.jsp
结果显示:
session:session
application:application
这时以一个新的会话开启另一个浏览器窗口,直接访问testTwo.jsp页面
结果显示:
session:null
application:application
session作用域针对当前会话,多个会话之间不能共享,所以无法读取sesName变量
。而application作用域针对整个应用,因而appName变量可以被再次读取到
(注:若重启Web应用,现有的application作用域失效)
-->
<%
String app="application";
String ses="session";
session.setAttribute("sesName", ses);
application.setAttribute("appName", app);
response.sendRedirect("testTwo.jsp");
%>
</body>
testTwo.jsp
<strong>
session:<%=session.getAttribute("sesName")%><br/>
application:<%= application.getAttribute("appName") %>
</strong>
testTwo.jsp