JSP四大作用域属性范围

 

JSP四大作用域分别为:page, request ,session, application 。

 

    第一个作用域是page,他只在当前页面有效,也就是用户请求的页面有效,当当前页面关闭或转到其他页面时,page对象将在响应回馈给客户端后释放。

    第二个作用域是request,他在当前请求中有效,request可以通过setAttribute()方法实现页面中的信息传递,也可以通过forward()方法进行页面间的跳转,需要注意的是request是转发不是重定向,转发相对于浏览器来说是透明的,也就是无论页面如何跳转,地址栏上显示的依旧是最初的地址。

    第三个作用域是session,他在当前回话中有效。当一个台电脑上的同一浏览器对服务器进行多次访问时,在这多次访问之间传递的信息就是session作用域的范围。它从浏览器发出第一个HTTP请求即可认为会话开始,但是会话结束的时间是不确定的,因为在浏览器关闭时并不会通知服务器,一般Tomcat设置的默认时间为120分钟,也可以通过setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前会话。

    第四个作用域是application,他在所有的应用程序中都有效,也就是当服务器开始到服务器结束这段时间,application作用域中存储的数据都是有效的,同样可以通过setAttribute赋值和getAttribute取值。 

 1.page的属性作用域

  page,它只在当前页面有效,也就是用户请求的页面有效。但是在使用page属性范围的时候必须注意的是,虽然习惯上将页面范围的属性称为page范围,但是实际上操作的时候是使用pageContext内置对象完成的。

通过这里建立一个maven的web项目。

在index.jsp页面:

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    //此时设置的属性只能够在本页中取得
    pageContext.setAttribute("name","哈哈哈哈");  //设置属性
    pageContext.setAttribute("date",new Date()); //设置属性
    //注意:这里设置的两个属性的名字分别为name和date,这两个是字符串类型的数据,但对应的属性值MLDN和new Date这个两个值却不是字符串类型,而是两个Object类型的数据。
%>
<%
    //取得设置的属性
    String name = (String)pageContext.getAttribute("name");
    //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
    Date date = (Date)pageContext.getAttribute("date");
%>
<h1>姓名:<%=name%></h1>
<h1>日期:<%=date%></h1>

运行结果:

 

页设置的pageContext范围属性在本页确实可以取得。

在index.jsp加上一句:

<jsp:forward page="WEB-INF/jsp/pageSecond.jsp" />
pageSecond.jsp页面如下:
<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    String name = (String)pageContext.getAttribute("name");
    Date date = (Date)pageContext.getAttribute("date");
%>
<h1>姓名:<%=name%></h1>
<h1>日期:<%=date%></h1>

结果:

 

 

 页面跳转之后,获取不到属性了。如果现在希望跳转到其他页面之中,依然可以取得,则可以扩大属性范围,使用request属性范围即可。

2.request属性作用域

request属性范围表示在一次服务器跳转中有效,只要是服务器跳转,则设置的request属性可以一直传递下去。

  

 index.jsp如下所示:

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    //此时设置的属性只能够在本页中取得
    request.setAttribute("name","哈哈哈哈");  //设置属性
    request.setAttribute("date",new Date()); //设置属性
    //注意:这里设置的两个属性的名字分别为name和date,这两个是字符串类型的数据,但对应的属性值MLDN和new Date这个两个值却不是字符串类型,而是两个Object类型的数据。
%>
<%
    //取得设置的属性
    String name = (String)request.getAttribute("name");
    //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
    Date date = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=name%></h1>
<h1>日期:<%=date%></h1>

结果如图:

 跳转到pageSecond.jsp之后,依然可以获得属性。不管多少个页面。

但是如果,此时使用了超链接的方式传递的话,则属性是无法向下继续传递的。

3.session属性作用域

session设置的属性不管如何跳转,都可以取得的。当然,session只针对一个用户

  

不管是采用页面跳转,还是超链接(相当于客户端跳转),在别的页面依然可以获取第一个页面的属性。但是新打开一个浏览器,则无法获取属性。

 4.application属性作用域

  因为application属性范围是在服务器上设置的一个属性,所以一旦设置之后任何用户都可以浏览到此属性。

 5.pageContext属性作用域的进一步补充

PageContext类继承了JspContext类,所以在PageContext类中实现了抽象的setAttribute方法:

public abstract void setAttribute(String name,Object value,int scope)

这个setAttribute()方法如果不写后面的int类型的scope参数,则此参数默认为PAGE_SCOPE,则此时setAttribute()方法设置的就是page属性范围,如果传递过来的int类型参数scope为REQUEST_SCOPE,则此时setAttribute()方法设置的就是request属性范围,同理,传递的scope参数为SESSION_SCOPE和APPLICATION_SCOPE时,则表示setAttribute()方法设置的就是session属性范围和application属性范围。

比如index.jsp:

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    //此时设置的属性只能够在本页中取得
    pageContext.setAttribute("name","哈哈哈哈",PageContext.REQUEST_SCOPE);  //设置属性
    pageContext.setAttribute("date",new Date(),PageContext.REQUEST_SCOPE); //设置属性
    //注意:这里设置的两个属性的名字分别为name和date,这两个是字符串类型的数据,但对应的属性值MLDN和new Date这个两个值却不是字符串类型,而是两个Object类型的数据。
%>
<%
    //取得设置的属性
    String name = (String)pageContext.getAttribute("name");
    //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
    Date date = (Date)pageContext.getAttribute("date");
%>
<jsp:forward page="WEB-INF/jsp/pageSecond.jsp" />
pageSecond.jsp:
<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    String name = (String)pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);
    Date date = (Date)pageContext.getAttribute("date",PageContext.REQUEST_SCOPE);
%>
<h1>姓名:<%=name%></h1>
<h1>日期:<%=date%></h1>

跳转之后依然可以获取属性,pageContext相当于request。

 

 

参考: 这里

posted @ 2018-08-22 11:23  何其小静  阅读(16311)  评论(0编辑  收藏  举报