JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】

JSP和JSTL板块:第三节 JSP四大域对象

  • 一、page范围
  • 二、request范围
  • 三、session范围
  • 四、application范围

在服务器和客户端之间、各个网页之间、哪怕同一个网页之内,总是需要传递各种参数值,这时JSP的内置对象就是传递这些参数的载具。内置对象是JSP在对应Servlet里自动载入的,因此不需要用new实例化。在JSP中直接写就可以。
内置对象共有四种,每种对象都可以在各自的范围里进行传递参数,它们都有各自的特点。
更多域对象深度内容可看Sevlet板块的五大对象小节(还没写好)

域对象 取得到 取不到
1.page范围 pageContext:只在一个页面中保存属性 服务器跳转(请求转发forward)之后无效
2. request范围 request:只在一次请求中保存,服务器跳转后依然有效 客户端跳转(重定向/超链接)
3. session范围 session:在一次会话范围中,无论何种跳转都可以使用 换一个浏览器
4.application 范围 application:在整个服务器上保存 重启服务器或换一台电脑

每个域对象都提供了这三个基本方法
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第1张图片
如果IDEA无法获取以上中的某个方法,可能是jar包未导入,需要在项目结构里导入对应Tomtcat文件->lib文件下的jar包

一、page范围

只能在本页面取得参数,服务器端跳转后就接收不到参数了

实例
设置参数页 start.jsp

<%--
  Created by IntelliJ IDEA.
  User: TommyNike
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>设置参数页</title>
</head>
<body>

    <%
    // 设置page范围的域对象
        pageContext.setAttribute("page","zhangsan");
    // 设置request范围的域对象
        request.setAttribute("request","lisi");
    // 设置session范围的域对象
        session.setAttribute("session", "wangwu");
    // 设置application范围的域对象
        application.setAttribute("application","zhaoliu");
    %>
    <%--    JSP的服务器跳转:请求转发--%>
    <jsp:forward page="after.jsp"/>
</body>
</html>

获取参数页 after.jsp

<%--
  Created by IntelliJ IDEA.
  User: TommyNike
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>获取参数页</title>
    </head>
    <body>
    <%
        // 获取域对象中的值
        System.out.println("page范围: " + pageContext.getAttribute("page") + "\n");
        System.out.println("request范围:"+ request.getAttribute("request") + "\n");
        System.out.println("session范围: " + session.getAttribute("session") + "\n");
        System.out.println("application范围: " + application.getAttribute("application"));
    %>
    </body>
</html>

启动服务器后在浏览器访问设置参数页,自动请求转发到获取参数页(请求转发地址栏不变
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第2张图片

得到获取参数页终端输出
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第3张图片
结论:除了page对象都接受到参数了,因为page对象只能接受到同一个页面中的参数,服务器请求转发后就接不到参数了

二、request范围

服务器跳转有效,客户端跳转失效
如果是客户端跳转,也就是重定向,则相当于发出了两次请求,那么第一次的请求将不存在了,就接收不到参数了。如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围到seesion。

实例
设置参数页 start.jsp

<%--
  Created by IntelliJ IDEA.
  User: TommyNike
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>设置参数页</title>
</head>
<body>

    <%
    // 设置page范围的域对象
        pageContext.setAttribute("page","zhangsan");
    // 设置request范围的域对象
        request.setAttribute("request","lisi");
    // 设置session范围的域对象
        session.setAttribute("session", "wangwu");
    // 设置application范围的域对象
        application.setAttribute("application","zhaoliu");
    //     重定向
        response.sendRedirect("after.jsp"); //如果改成超链接用标签的效果也一样
    %>
</body>
</html>

获取参数页 after.jsp

<%--
  Created by IntelliJ IDEA.
  User: TommyNike
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>获取参数页</title>
    </head>
    <body>
    <%
        // 获取域对象中的值
        System.out.println("page范围: " + pageContext.getAttribute("page") + "\n");
        System.out.println("request范围:"+ request.getAttribute("request") + "\n");
        System.out.println("session范围: " + session.getAttribute("session") + "\n");
        System.out.println("application范围: " + application.getAttribute("application"));
    %>
    </body>
</html>

启动服务器后在浏览器访问设置参数页,自动重定向到获取参数页(重定向地址栏会变
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第4张图片

得到获取参数页终端输出
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第5张图片

结论:page和request对象接受不到参数了,因为reuqest对象最多只能接受到服务器跳转(请求转发)的范围,重定向相当于服务器进行了两次会话:关闭了start.jsp,又打开了after.jsp所以接受不到参数了

三、session范围

无论客户端还是服务器端都可以取得,但如果重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个session只保存在当前的浏览器当中
对于服务器而言,每一个连接到它的客户端都是一个session,如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application

实例
现在到上一步中的重定向结束,可以访问到session的范围
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第6张图片
如果此时重启浏览器,再访问after.jsp
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第7张图片
终端就拿不到session对象里的参数了
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第8张图片
结论:seesion对象虽然可以保存参数越过请求转发和重定向,但seesion是存活在一个浏览器中的,如果手动删除浏览器中保存的seesion
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第9张图片
或者重启浏览器都会导致这个session死亡。

四、application范围

只要是通过application设置的属性,则所有此时服务器中的session都可以取得。可以简单的理解成application是所有seesion的集合,而且放在服务器中保存,但是如果此时服务器重启了,就无法取得了,因为关闭服务器后所有的对象都消失了。

实例
来到上一步中的

JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第10张图片
此时如果重启服务器,或者干脆换了一台电脑再访问after.jsp
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第11张图片
当然就什么都拿不到了
JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】_第12张图片

你可能感兴趣的:(全套教程,java,java-ee,jsp)