JSP四种常用范围对象以及作用域详解

2022-11-30 17:23:59 浏览数 (2)

pageContext:数据只在当前自身的页面有效; request:数据在一次请求中有效; session:数据在一次会话中有效;若是新开浏览器,则无效; application:数据在当前Wed项目有效,可供所有用户共享。

下面结合具体例子来说明: 【Index.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<% pageContext.setAttribute("p","pagestr");
    request.setAttribute("r","requeststr");
    session.setAttribute("s","sessionstr");
    application.setAttribute("a","applicationstr");%>
<%out.print(pageContext.getAttribute("p") "<br/>");
    out.print(request.getAttribute("r") "<br/>");
    out.print(session.getAttribute("s") "<br/>");
    out.print(application.getAttribute("a"));%>

【结果】

(1)pageContext作用域 因为pageContext对象中的属性的作用域是“在当前自身的页面内有效”,而以上均在同一个页面中增加或输出,所以能够正常显示。但将上面的页面做修改,将属性添加放在one.jsp中执行,再通过请求转发跳转到two.jsp页面,并在6_2.jsp中显示属性的值。 【Index.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<% request.setAttribute("p","pagestr");  request.getRequestDispatcher("6_2.jsp").forward(request, response); %>

【6_2.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%=request.getAttribute("p") %>

【结果】

因为从index.jsp到6_2.jsp的跳转是“请求转发”,即仍然是同一次请求,而request的作用域范围就是“在一次请求中有效”。

但要注意,如果将上例的“请求转发”改为"重定向"或超链接形式的跳转,则不会再获取到数据,如下: 【Index.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<% request.setAttribute("p","pagestr");
   %><a href="6_2.jsp">点我跳转</a>

【6_2.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%=request.getAttribute("p") %>

【结果】

【点击跳转之后】

因为request的作用范围是“一次请求中有效”,而“重定向”或超链接形式的跳转,都是在跳转时重新发送了一次新的请求(重新去请求6_2.jsp),因此是获取不到数据的。 (3)session作用域 如果希望在增加属性之后,能够在跳转后的任何页面(无论是请求转发、重定向或超链接跳转),甚至是项目中任何一个页面都能获取到该属性值,就可以使用session的作用域来实现: 【Index.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<% session.setAttribute("p","pagestr");
response.sendRedirect("6_2.jsp");
%>

【6_2.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%=session.getAttribute("p") %>

【结果】

虽然“重定向”或超链接形式的跳转,会重新向服务器发送一次请求(重新去请求6_2.jsp),但仍然可以从session的作用域中获取到属性值。当然,如果通过请求转发实现的跳转,也能通过session获取到属性值。 此外,可重新打开同一个浏览器(相同浏览器),然后在新标签里直接输入并执行http://localhost:8080/_war_exploded/6_2.jsp (执行了http://localhost:8080/_war_exploded/index.jsp后),也能获取到数据。但如果换了一个浏览器(不同的浏览器),在直接输入http://localhost:8080/_war_exploded/6_2.jsp 并执行(在另一个浏览器执行了http://localhost:8080/_war_exploded/index.jsp后),结果:

也就是说,只要index.jsp中将属性添加到session后,凡是同一个浏览器都可以取到session中的该属性值;但如果换成其他浏览器,则就不能再在session中获取到该属性值了。 (4)application作用域 如果想实现这样一个功能“只要在一个页面中增加了属性,那么即使重新换一个浏览器,也要能访问到该属性值”,该如何实现?答案就是application的作用域。将上例修改: 【Index.jsp】

【6_2.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%=application.getAttribute("p") %>

【结果】

换一个浏览器输入http://localhost:8080/_war_exploded/6_2.jsp(在另一个浏览器执行http://localhost:8080/_war_exploded/index.jsp后)并执行,也能获取到数据:

只要运行过一次index.jsp后,无论是一个浏览器标签,或者是更换新的浏览器,直接再运行6_2.jsp都能获取到数据。即只要是通过application.setAttribute()设置的属性,那么任何浏览器的任何页面都可以获取到该属性值,但是如果将tomcat服务器关闭,则application中的属性值就全部消失了。

可以利用application作用域的这一特性,来实现一个网页计数器功能,任何的浏览器都能访问,并统计次数: 【Index.jsp】

代码语言:javascript复制
<%@page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%Integer count=(Integer)application.getAttribute("count");
if(count==null){
  count=1;
}else{
  count=count 1;
}
application.setAttribute("count",count);
out.print("亲~~您是第" application.getAttribute("count") "个访问本网页的用户^_^");%>

之后,无论是刷新当前页,还是打开一个浏览器标签,或者打开一个其他浏览器再次访问,每访问一次,访问次数就会累加一次。 【特别注意】 虽然四种作用域的大小依次是pageContext<request<session<application,但不能为了方便就随随便便使用范围大的范围对象,因为范围大造成的性能损耗就越大。因此,如果多个作用域都能完成相同的功能,一般会使用小的那个对象。

0 人点赞