深入分析JavaWeb Item16 -- jsp 四大域(属性)范围

jsp里面有四大域,作用域从小到大分别是page域,request域,session域,application(servletContext)域,域也可以称为属性范围。所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围。

一、JSP属性范围

  JSP中提供了四种属性范围,四种属性范围分别指以下四种:

  • page域——当前页:一个属性只能在一个页面中取得,跳转到其他页面无法取得
  • request域——一次服务器请求:一个页面中设置的属性,只要经过了服务器跳转,则跳转之后的页面可以继续取得。
  • session域——一次会话:一个用户设置的内容,只要是与此用户相关的页面都可以访问(一个会话表示一个人,这个人设置的东西只要这个人不走,就依然有效)
  • application——上下文中:在整个服务器上设置的属性,所有人都可以访问

二、属性的操作方法

  既然JSP中提供了四种属性范围,则四种属性范围中都将包含以下的属性操作方法。

  属性的操作无外乎就是增加、取得和删除这个几个操作。

  单词Attribute的意思是“属性”,setAttribute(String name,Object value)从单词的组合来看就可以知道是这个方法的是设置属性,设置属性的名字和属性的值,名字(name)为String类型,值(value)为Object类型,由于值为Object类型,这表示可以设置任意类型的数据作为值,因为所有的类都是从Object类型继承而来。因此设置属性值的时候可以是任意类型的数据。getAttribute(String name)方法是根据属性的名字取得属性,removeAttribute(String name)方法是根据属性的名字删除属性。

三、JSP四种属性范围的具体介绍

3.1、page属性范围(pageContext)

  page属性范围相对好理解一些:在一个页面设置的属性,跳转到其他页面就无法访问了。但是在使用page属性范围的时候必须注意的是,虽然习惯上将页面范围的属性称为page范围,但是实际上操作的时候是使用pageContext内置对象完成的。

pageContext属性范围操作流程图

    

  pageContext从字面上的定义,可以发现,是表示一个页面(page)的上下文(Context),可以表示一个页面中的所有内容。

  从操作流程图来看,在第一个页面设置的属性经过服务器端跳转到第二个页面以后,在第二个页面是无法取得在第一个页面中设置的属性的,就好比现在坐着的桌子上有一支笔,但一旦离开了这张桌子,坐到别的桌子上时,笔就没有了。

  下面通过代码来观察此范围的属性

范例:pageContextDemo01.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 refName = (String)pageContext.getAttribute("name");
    //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
    Date refDate = (Date)pageContext.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

程序运行结果如下:

  

  这说明了在本页设置的pageContext范围属性在本页确实可以取得,下面使用跳转语句,观察跳转之后是否还可以取得属性。

范例:pageScopeDemo02.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    pageContext.setAttribute("name","孤傲苍狼");
    pageContext.setAttribute("date",new Date());
%>
<%--使用jsp:forward标签进行服务器端跳转--%>
<jsp:forward page="/pageScopeDemo03.jsp" />

范例:pageScopeDemo03.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    pageContext.setAttribute("name","孤傲苍狼");
    pageContext.setAttribute("date",new Date());
%>
<%--使用jsp:forward标签进行服务器端跳转--%>
<jsp:forward page="/pageScopeDemo03.jsp" />

  在以上程序中的pageScopeDemo02.jsp只是设置了两个属性,跳转到pageScopeDemo03.jsp之后再在pageScopeDemo03.jsp中取在pageScopeDemo02.jsp设置的page属性。此时,运行结果如下:

  

  使用了服务器端跳转,但是发现内容并不能取得,证明page范围的属性只能在本页中取得,跳转到其他页面之中不能取得。如果现在希望跳转到其他页面之中,依然可以取得,则可以扩大属性范围,使用request属性范围即可。

3.2、request属性范围

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

  

范例:requestScopeDemo01.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    request.setAttribute("name","孤傲苍狼");
    request.setAttribute("date",new Date());
%>
<%--使用jsp:forward标签进行服务器端跳转--%>
<jsp:forward page="/requestScopeDemo02.jsp" />

范例:requestScopeDemo02.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    //取得requestScopdemo01.jsp设置的属性
    String refName = (String)request.getAttribute("name");
    Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

运行结果如下:

  

  从运行结果来看,程序跳转了,但是与page范围相比,内容可以向下继续传递,即在第一个页面设置的属性跳转到第二个页面后在第二个页面中依然可以取得第一个页面设置的属性。

  如果现在有第三个页面了,则也可以继续向后传递

范例:修改requestScopeDemo02.jsp

 <%@page contentType="text/html;charset=UTF-8"%>
 <%@page import="java.util.*"%>
 <%--使用jsp:forward标签进行服务器端跳转--%>
 <jsp:forward page="/requestScopeDemo03.jsp" />

范例:requestScopeDemo03.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    //取得requestScopdemo01.jsp设置的属性
    String refName = (String)request.getAttribute("name");
    Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

  以上的结果依然可以访问,但是如果,此时使用了超链接的方式传递的话,则属性是无法向下继续传递的。

