JSP隐藏对象
之前写的脚本代码出现过这样的代码,我们并没有new 一个对象而是直接调用out.println()方法,getParameter()方法,而这out、request就是JSP的隐藏对象,直接调用即可。
<%
out.println(...);
request.getParameter(...);
%>
隐含对象表
这边正好可以应用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
说明:pageContext信息无法传递到其他页面,而request在同一个请求内,可以将信息传递到其他页面,session和application同样是在各自范围内,都可以跨页面传递信息。
继续做测试,在地址栏输入:
http://localhost:8080/Jsp16_10_5/scope/other.jsp
发现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
发现session为null,因为关闭浏览器后再打开浏览器,重新访问该界面,servlet容器重新创建一个session ID,之前的session ID随浏览器关闭再内存中释放了,因此重新访问该页面,服务器读取不到之前的session ID,就重新创建一个session(会话)了,因此是两个不同session,不同的session是相互独立,所以无法获取信息。
而application依然可以获取信息,因为服务没有停止,一直保存着之前存储的信息。
最后一个测试了,关闭服务,然后启动服务器,重新访问该页面,会发现四个范围全为null。
可以简单记住scope: pageContext < request
接着简单介绍exception对象
exception封装了JSP中抛出的异常信息,要使用这个对象,需要设置<%@ page isErrorPage=”true”%>
捕获异常页面则需要设置:
<%@ page errorPage=”跳转的处理异常界面” %>
WebRoot目录下新建一个exception目录,然后新建exceptioncatch.jsp和exceptionshow.jsp
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>
测试结果:
因为request对象和response对象对应Servlet中的HttpServletRequest和HttpServletResponse,在Servlet中已经介绍过,这边不多介绍。
接下来介绍另外一个今后会常用的知识点——EL表达式