• 中文
    • English
  • 注册
  • 查看作者
  • 11:作用域

    一.  常用方法

    在介绍下面的几个作用域之前,我们先来介绍三个常用的方法:

    保存:setAttribute(String,Object)
    
    读取:getAttribute(String)
    
    删除:removeAttribute(String)

    二.  pageContext

    index.jsp:

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        pageContext.setAttribute("name", "zhangjia");
    
     //   request.getRequestDispatcher("b.jsp").forward(request,response);
    
    //    response.sendRedirect("b.jsp");
    %>
    <a href="b.jsp">链接</a>
    <p><%=pageContext.getAttribute("name")%></p>
    </body>
    </html>

    b.jsp:

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <p><%=pageContext.getAttribute("name")%></p>
    </body>
    </html>

    我们可以从以下几个方面分析pageContext的作用域:

    • 直接访问index.jsp,可以输出zhangjia

    • 直接访问b.jsp(无论是否访问过index.jsp),输出null

    • 通过index.jsp的a标签跳转到b.jsp,输出null

    • 通过index.jsp转发到b.jsp,输出null

    • 通过index.jsp重定向到b.jsp,输出null

    通过上面结果可以看出,pageContext只有在当前页才能获取到数据,所以一句话总结PageContext的作用域:pageContext的作用域仅限当前页面。

    三.  request

    index.jsp:

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        request.setAttribute("name", "zhangjia");
    
        request.getRequestDispatcher("b.jsp").forward(request,response);
    
    //    response.sendRedirect("b.jsp");
    %>
    <a href="b.jsp">链接</a>
    <p><%=request.getAttribute("name")%></p>
    </body>
    </html>

    b.jsp:

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <p><%=request.getAttribute("name")%></p>
    </body>
    </html>

    我们从以下几个方面分析request的作用域:

    • 直接访问index.jsp,可以输出zhangjia

    • 直接访问b.jsp(无论是否访问过index.jsp),输出null

    • 通过index.jsp的a标签跳转到b.jsp,输出null

    • 通过index.jsp转发到b.jsp,输出zhangjia

      • 因为转发只产生一次请求

    • 通过index.jsp重定向到b.jsp,输出 null

      • 因为重定向产生两次请求,所以有两个request对象,分别是index.jsp的request对象和b.jsp的request对象

    通过上面结果可以看出,request的作用域在连续的服务器端跳转中有效。

    四.  session

    index.jsp:

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        session.setAttribute("name", "zhangjia");
    
    //    request.getRequestDispatcher("b.jsp").forward(request,response);
    
    //    response.sendRedirect("b.jsp");
    %>
    <a href="b.jsp">链接</a>
    <p><%=session.getAttribute("name")%></p>
    </body>
    </html>

    b.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <p><%=session.getAttribute("name")%></p>
    </body>
    </html>

    我们从以下几个方面分析session的作用域:

    • 直接访问index.jsp,可以输出zhangjia

    • 访问过index.jsp后再直接访问b.jsp,输出zhangjia

    • 通过index.jsp的a标签跳转到b.jsp,输出zhangjia

    • 通过index.jsp转发到b.jsp,输出zhangjia

    • 通过index.jsp重定向到b.jsp,输出zhangjia

    • 但是如果更换一个浏览器,直接访问b.jsp,输出null,但是在该浏览中访问一次index.jsp后,再访问b.jsp,就能正常输出了

    通过上面结果可以看出,session的作用域在一次会话。如果关闭浏览器,session中的数据便会丢失。

    五.  application

    index.jsp:

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        session.setAttribute("name", "zhangjia");
    
    //    request.getRequestDispatcher("b.jsp").forward(request,response);
    
    //    response.sendRedirect("b.jsp");
    %>
    <a href="b.jsp">链接</a>
    <p><%=session.getAttribute("name")%></p>
    </body>
    </html>

    b.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <p><%=application.getAttribute("name")%></p>
    </body>
    </html>

    我们从以下几个方面分析application的作用域:

    • 直接访问index.jsp,可以输出zhangjia

    • 访问过index.jsp后再直接访问b.jsp,输出zhangjia

    • 通过index.jsp的a标签跳转到b.jsp,输出zhangjia

    • 通过index.jsp转发到b.jsp,输出zhangjia

    • 通过index.jsp重定向到b.jsp,输出zhangjia

    • 重启服务后,直接访问b.jsp,才会显示null

    • 除了重启,还可以使用removeAttribut方法来删除该数据。

    application的作用域在整个应用程序,服务器不重启,作用域就一直有效。

    山东省
  • 0
  • 0
  • 0
  • 1.2k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: