• 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)域中,像聊天数据。

  • 相关阅读:
    Django xadmin
    Linux 目录
    服务器的组件
    C# 判断数字的小方法
    Eclipse快捷键
    安卓资源与ID不对应的问题
    Java中Runnable和Thread的区别
    View的setOnClickListener的添加方法
    如何实现消息框风格的Activity
    安卓开发的在线调试
  • 原文地址:https://www.cnblogs.com/z-sm/p/5481384.html
Copyright © 2020-2023  润新知