天天看点

JSP中的四种属性范围(重点)

       所谓的属性范围,就是指一个对象可以跨多少个JSP页面之后可以继续使用。

       在整个JAVA WEB中属性操作使用如下的方法:

              · 设置属性:public void setAttribute(String name,Object attribute)

              · 取得属性:public Object getAttribute(String name)

              · 删除属性:public Object removeAttribute(String name)

       在JSP中有以下四个对象都支持以上的三个方法:

              · page(pageContext)

              · request

              · session

              · application

       在一个JSP页面上设置的属性只能在一个页面取得,跳转到其他页面则此属性消失。

<b>PageScopeDemo01.jsp</b><b>:</b>

&lt;%@page contentType="text/html;charset=GBK"%&gt;

&lt;%@page import="java.util.*"%&gt;

&lt;%

         // 设置两个属性

         pageContext.setAttribute("uname","HELLO") ;

         pageContext.setAttribute("udate",new Date()) ;

         // 取得属性

         String name = (String)pageContext.getAttribute("uname") ;

         Date date = (Date)pageContext.getAttribute("udate") ;

%&gt;

&lt;h1&gt;name --&gt; &lt;%=name%&gt;&lt;/h1&gt;

&lt;h1&gt;date --&gt; &lt;%=date%&gt;&lt;/h1&gt;

       当前页可以取得所设置的属性,下面对页面进行修改,让其完成一此跳转。

<b>PageScopeDemo02.jsp</b><b>:</b>

&lt;jsp:forward page="PageScopeDemo03.jsp"/&gt;

<b>PageScopeDemo03.jsp</b><b>:</b>

       证明:一个页面上设置的属性,只能在本页面中取得。如果现在希望可以在跳转页中取得,则可以扩大范围到request范围上去。

       request可以把属性保存在一次服务器跳转范围之中。

<b>RequestScopeDemo01.jsp</b><b>:</b>

         request.setAttribute("uname","HELLO") ;

         request.setAttribute("udate",new Date()) ;

<b>&lt;jsp:forward page="RequestScopeDemo02.jsp"/&gt;</b>

<b>RequestScopeDemo02.jsp</b><b>:</b>

         String name = (String)request.getAttribute("uname") ;

         Date date = (Date)request.getAttribute("udate") ;

但是,需要注意的是,如果使用了下面的跳转形式,则不能够取得:

<b>RequestScopeDemo03.jsp</b><b>:</b>

<b>&lt;a href="RequestScopeDemo02.jsp"&gt;RequestScopeDemo02.jsp&lt;/a&gt;</b>

       发现以上程序执行之后,地址栏改变了,但是设置的属性也消失了。

       如果现在希望无论怎样跳转,属性都可以被保存下来,则就要扩大到session范围

       session属性范围无论页面怎样跳转,都可以保存下来,但是只针对于同一个浏览器打开的相关页面。

<b>SessionScopeDemo01.jsp</b><b>:</b>

         session.setAttribute("uname","HELLO") ;

         session.setAttribute("udate",new Date()) ;

&lt;a href="SessionScopeDemo02.jsp"&gt;SessionScopeDemo02.jsp&lt;/a&gt;

<b>SessionScopeDemo02.jsp</b><b>:</b>

         String name = (String)session.getAttribute("uname") ;

         Date date = (Date)session.getAttribute("udate") ;

       可以把每一个用户理解为一个session。如果现在希望所有的用户都可以看见,则就可以继续扩大范围 —— application范围。

       application范围,是把属性设置在整个服务器上,所有的用户都可以进行访问。

<b>ApplicationScopeDemo01.jsp</b><b>:</b>

         application.setAttribute("uname","HELLO") ;

         application.setAttribute("udate",new Date()) ;

<b>ApplicationScopeDemo02.jsp</b><b>:</b>

         String name = (String)application.getAttribute("uname") ;

         Date date = (Date)application.getAttribute("udate") ;

       如果服务器一关闭,则所有的application属性都消失,属性保存在服务器之上,如果此属性保存的内容过多,则肯定会直接影响到服务器的性能。所以一般尽可能少设置application属性。

       JSP中如果要想设置一个page范围的属性则一定使用pageContext对象,实际上对于整个JSP代码,所有的四种属性范围都是可以通过pageContext对象进行设置的,因为在此对象中的设置属性方法有两个:

       · public void setAttribute(String name,Object attribute) à 设置的属性默认为page范围

· public void setAttribute(String name,Object o,int scope) à 可以指定属性的范围

       |- 在PageContext类中提供了以下几个常量:

              |- 表示page范围:public static final int PAGE_SCOPE

              |- 表示request范围:public static final int REQUEST_SCOPE

              |- 表示session范围:public static final int SESSION_SCOPE

              |- 表示application范围:public static final int APPLICATION_SCOPE

下面通过pageContext对象设置一个request范围的属性

<b>RequestScopeDemo04.jsp</b><b>:</b>

         pageContext.setAttribute("uname","HELLO",PageContext.REQUEST_SCOPE) ;

         pageContext.setAttribute("udate",new Date(),PageContext.REQUEST_SCOPE) ;

&lt;jsp:forward page="RequestScopeDemo02.jsp"/&gt;

使用的原则:

       · 因为四种属性范围的保存时间不同,所以占用内存的时间也就不同了,能使用request就不要使用session,一般情况下,request和session两个属性范围使用的频率是最高的。

本文转自 李兴华 51CTO博客,原文链接:http://blog.51cto.com/lixinghua/101383,如需转载请自行联系原作者