本文按照官网文档总结,但是有可能会理解错误,学习时尽量和其他网站进行对比,同时也欢迎指出错误,好让我及时改正
什么是JSP页面?
JSP页面是一个文本文档,包含两种类型的文本:静态数据,可以用任何基于文本的格式(如HTML,SVG,WML和XML)表示,JSP元素构成动态内容。
JSP页面中的JSP元素可以用两种语法表示,standard 和 XML,虽然任何给定的文件只能使用一种语法。XML语法中的JSP页面是XML文档,可以通过XML文档的工具和API进行操作。
JSP页面的源文件的推荐文件扩展名是.jsp。该页面可以由顶级文件组成,该顶级文件包含其他文件,这些文件包含完整的JSP页面或JSP页面的片段。JSP页面片段的源文件的推荐扩展名是.jspf。
jsp指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
JSP中的三种指令标签:
<%@ page ... %> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义 |
其他信息访问http://www.runoob.com/jsp/jsp-directives.html
JSP 生命周期
当请求映射到JSP页面时,Web容器首先检查JSP页面的servlet是否比JSP页面旧。如果servlet较旧,则Web容器将JSP页面转换为servlet类并编译该类。在开发过程中,JSP页面优于servlet的一个优点是构建过程是自动执行的。
-
编译阶段:
servlet容器编译servlet源文件,生成servlet类
- 初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
- 执行阶段:
调用与JSP对应的servlet实例的服务方法
- 销毁阶段:调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
转换和编译
在jsp转换servlet阶段,JSP页面中的每种类型的数据都被区别对待。静态数据转换为代码这会将数据发送到响应流中。JSP元素的处理如下:
- 指令用于控制Web容器如何转换和执行JSP页面。
- 脚本元素被插入到JSP页面的servlet类中。
- 表达式语言表达式作为参数传递给JSP表达式求值程序
- jsp:[set | get]属性元素被转换为对JavaBeans组件的get和set方法.
- jsp:[include | forward]元素被转换为Java Servlet API
- jsp:plugin元素被转换为特定于浏览器的标记,用于激活applet。
- 自定义标记将转换为对实现自定义标记的标记处理程序的调用。
在Application Server中,基于JSP页面创建的servlet源代码位于/WAR-NAME/文件夹下,例如,创建一个名为index.jsp文件,其编译后的源代码将命名为:
index_jsp.java
转换和编译阶段都可能产生仅在第一次请求页面时才会出现的错误。如果在任一阶段遇到错误,服务器将返回JasperException以及包含JSP页面名称和发生错误的行的消息。
页面转换和编译后,JSP页面的servlet(大部分)遵循Servlet生命周期中描述的servlet生命周期:
- 如果JSP页面的servlet实例不存在,则容器:
- 加载JSP页面的servlet类
- 实例化servlet类的实例
- 通过调用jspInit方法初始化servlet实例
- 容器调用_jspService方法,传递请求和响应对象。
- 如果容器需要删除JSP页面的servlet,则它会调用jspDestroy方法。
执行
执行阶段将执行转换为servlet的jsp文件,jsp指令则设置个如何去执行整个jsp页面,除了上面的三种指令外还有其他的一些指令本文会一一介绍
缓冲指令
下列指令中buffer属性的值可以是两种形式,“none” 或者 缓冲区的大小(单位为KB),较大的缓冲区允许服务器向客户端响应之前向服务器缓冲区写入更多内容,从而为JSP页面提供更多时间来设置适当的状态代码和标题或转发到另一个Web资源。较小的缓冲区会降低服务器内存负载,并允许客户端更快地开始接收数据。
<%@ page buffer="none|xxxkb" %>
JSP页面错误指令
执行JSP页面时可能会出现任意数量的异常。要指定Web容器应在发生异常时将控制转发到错误页面,请在JSP页面的开头包含以下页面指令:
<%@ page errorPage="file-name" %>
例如,我们可以创建一个index.jsp页面,并添加如下内容:
<%@ page errorPage="errorpage.jsp"%>
并创建一个errorPage.jsp的页面,添加如下内容:
<%@ page isErrorPage="true" %>
${pageContext.errorData.throwable.cause}
${pageContext.errorData.statusCode}
index.jsp页面中的errorPage属性声明了jsp页面发生错误时显示的页面“errorpage.jsp”,而errorPage.jsp页面的isErrorPage属性
声明了errorPage页面是否是一个jsp错误页面,当我们的jsp运行出现错误时jsp将会进行跳转,并直接跳转到errorPage.jsp页面,
而${pageContext.errorData.statusCode}用来获取页面的状态码比如404,500等,${pageContext.errorData.throwable.cause}用来显示页面的错误信息
创建静态内容
您可以在JSP页面中创建静态内容,只需编写它就像创建仅包含该内容的页面一样。静态内容可以用任何基于文本的格式表示,例如HTML,无线标记语言(WML)和XML。默认格式为HTML。如果要使用HTML以外的格式,请在JSP页面的开头添加一个page指令,其contentType属性设置为内容类型。contentType指令的目的是允许浏览器正确解释生成的内容。因此,如果您希望页面包含以XML表示的数据,则应包含以下指令:
<%@ page contentType="text/XML"%>
响应和页面编码
当你需要为响应的内容设置编码类型时,你可以使用以下指令:
<%@ page contentType="text/html; charset=UTF-8" %>
如果未设置响应编码,获取响应参数时会出现乱码。
要设置JSP页面本身的源编码格式,您可以使用以下页面指令:
<%@ page pageEncoding="UTF-8" %>
创建动态Content
共享对象
如果你希望JSP页面以多线程的方式运行你可以使用以下指令:
<%@ page isThreadSafe="true|false" %>
当isThreadSafe属性设置为true时,Web容器可以选择将多个并发客户端请求分派给JSP页面。如果isThreadSafe设置为false,则按接收顺序一次调度一个请求,并且不必控制对页面级对象的访问。