page request session application四种范围

JSP的四种范围,分别为page,request,session,application可以用setAttribute("",""); getAttribute("","");

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

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

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

application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下所示:

       Object getAttribute(String name):从application中获取信息。

      void setAttribute(String name, Object value):向application作用域中设置信息。


session:HTTP会话开始到结束这段时间。Session 的作用范围为一段用户持续和服务器所连接的时间,但与服务 器断线 ,这个属性就无效。只要将数据存入session对象,数据的范围就为Session;

session是通过HttpSession接口实现的,它提供的主要方法如下所示。

Object HttpSession.getAttribute(String name):从session中获取信息。

void HttpSession.setAttribute(String name, Object value):向session中保存信息。

HttpSession HttpServletRequest.getSessio():获取当前请求所在的session的对象。

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

 

request:HTTP请求开始到结束这段时间。Request 的范围是指在一JSP 网页发出请求到另一个JSP 网页之间,随 这个属性就失效。设定Request 的范围时可利用request 对象中的setAttribute( )和getAttribute( );

一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。

Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的。

void setAttribute(String name, Object value):将对象value以name为名称保存到request作用域中。

Object getAttribute(String name):从request作用域中取得指定名字的信息。

JSP中的doGet()、doPost()方法的第一个参数就是HttpServletRequest对象,使用这个对象的 setAttribute()方法即可传递信息。

那么在设置好信息之后,要通过何种方式将信息传给其他的Servlet呢?这就要用到RequestDispatcher接口的forward()方法,通过它将请求转发给其他Servlet。

RequestDispatcher ServletContext.getRequestDispatcher(String path):取得Dispatcher以便转发。path为转发的目的Servlet。

void RequestDispatcher.forward(ServletRequest request, ServletResponse response):将request和response转发。

因此,只需要在当前Servlet中先通过setAttribute()方法设置相应的属性,然后使用forward()方法进行跳转,最后在跳转到的Servlet中通过使用getAttribute()方法即可实现信息传递。

 

page:当前页面从打开到关闭这段时间。标名pageContext.setAttribute("","");它只能在同一个页面中有效;

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对象。

 

我们看例3-11。

例3-11 通过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


(1)直接在web contain中进行对象的实例化。

内置对象

类型

作用域

pageContext

javax.servlet.jsp.pageContext

page

request

javax.servlet.http.HttpServletRequest

request

response

javax.servlet.http.HttpServletResponse

page

session

javax.servlet.http.HttpSession

session

application

javax.servlet.ServletContext

application

config

javax.servlet.ServletConfig

page

out

java.servlet.jsp.JspWriter

page

page

java.lang.Object

page

exception

java.lang.Throwable

page

(2)jsp内置对象分类

servlet有关的隐含对象:pageconfig

input/output有关的隐含对象:outrequestresponse

jsp执行时有关的context的隐含对象:sessionapplicationpageContext

error有关的隐含对象:exception

(3)属性的设置和取得

设置属性:public  void  setAttribute(String  nameObject.value)

取得属性:public  void  getAttribute(String  name)

(4)四种属性保存范围

在一个页面范围内:page

在一次服务器请求范围内:request

在一次会话范围内:session

在一个应用服务器范围内:application

(5)page范围

Page范围通过PageContext对象来设置,将属性保存在一次请求范围之内,必须使用服务器端跳转<jspforward/>

(6)session范围

只保留一个用户的信息

(7)application范围

所有的用户都可以取得此信息,此信息在整个服务器上被保留。Application属性范围值,只要设置一次,则所有的网页窗口都可以取得数据。

Application,sessionrequest都需要跨多个页,属性保存时内存开销大。如果能使用request就不适用session,能使用session的就不要使用application

(8)pageContext默认情况下表示一个页面的保存范围

public  void  setAttribute(String  name,Object  valueint  scope)

public static final int APPLICATION_SCOPE:application范围

public static final int SESSION_SCOPE:session范围

public static final int REQUEST_SCOPE:request范围

public static final int PAGE_SCOPE:page范围

四种属性范围都是依靠pageContext展开的,但是在开发中,往往使用sessionrequest范围

 session对象

(1)session功能

    Session对象主要用于保存用户的各种信息,直到它的生命周期超过或被人为释放掉为止,可以通过session对象来判断此用户是否是合法用户。

    Session对象是javax.Servlet.http.HttpSession接口的实例化对象,session属于http协议范畴之内的对象,所以只有唯一http包下有此接口,没有任何继承关系,用户只要一连接到服务器,则立刻分配一个session给用户。

(2)主要方法

session.getID():服务器上通过session来分别不同的用户,sessionID:任何链接到服务器上的用户,服务器都会为之分配唯一的一个不会重复的sessionID。由服务器统一管理,人为不能控制。

session.getId().length():id的长度为32

session.isNew():判断是否是新的用户

session.invalidate():使session失效

session.getCreationTime():得到session的创建时间,返回long类型,通过Date得到时间

session.getLastAccessedTime():得到最后一次操作时间,返回long类型

实例:

<%@page contentType="text/html;charset=gb2312"%>

<%@page import="java.util.*"%>

<%

       long l = session.getCreationTime() ;

       long l2 = session.getLastAccessedTime() ;

%>

<h1>session CREATE : <%=new Date(l)%></h1>

<h1>session last access: <%=new Date(l2)%></h1>

<h1><%=(l2-l)/1000%></h1>

假如需要求出用户在线时间,使用以下公式:最后操作时间创建的时间

(3)session属性的设置

session.setAttribute(String  name,Object  value)

session.getAttribute(String  name)

session.removeAttribute(String  name)

