Jsp入门第三章——Jsp的隐藏对象

JSP隐藏对象
之前写的脚本代码出现过这样的代码,我们并没有new 一个对象而是直接调用out.println()方法,getParameter()方法,而这out、request就是JSP的隐藏对象,直接调用即可。


   <%
             out.println(...); 
         request.getParameter(...);
    %>

隐含对象表

Jsp入门第三章——Jsp的隐藏对象_第1张图片
这里写图片描述

这边正好可以应用JSP的内置对象介绍下JSP的scope(范围)
分别是pageContext(当前页面)范围、request(请求)范围、session(会话)范围、application(对应Servlet中的ServletContext)范围。

WebRoot目录下新建一个scope文件夹,然后新建一个scopeforward.jsp、scopedestination.jsp、other.jsp

scopeforward.jsp代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
  <head>

    <title>My JSP 'scopeforward.jsp' starting pagetitle>

  head>

  <body>
     <%
        //page范围,只在当前页面有效期
        pageContext.setAttribute("pageScope", "PAGE_SCOPE");
        //request范围,只在同一个请求范围内有效
        request.setAttribute("requestScope", "REQUEST_SCOPE");
        //session范围,只在同一个会话内有效,一般一个用户对应一个session
        session.setAttribute("sessionScope", "SESSION_SCOPE");
        //一个web应用内有效,服务器不关闭或重启,信息一直存在
        application.setAttribute("applicationScope", "APPLICATION_SCOPE");
     %>
     <jsp:forward page="scopedestination.jsp"/>
  body>
html>

scopedestination.jsp代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
  <head>

    <title>My JSP 'scopedestination.jsp' starting pagetitle>


  head>

  <body>

      <%
         //只能获取当前页面的属性,其他页面的信息无法获取
         out.println("page_scope:" + pageContext.getAttribute("pageScope") + "
"
); //可以获取到同一个请求内的信息 out.println("request_scope:" + request.getAttribute("requestScope") + "
"
); //可以获取同一个会话内的信息 out.println("session_scope:" + session.getAttribute("sessionScope") + "
"
); //可以获取整个web应用的信息 out.println("application_scope:" + application.getAttribute("applicationScope") + "
"
); %>
body> html>

other.jsp的代码和scopedestination.jsp一模一样。
在地址栏中输入:
http://localhost:8080/Jsp16_10_5/scope/scopeforward.jsp

结果如下:
Jsp入门第三章——Jsp的隐藏对象_第2张图片

说明:pageContext信息无法传递到其他页面,而request在同一个请求内,可以将信息传递到其他页面,session和application同样是在各自范围内,都可以跨页面传递信息。

继续做测试,在地址栏输入:
http://localhost:8080/Jsp16_10_5/scope/other.jsp

结果如下:
Jsp入门第三章——Jsp的隐藏对象_第3张图片

发现request范围内的信息为null,因为
http://localhost:8080/Jsp16_10_5/scope/other.jsp
和http://localhost:8080/Jsp16_10_5/scope/scopeforward.jsp
是两个不同的请求,所以http://localhost:8080/Jsp16_10_5/scope/other.jsp请求无法获取到http://localhost:8080/Jsp16_10_5/scope/scopeforward.jsp
请求信息。而other.jsp依然在同一session范围内和web应用访问内,所以session和application可以获取到信息。

继续做测试:将浏览器关闭后,在地址栏依然输入
http://localhost:8080/Jsp16_10_5/scope/other.jsp

测试结果如下:
Jsp入门第三章——Jsp的隐藏对象_第4张图片

发现session为null,因为关闭浏览器后再打开浏览器,重新访问该界面,servlet容器重新创建一个session ID,之前的session ID随浏览器关闭再内存中释放了,因此重新访问该页面,服务器读取不到之前的session ID,就重新创建一个session(会话)了,因此是两个不同session,不同的session是相互独立,所以无法获取信息。
而application依然可以获取信息,因为服务没有停止,一直保存着之前存储的信息。

最后一个测试了,关闭服务,然后启动服务器,重新访问该页面,会发现四个范围全为null。

Jsp入门第三章——Jsp的隐藏对象_第5张图片

可以简单记住scope: pageContext < request 

接着简单介绍exception对象
exception封装了JSP中抛出的异常信息,要使用这个对象,需要设置<%@ page isErrorPage=”true”%>

捕获异常页面则需要设置:
<%@ page errorPage=”跳转的处理异常界面” %>

WebRoot目录下新建一个exception目录,然后新建exceptioncatch.jsp和exceptionshow.jsp

Jsp入门第三章——Jsp的隐藏对象_第6张图片

exceptioncatch.jsp具体代码如下:

<%@ page language="java" errorPage="exceptionshow.jsp"  import="java.util.*" pageEncoding="UTF-8"%>

<html>
  <head>
    <title>My JSP 'exceptioncatch.jsp' starting pagetitle>
  head>
  <body>
     <%
        //String对象为空,所以调用方法会报空指针异常
        String str = null;
        str.equals("null");
     %>
  body>
html>

exceptionshow.jsp具体代码如下:

<%@page import="java.io.PrintWriter"%>
<%@ page language="java" import="java.util.*" isErrorPage="true" pageEncoding="UTF-8"%>

<html>
  <head>
    <title>My JSP 'errorshow.jsp' starting pagetitle>
  head>
  <body>
    <%exception.printStackTrace(new PrintWriter(out));%>
  body>
html>

测试结果:

Jsp入门第三章——Jsp的隐藏对象_第7张图片

因为request对象和response对象对应Servlet中的HttpServletRequest和HttpServletResponse,在Servlet中已经介绍过,这边不多介绍。
接下来介绍另外一个今后会常用的知识点——EL表达式

你可能感兴趣的:(Jsp入门第三章——Jsp的隐藏对象)