JSP页面就是带有JSP元素的常规Web页面,它由静态内容和动态内容构成。
一、JSP的执行过程
JSP的执行过程主要可以分为以下几点:
1、客户端发出请求。
2、Web容器将JSP转译成Servlet源代码。
3、Web容器将产生的源代码进行编译。
4、Web容器加载编译后的代码并执行。
5、把执行结果响应至客户端。
二、JSP异常处理
(1)创建一个用于异常处理的jsp的页面
<%@ page isErrorPage=”true”%>
<%
exception
%>
(2)其他的jsp页面出现了异常能够跳转到异常处理的页面去
方法一:<%@ page errorPage=””%>
方法二:web.xml文件中去进行配置
<error-page>
<error-code>404</error-code> 出错的代码500、404
<location>/404error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type> 异常的类型
<location>/error.jsp</location>
</error-page>
三、JSP的隐式对象
1、JSP隐式对象是Web容器加载的一组类的实例。它是可以直接在JSP页面使用的对象。分为4个主要类别:
(1)输入和输出对象:控制页面的输入和输出(request、response、out)。
(2)作用域通信对象:检索与JSP页面的Servlet相关的信息(session、application、pageContext)。
(3)Servlet对象:提供有关页面环境的信息(page、config)。
(4)错误对象:处理页面中的错误(exception)。
1) request对象
request隐式对象表示客户端的请求,包含了所有的请求信息,常用的方法:
String getParameter(String name):根据页面表单组件名称获取请求页面提交的数据。
String getParameterValues(String name):获取页面请求中一个表单组件对应多个值时的用户的请求数据(例如复选框)。
2) response对象
response隐式对象处理JSP生成的响应,然后将响应结果发送给客户端,常用的方法:
void setContentType(String name):设置作为响应生成的内容的类型和字符编码。
void sendRedirect(String name):发送一个响应给浏览器,指示其应请求另一个URL(会丢失数据,跳转后不再执行sendRedirect方法下面的代码)。
3) out对象
out对象表示输出流,此输出流将作为请求的响应发送到客户端,常用方法有print()、println()、和write()。
在JSP页面中应使用out隐式对象来向客户端发送文本形式的实体内容。
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
JSP页面中的out隐式对象相当于插入到ServletResponse.getWriter方法返回的PrintWriter对象前面的缓冲包装类对象。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
设置page指令的buffer属性关闭了out对象的缓存功能
写入到out对象中的内容充满了out对象的缓冲区
整个JSP页面结束
内置对象:
(1)输入输出对像 request、response、out
(2)作用域通信对象 pageContext、application、session
4) pageContext对象
pageContext对象使用户可以访问当前页面作用域中定义的所有隐式对象。pageContext对象常用的方法:
getRequest()、getServletConfig()、getSession()等
void setAttribute(String name, Object value)
void getAttribute(String name)
获得其他隐式对象
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
引入和跳转到其他资源
(1) PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和RequestDispatcher.include方法的调用:
public void forward(java.lang.String relativeUrlPath)
throws javax.servlet.ServletException,java.io.IOException
public void include(java.lang.String relativeUrlPath)
throws javax.servlet.ServletException,java.io.IOException
public void include(java.lang.String relativeUrlPath,boolean flush)
throws javax.servlet.ServletException,java.io.IOException
(2) 传递给这些方法的资源路径都只能是相对路径,如果路径以“/”开头,表示相对于当前WEB应用程序的根目录,否则,表示相对于当前JSP所映射到的访问路径。
访问各个域范围中的属性
在application、session、request、pageContext对象中都可以调用setAttribute方法和getAttribute方法来设置和检索各自域范围内的属性。
存储在application对象中的属性可以被同一个WEB应用程序中的所有Servlet和JSP页面访问。
存储在session对象中的属性可以被属于同一个会话的所有Servlet和JSP页面访问。
存储在request对象中的属性可以被属于同一个请求的所有Servlet和JSP页面访问,例如使用PageContext.forward和PageContext.include方法连接起来的多个Servlet和JSP页面。
存储在pageContext对象中的属性仅可以被当前JSP页面的当前响应过程中调用的各个组件访问,例如,正在响应当前请求的JSP页面和它调用的各个自定义标签类。
PageContext类中还提供了对各个域范围的属性进行统一管理的方法,以简化对各个域范围内的属性的访问。
setAttribute方法
public void setAttribute(java.lang.String name,java.lang.Object value)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
getAttribute方法
public java.lang.Object getAttribute(java.lang.String name)
public java.lang.Object getAttribute(java.lang.String name,int scope)
removeAttribute方法
public void removeAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name,int scope)
getAttributeNamesInScope方法
findAttribute方法 (*)
5) session对象
session对象表示用户的会话状况,用此项机制可以轻易识别每一个用户,能保存和跟踪用户的会话状态。session对象最常用的方法:
void setAttribute(String name, Object value)
void getAttribute(String name)
6) application对象
application对象作用于整个应用程序,所有的客户端窗口都可以共享该对象,从服务器开始就存在,直到服务器关闭为止。application对象最常用的方法:
void setAttribute(String name, Object value):以名称/值的方式,将一个对象的值存放到application中(存的值的类型为Object)。
void getAttribute(String name):根据名称去获取application中存放对象的值(获取的值的类型为Object)。
设置context初始参数。在web.xml文件适当的位置增加内容:
<context-param>
<param-name>website</param-name>
<param-value>www.sohu.com</param-value>
</context-param>
在JSP页面中,使用applicatin对象的getInitParameter()方法可以取得website参数对应的参数值。在Servlet中用ServletContext对象的同名方法获得参数值。
使用log()方法记录日志。
可以使用application对象提供的log()方法,实现日志记录功能,在Tomcat服务器中,记录的日志都保存在Tomcat根目录的logs目录下。日志内容分成不同文件进行记录。例如,
<% application.log(“SunWuKong is here”);%>
7) page对象
page对象提供对网页上定义的所有对象的访问。page对象表示页面本身,它是java.lang.Object类的一个实例。
8) config对象
config对象存储Servlet的一些初始信息。config对象是javax.servlet.ServletConfig接口的一个实例,ServletConfig接口提供方法以检索Servlet初始化参数。config对象表示编译JSP页面的Servlet初始化数据的配置。
9) exception对象处理JSP页面中的错误
printStackTrace()方法用于显示异常的堆栈跟踪。
总结:同一个JSP页面的每次访问请求的响应过程共享同一个pageContext对象,但是每次响应过程结束时都将重新初始化pageContext对象的内部状态,并释放相关的引用,所以,pageContext对象中存储的属性对该页面的以后请求的响应过程不可见,即同一个JSP页面的每次访问请求的响应过程不能共享存储进pageContext对象中的属性。