四大作用域:application,session,request,page

首先要声明一点,所谓"作用域"就是"信息共享的范围",也就是说一个信息能够在多大的范围内有效。

Web交互的最基本单位为HTTP请求。每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话。

一、application

Application 的作用范围在服务器一开始执行服务,到服务器关闭为止Application 的范围最、停留的时间也最久,所以使用时要特别注意不然可能会造成服务器负载越来越重的情况。只要将数据存入application对象,数据的范围范围 (Scope) 就为Application。

具有application范围的对象被绑定到javax.servlet.ServletContext中。在Web应用程序运行期间,所有的页面都可以访问在这个范围内的对象。

application对象的主要方法:

1、 getAttribute(String name)     return Object     

2、 getAttributeNames()             return Enumeration

3、 getInitParameter(String name)

4、 getServletInfo()

5、 setAttribute(String name , Object object)

二、session  !!!
HTTP会话开始到结束这段时间。Session 的作用范围为一段用户持续和服务器所连接的时间,但与服务器断线,这个属性就无效了。

Session 的开始时刻比较容易判断,它从浏览器发出第一个HTTP请求即可认为会话开始。但结束时刻就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,但这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置。

具有session范围的对象被绑定到javax.servlet.http.HttpSession对象中。


Session对象的主要方法:

1、 getAttribute(String name) return Object

2、 getAttributeNames() return Enumeration

3、 getCreationTime() return long

4、 getId() return String

5、 getLastAccessedTime() return long

6、 getMaxInactiveInterval() return int

7、 removeAttribute(String name) void

8、 setAttribute(String name , java.lang.Object value) void 


三、requset !!!

HTTP请求开始到结束这段时间。Request 的范围是指在一JSP 网页发出请求到另一个JSP 网页之间,否则这个属性就失效。一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。
具有request范围的对象被绑定到javax.servlet.ServletRequest对象中。


要注意的是,因为请求对象对于每一个客户请求都是不同的,所以对于每一个新的请求,都要重新创建和删除这个范围内的对象。

request对象的主要方法:

1、 getParameter(String name) return String

2、 getParameterNames() return Enumeration

3、 getParameterValues(String name) return String[]


四、page

作用范围:当前页面从打开到关闭这段时间,它只能在同一个页面中有效。

具有page范围的对象被绑定到javax.servlet.jsp.PageContext对象中。


五、升级


request和page的生命周期都是短暂的,它们之间的区别:一个request可以包含多个page页(include,forward及filter)

为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。

要获取这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类,ActionContext是action执行的上下文,在ActionContext中保存了action执行所需的一组对象,包括parameters、request、session、application和locale等。
ActionContext类定义了如下方法,用于获取HttpServletRequest、HttpSession和ServletContext对应的Map对象。

public Object get(Object key)

ActionContext类没有提供类似getRequest()这样的方法来获取封装了HttpServletRequest的Map对象。要得到请求Map对象,你需要为get()方法传递参数“request”。

public Map getSession()

获取封装了HttpSession的Map对象。

public Map getApplication()

获取封装了ServletContext的Map对象。

例:通过ActionContext来获取request、session和application对象的LoginAction1

package action;

ActionContext context =ActionContext.getContext();

Map request =(Map)context.get("request");

Map session = context.getSession();

Map application = context.getApplication();

request.put("greeting", "欢迎您来到程序员之家");

session.put("user", user);

在成功页面中,可以使用JSP内置的表达式语言来访问request、session。、

下面我们通过几个简单的例子,来看一下这4种范围对象的应用。

1.测试page范围

test1.jsp

<%

pageContext.setAttribute("name","zhangsan");

out.println("test1.jsp: ");

out.println(pageContext.getAttribute("name"));

out.println("<p>");

pageContext.include("test2.jsp");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(pageContext.getAttribute("name"));

%>

访问test1.jsp,将看到如下的输出:

test1.jsp: zhangsan

test2.jsp: null

说明保存在pageContext对象中的属性具有page范围,只能在同一个页面中被访问。

2.测试request范围

修改test1.jsp和test2.jsp,如下所示。

test1.jsp

<%

request.setAttribute("name","zhangsan");

out.println("test1.jsp: ");

out.println(request.getAttribute("name"));

out.println("<p>");

pageContext.include("test2.jsp");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(request.getAttribute("name"));

%>

访问test1.jsp,将看到如下的输出:

test1.jsp: zhangsan

test2.jsp: zhangsan

说明保存在request对象中的属性具有request范围,在请求对象存活期间,可以访问这个范围内的对象。

将pageContext.include("test2.jsp"); 这一句注释起来,先访问test1.jsp,再访test2.jsp,可以看到如下输出:

test2.jsp: null

这是因为客户端开始了一个新的请求。

3.测试session范围

修改test1.jsp和test2.jsp,如下所示。

test1.jsp

<%

session.setAttribute("name","zhangsan");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(session.getAttribute("name"));

%>

先访问test1.jsp,然后在同一个浏览器窗口中访问test2.jsp,可以看到如下输出:

test2.jsp: zhangsan

说明保存在session对象中的属性具有session范围,在会话期间,可以访问这个范围内的对象。

如果我们在访问完test1.jsp后,关闭浏览器,重新打开浏览器窗口,访问test2.jsp,将看到如下输出:

test2.jsp: null

这是因为客户端与服务器开始了一次新的会话。

4.测试application范围

修改test1.jsp和test2.jsp,如下所示。

test1.jsp

<%

application.setAttribute("name","zhangsan");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(application.getAttribute("name"));

%>

先访问test1.jsp,然后关闭浏览器,再打开浏览器窗口,访问test2.jsp,可以看到如下输出:

test2.jsp: zhangsan

说明保存在application对象中的属性具有application范围,在Web应用程序运行期间,都可以访问这个范围内的对象。

————————————————
版权声明:本文为CSDN博主「陨落的轨迹」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013938465/java/article/details/48712137

原文地址:https://www.cnblogs.com/yhtboke/p/12929579.html