zoukankan      html  css  js  c++  java
  • JSP 属性范围

    参考文献:http://www.cnblogs.com/xdp-gacl/p/3781056.html

    一、属性范围

      所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围。

      JSP中提供了四种属性范围:

      • pageContext,当前页,一个属性只能在一个页面中取得,跳转到其他页面无法取得
      • request,一个页面中设置的属性在经过了服务器跳转后的页面可以继续取得。
      • session,一个用户设置的内容,只要是与此用户相关的页面都可以访问
      • application,在整个服务器上设置的属性,所有人都可以访问

    二、属性操作方法

    四种属性范围中都包含以下的属性操作方法:

    No.

    方法

    描述

    1

    public void setAttribute(String name,Object value)

    设置属性

    2

    public object getAttribute(String name)

    取得属性

    3

    public void removeAttribute(String name)

    删除属性

    三、具体四种属性范围

    1. pageContext,只在当前页有效
      <%@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>
      View Code
    2. request,在服务端转发(forward)过程经历的各页面中都有效
      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> <h1> <%--使用超链接的形式跳转,这是客户端跳转,URL地址会改变--%> <a href="${pageContext.request.contextPath}/requestScopeDemo03.jsp">跳转到requestScopeDemo04.jsp</a> </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>

      对于上面三个页面,在服务端将页面1 forward到页面2,两者都有refName、refDate属性;页面2通过超链接点击转到页面3,页面3得不到这两个属性值。

    3. session,对于一个用户的所有页面有效
      <%@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>
    4. application,对于所有用户的所有页面有效
      <%@ 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>

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

    四、关于pageContext属性范围

    1、四种属性范围实现原理

      之前所讲解的四种属性范围,实际上都是通过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_SCOPE和APPLICATION_SCOPE时,则表示setAttribute()方法设置的就是session属性范围和application属性范围。

    2、示例

      下面通过代码来观察此四种属性范围常量的作用,以: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>

    五、四种属性范围使用场合

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

  • 相关阅读:
    hdu 5446 Unknown Treasure lucas和CRT
    Hdu 5444 Elven Postman dfs
    hdu 5443 The Water Problem 线段树
    hdu 5442 Favorite Donut 后缀数组
    hdu 5441 Travel 离线带权并查集
    hdu 5438 Ponds 拓扑排序
    hdu 5437 Alisha’s Party 优先队列
    HDU 5433 Xiao Ming climbing dp
    hdu 5432 Pyramid Split 二分
    Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
  • 原文地址:https://www.cnblogs.com/z-sm/p/5481384.html
Copyright © 2011-2022 走看看