范例:修改requestScopeDemo03.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    //取得requestScopdemo01.jsp设置的属性
    String refName = (String)request.getAttribute("name");
    Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
<h1>
<%--使用超链接的形式跳转,这是客户端跳转,URL地址会改变--%>
<a href="${pageContext.request.contextPath}/requestScopeDemo04.jsp">跳转到requestScopeDemo04.jsp</a>
</h1>

  此时使用了超链接跳转,一旦跳转之后,地址栏改变,所以此种跳转也可以称为客户端跳转。

requestScopeDemo04.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    //取得requestScopdemo01.jsp设置的属性
    String refName = (String)request.getAttribute("name");
    Date refDate = (Date)request.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

运行结果:

  requestScopeDemo04.jsp页面显示的结果是null。这说明了在requestScopeDemo01.jsp这个页面设置的属性经过超链接这种客户端跳转到别的页面时别的页面是无法取得requestScopeDemo01.jsp中设置的属性的。

  如果还想进一步扩大属性范围,则可以使用session范围属性

3.3、session属性范围

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

 

  在第一个页面上设置的属性,跳转(服务器跳转/客户端跳转)到其他页面之后,其他的页面依然可以取得第一个页面上设置的属性。

下面通过代码来观察session属性范围

范例:sessionScopeDemo01.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    //此时设置的属性只能够在与本页相关的任何页面中取得
    session.setAttribute("name","孤傲苍狼");  //设置属性
    session.setAttribute("date",new Date());
%>
<%--使用服务器端跳转--%>
<jsp:forward page="/sessionScopeDemo02.jsp"/>

  这里使用的是服务器端跳转

sessionScopeDemo02.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    String refName = (String)session.getAttribute("name");
    Date refDate = (Date)session.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
<%--使用超链接这种客户端跳转--%>
<h1><a href="${pageContext.request.contextPath}/sessionScopeDemo03.jsp">sessionScopeDemo03</a></h1>

  这里使用的是超链接这种客户端跳转

  运行程序sessionScopeDemo01.jsp结果如下所示:

  

sessionScopeDemo03.jsp

<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.*"%>
<%
    String refName = (String)session.getAttribute("name");
    Date refDate = (Date)session.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

  点击超链接sessionScopeDemo03,跳转到了sessionScopeDemo03.jsp这个页面,此时程序的运行结果如下:

  

  这说明了即使是采用客户端跳转,在别的页面依然可以取得第一个页面中设置的session属性。但是,如果,此时新开了一个浏览器,则sessionScopeDemo03.jsp肯定无法取得sessionScopeDemo01.jsp中设置的session对象的属性,因为session只是保留了一个人的信息。

  如果一个属性想让所有的用户都可以访问,则可以使用最后一种属性范围:application范围。

3.4、application属性范围

  

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

下面通过代码来观察application属性范围

范例:applicationScopeDemo01.jsp

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.util.*"%>
<%
    //此时设置的属性任何用户都可以取得
    application.setAttribute("name","孤傲苍狼");  //设置属性
    application.setAttribute("date",new Date());
%>
<h1><a href="${pageContext.request.contextPath}/applicationScopeDemo02.jsp">applicationScopeDemo02</a></h1>

范例:applicationScopeDemo02.jsp

<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.util.*"%>
<%
    String refName = (String)application.getAttribute("name");
    Date refDate = (Date)application.getAttribute("date");
%>
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>

观察页面的运行效果:

  

  开启多个浏览器窗口,运行applicationScopeDemo02.jsp时,都可以显示出上图所示的结果,因为属性范围设置在了服务器中,所以只要是连接到此服务器的任意用户都可以取得此属性,当然,如果服务器关闭的话,则此属性肯定消失。

  如把Tomcat服务器先关闭后再重新启动,打开浏览器窗口运行applicationScopeDemo02.jsp时,得到的结果如下图所示:

  

  注意:如果在服务器上设置了过多的application属性,则会影响到服务器的性能。

3.5、关于pageContext属性范围的进一步补充

  之前所讲解的四种属性范围,实际上都是通过pageContext属性范围设置上的。打开pageContext所在的说明文档。

  

  PageContext类继承了JspContext类,在JspContext类中定义了setAttribute方法,如下:

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

  此方法中存在一个scope的整型变量,此变量就表示一个属性的保存范围。

  

  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_SCOPEAPPLICATION_SCOPE时,则表示setAttribute()方法设置的就是session属性范围和application属性范围。

下面通过代码来观察此四种属性范围常量的作用,以:request为例

范例:pageScopeDemo04.jsp

<%@page contentType="text/html;charset=GBK"%>
<%@page import="java.util.*"%>
<%
    pageContext.setAttribute("name","孤傲苍狼",PageContext.REQUEST_SCOPE);  //设置属性,并指明属性范围
    pageContext.setAttribute("date",new Date(),PageContext.REQUEST_SCOPE); //设置属性,并指明属性范围
%>
<jsp:forward page="/pageScopeDemo05.jsp"/>

