
JSP页面本质上是一个Servlet,JSP页面在JSP容器中运行,一个Servlet容器通常也是JSP容器。
当一个JSP页面第一次被请求时,Servlet/JSP容器主要做一下两件事情:
① 转换JSP页面到JSP页面实现类,该实现类是一个实现javax.servlet.jsp.JspPage接口或子接口javax.servlet.jsp.HttpJspPage的Java类。该实现类的类名由Servlet/JSP容器生成。如果出现转换错误,则相关错误信息将被发送到客户端。
② 如果转换成功,Servlet/JSP容器随后编译该Servlet类,并装载和实例化该类,想其他正常的Servlet一样执行生命周期操作。
用一张图来描述以上操作,如下:

对于同一个JSP页面的后续请求,Servlet/JSP容器会先检查JSP页面是否被修改过。如果是,则该JSP页面会被重新翻译、编译并执行。如果不是,则执行已经在内存中的JSP Servlet。这样一来,一个JSP页面的第一次调用的实际花费总比后来的花费多,因为它涉及翻译和编译。为了解决这个问题,可以执行下列动作:
① 配置应用程序,使所有的JSP页面在应用程序启动时被调用,而不是在第一次请求时被调用。
② 预编译JSP页面,并将其部署为Servlet。
JSP自带的API包含4个包:
JSP支持两种不同的注释格式:
JSP九大隐式(内置)对象:
当服务器创建request对象时会同时创建用于响应这个客户端的response对象。response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies、时间戳、HTTP状态码等等。
application对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestory()的调用而被移除。通过向application中添加属性,则所有组成web应用的JSP文件都能访问到这些属性。
pageContext对象主要用来访问页面信息,同时过滤大部分实现细节。该对象除了pageContext、page、exception对象的属性不能导出,其余内置对象的属性都能导出,而且该对象包含了传给JSP页面的指令信息,也定义了一些字段。
指令
指令是JSP语法元素的第一种类型。它们指示JSP转换器如何翻译JSP页面为Servlet。
page指令
可以使用page指令来控制JSP转换器转换当前JSP页面的某些方面。
page指令的语法如下:
<%@ page attribute1="value1" attribute2="value2" ...%>
以下是page指令属性的列表:
以KB为单位,定义隐式对象out的缓冲大小。jsp taglib必须以KB后缀结尾,默认为8KB或更大。该值可以为none,这意味着没有缓冲,所有数据将直接写入PrintWriter。

默认值为True。若值为True,则当输出缓冲满时会自动写入输出流。而值为False,则仅当调用隐式对象的flush方法时,才会写入输出流。因此,若缓冲溢出则会抛出异常。
大部分page指令可以出现在页面的任何位置,但一般page指令是放在第一行代码的位置。page指令也可以出现多次,但出现多次的指令属性必须具有相同的值。不过,import属性例外,多个包含import属性的page指令的结果是累加的。
include指令
可以使用include指令将其他文件中的内容包含到当前JSP页面。一个页面中可以有多个include指令。若存在一个内容会在多个不同页面中使用或一个页面不同位置使用的场景,则将该内容模块化include文件非常有用。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-86888-1.html
晶晶跟几年前一样