JSP 的工作原理
JSP 页面工作原理图
当一个 JSP 文件第一次被请求的时候,JSP 引擎(本身也是一个 Servlet)首先会把这个 JSP 文件转换
成一个 Java 源文件。在转换过程中如果发现 JSP 文件有语法错误,转换过程将中断,并向服务端和客户
端输出出错信息;如果转换成功,JSP 引擎用 javac 把该 Java 源文件编译成相应的.class 文件并将该.class
文件加载到内存中。
其次创建一个该 Servlet 的实例,并执行该实例的 jspInit()方法(jspInit()方法在 Servlet 的生命周期中
只被执行一次)。
然后创建并启动一个新的线程,新线程调用实例的 jspService()方法。(对于每一个请求,JSP 引擎会
创建一个新的线程来处理该请求。如果有多个客户端同时请求该 JSP 文件,则 JSP 引擎会创建多个线程,
每个客户端请求对应一个线程)。
浏览器在调用 JSP 文件时,Servlet 容器会把浏览器的请求和对浏览器的回应封装成
HttpServletRequest 和 HttpServletResponse 对象,同时调用对应的 Servlet 实例中的 jspService()方法,
把这两个对象作为参数传递到 jspService()方法中。
jspService()方法执行后会将 HTML 内容返回给客户端。
如果 JSP 文件被修改了,服务器将根据设置决定是否对该文件进行重新编译。如果需要重新编译,
则将编译结果取代内存中的 Servlet,并继续上述处理过程。 如果在任何时候由于系统资源不足,JSP 引
擎将以某种不确定的方式将 Servlet 从内存中移去。当这种情况发生时,jspDestroy()方法首先被调用, 然
后 Servlet 实例便被标记加入“垃圾收集”处理。
补充:
以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间,但应该注意多线程
的编程限制,由于该 Servlet 始终驻于内存,所以响应是非常快的。
虽然 JSP 效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟。
在 jspInit()中可以进行一些初始化工作,如建立与数据库的连接、建立网络连接、从配置文件中获取一
些参数等,而在 jspDestory()中释放相应的资源。
jspInit()及 jspDestory()格式如下:
public void jspInit()
{
}
System.out.println("jspinit");
public void jspDestory()
{
}
System.out.println("jspDestory");