pageScopeDemo05.jsp

<%@page contentType="text/html;charset=GBK"%>
<%@page import="java.util.*"%>
<%
    //使用request对象获取属性
    String refName = (String)request.getAttribute("name");
    Date refDate = (Date)request.getAttribute("date");
    //也可以使用pageContext对象获取属性,只要在获取时指明对象的属性范围即可
    String refName2 = (String)pageContext.getAttribute("name", PageContext.REQUEST_SCOPE);
    Date refDate2 = (Date)pageContext.getAttribute("date", PageContext.REQUEST_SCOPE);
%>
使用request对象获取属性:
<h1>姓名:<%=refName%></h1>
<h1>日期:<%=refDate%></h1>
使用pageContext对象获取属性:
<h1>姓名:<%=refName2%></h1>
<h1>日期:<%=refDate2%></h1>

运行结果:

  

  从运行结果可以看到:在pageScopeDemo04.jsp使用的是pageContext对象调用setAttribute()方法设置的属性范围是request的属性范围,因此在调用此方法时,把一个int类型的scope范围常量REQUEST_SCOPE传递了进来,这个REQUEST_SCOPE属性范围常量的作用就是告诉pageContext对象现在要设置的属性范围是request的属性范围,所以pageScopeDemo05.jsp这个页面中可以直接使用request.getAttribute();方法获取在pageScopeDemo04.jsp设置的属性。

四、jsp四种属性范围的使用场合

  • 1、request:如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的。
  • 2、session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐。
  • 3、application(servletContext):如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在application(servletContext)域中,像聊天数据。
时间: 2024-10-24 03:09:07

深入分析JavaWeb Item16 -- jsp 四大域(属性)范围的相关文章

JSP四大域对象与九大内置对象

什么是内置对象? 在jsp开发中会频繁使用到一些对象,如 ServletContext.HttpSession.PageContext 等: 如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创建就会特别的繁琐. SUN公司因此在设计jsp时,在jsp页面加载完毕之后会创建好了这些对象,你只需要使用相应的对象调用相应的方法即可. 这些系统创建好的对象就叫做内置对象. 在servlet程序中,如果开发者希望使用session对象,必须通过request.getSession()来得到ses

jsp四大域对象和九大内置对象

四大域对象 request page context   page域 session    session域 application  context域 九大内置对象 resuest response session out page context   用于存取其他隐含对象  如request response application 等 page exception application  服务器启动时就创建了 直到服务器关闭 config  取的服务器所有配置信息 原文地址:https:

深入分析JavaWeb Item13 -- jsp指令具体解释

一.JSP指令简单介绍 JSP指令(directive)是为JSP引擎而设计的.它们并不直接产生不论什么可见输出,而仅仅是告诉引擎怎样处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: page指令 Include指令 taglib指令 JSP指令的基本的语法格式:<%@ 指令 属性名="值" %> 比如: <%@ page contentType="text/html;charset=gb2312"%> 假设一个指令有多

深入分析JavaWeb Item13 -- jsp指令详解

一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: page指令 Include指令 taglib指令 JSP指令的基本语法格式:<%@ 指令 属性名="值" %> 例如: <%@ page contentType="text/html;charset=gb2312"%> 如果一个指令有多个属性,这多

深入分析JavaWeb Item15 -- jsp标签

一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 jsp的常用标签有以下三个 <jsp:include>标签 <jsp:forward>标签 <jsp:param>标签 2.1.<jsp:include>标签 <jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容

jsp四大域对象

域对象的作用:保存数据,获取数据,共享数据 page:当前jsp页面有效 生命周期:jsp页面被执行  --->  jsp页面执行完毕 request:同一次请求有效 生命周期:用户发送一次请求  --->  服务器处理请求返回响应  --->  请求结束 session:同一次会话有效 生命周期:用户打开浏览器,创建session(生命周期开始)--->  session超时或者被声明失效或浏览器被关闭--->生命周期结束 application:当前web应用有效 web

JavaWeb之Jsp/EL(八)

JSP(Java Server Page) 1. jsp简单介绍 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术 JSP这门技术的最大的特点在于,写jsp就像在写html,但: 它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据 相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排

JSP--JSP语法--指令---九大隐式对象--四大域对象--JSP内置标签--JavaBean的动作元素--MVC三层架构

一.JSP 原理:JSP其实就是一个servlet. Servlet负责业务逻辑处理,JSP只负责显示.开发中,JSP中不能有一行JAVA代码 二.JSP语法 1. JSP模板元素:JSP中HTML标签及文本 2. 脚本:写JAVA代码,<% %> 3. 表达式:用于输出变量及表达式,<%= %> 4. 注释:分为三种 a) <!-- --> :JSP翻译成Servlet时也将进行翻译.页面中也有. b) <% /*.......*/ %>:JSP翻译成Se

java中jsp的九大隐式对象及web四大域

JSP运行原理和九大隐式对象 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用. 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响. JSP引擎在调用JSP对应的_jspServlet时,会传