(4)两种写法的区别

    if(name.equals("mldn")&&pass.equals("password")):假如其中的namepass没有被初始化,那么在执行此句子的时候会出现nullpointexception

    if("mldn".equals(name)&&"password".equals(pass)):如果使用该写法则不会出现错误。

(5)session用法:验证用户是否登陆。

(6)session与cookie

    Session和cookie用于跨网页共享数据。Session记录独有的个人信息,在不同页面中传递,使用setAttributegetAttribute方法;Cookie保存于客户端,供浏览器与web服务器互通数据用的纯文字文件,当ie执行的时候会在计算机中产生一个cookieSessioncookie更安全,sessioncookie更占用资源,session使用了cookie的机制,如果cookie被禁用,则session也无法使用。

application与config对象

(1)application简介

    Application对象主要的作用就是保存公共信息,属于javaxServletServletContext,此工作目录的路径不是固定的,有可能此工作目录在c盘上或是在d盘得到的工作目录的真实路径。Application是在整个服务器中保持的只有一个实例的对象。

(2)属性操作: setAttribute(),getAttribute()removeAttribute()

(3)真实路径: application.getRealPath(String path),其中String path"/"。在实际使用中用getServletContext()方法代替application。格式如下:

    getServletContext().getRealPath("/")

    this.getServletContext.getRealPath("/")

(4)Jsp安全性Config对象

(a) 在j2ee中安全性体现在工作目录的WEB-INF文件夹,页面保存在此文件夹下,外面无法发现此文件夹内的文件,如果要使此文件夹内的文件能被用户访问,则修改WEB-INF文件夹下存在的web.xml文件,web.xml文件属于整个web站点的配置文件。

<……mapping  start>

<servlet>

   <servlet-name></servlet-name>

   <jsp-file></jsp-file>

   <init-param>

         <param-name></param-name>

         <param-value></param-value>

   </init-param>

</servlet>

<servlet-mapping>

         <servlet-name></servlet-name>

         <url-pattern>/浏览器中输入的地址</url-pattern>

</servlet-mapping>

<……mapping  end>

修改web.xml之后重启服务器。

(b)config对象

    Config对象一般用来取得服务器的初始化配置参数,若要使用此对象应在WEB-INF/web.xml之中配置。Config对象在javax.Servlet.servletConfig中取得初始化参数的方法:

       public string getInitParameter(String name)

通过此种功能,可以将数据库链接的一些信息写在配置文件之中,下面两种方法类似,是取得全部配置参数的:

   public Enumeration getInitParameterNames()

       request.getParameterNames()




1、区别:

1.page当前页面有效。在一个jsp页面里有效

2.request 指一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中在这个过程中可以使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。

3.Session用户全局变量,在整个会话期间都有效。只要页面不关闭就一直有效(或者直到用户一直未活动导致会话过期,默认session过期时间为30分钟,或调用HttpSession的invalidate()方法)。存放在HttpSession对象中 

4.application是程序全局变量,对每个用户每个页面都有效。存放在ServletContext对象中。它的存活时间是最长的,如果不进行手工删除,它们就一直可以使用 

总结:当数据只需要在下一个forward有用时,用request就够了;
         若数据不只是在下一个forward有用时,就用session。
         上下文,环境信息之类的,用application。

2、如何使用?

page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,它们就不见了。  
request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。  
session的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。  
application里的变量一直在累加,除非你重启tomcat,否则它会一直变大。  
而作用域规定的是变量的有效期限。  

      如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。 从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。  

      如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。 

     如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。 
所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。 

      如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。  
     与上述三个不同的是,application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。这在其他scope中都是不会发生的,page, request, session都是完全隔离的,无论如何修改都不会影响其他人的数据。

3、书上解释

  此处只摘录重要语句:

  page:用户请求的当前页面;

  Request:用户请求访问的当前组件,以及和当前web组件共享同一用户请求的web组件。如:被请求的jsp页面和该页面用<include>指令包含的页面以及<forward>标记包含的其它jsp页面; 

  Session同一个http会话中的web组件共享它

  Application:整个web应用的所用web组件共享它。

 3.1举个例子说明

     一个网站MyWebSite,其包含7个jsp页面,分别为master.jsp、top.jsp、main.jsp、foot.jsp、login.jsp、success.jsp和news.jsp。master.jsp页面通过<include>指令包含top.jsp、main.jsp、foot.jsp三个页面,当用户通过login.jsp登录成功后,进入success.jsp页面然后通过此页面的<forward>标签跳转到master.jsp页面中。

    我们在success.jsp页面中加入如下代码(此处用到jstl标签) 

?
1
< span style = "font-family: 微软雅黑, 'Microsoft YaHei';" >< c:set value = "aaa" var = "test1" scope=”page” />< br >< c:set value = "aaa" var = "test2" scope=”request” />< br >< c:set value = "aaa" var = "test3" scope=”session” />< br >< c:set value = "aaa" var = "test4" scope=”application” />< br >< br >< jsp:forward page=”master.jsp”/ >这里一一说明< br ></ span >

1.变量 test1 只在success.jsp内有效;
2.变量 test2  在success.jsp、master.jsp、top.jsp、main.jsp、foot.jsp中有效;
3.变量 test3 在7个页面中都有效(包括login.jsp和news.jsp);
4.变量 test4 在整个网站,当前也就是7个页面中都有效(包括login.jsp和news.jsp)。

Test3和test4有效范围一样,有什么区别呢?

      说明一点,假如此时又有另一个用户访问master.jsp页面,那么test3相对于这个用户来说就无效,而test4却是有效的。或者当第一个登录的用户关闭浏览器后,再重新访问master.jsp时,test3就无效,而test4却有效。


  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值