JSP简介及原理
JSP同样是由SUN公司定义的一种用于开发动态Web的技术。JSP最大的特点就是像写HTML一样,但不仅仅像HTML那样是静态的,JSP是动态的,它允许开发人员在HTML中插入Java代码为用户提供动态数据,所以这样认为JPS=HTML+Java。
我们应该有这样的问题?
- 浏览器访问jsp页面时web服务器如何调用并执行一个jsp页面?
- web服务器如何将jsp中的html标签发送给客户端?
- web如何执行jsp中的java代码?
我们带着这些疑问来探讨一下jsp吧。
jsp之所以可以被web服务器执行并且返回给客户端,是因为jsp本质上就是servlet。为什么这么说呢?首先我们新建一个项目,index.jsp在Tomcat下可以看到,index.jsp文件被转换成了两个文件,index_jsp.class和index_jsp.java,我们查看.java文件可以知道这个类继承自HttpJspBase,而HttpJspBase又继承自HttpServlet,从而可以知道jsp文件运行时本质上就是Servlet。
JSP生命周期
1. JSP编译
当浏览器请求这个页面的时候,jsp引擎首先去检查是否需要编译这个文件,如果该文件没有被编译过或者编译过之后改变了,那么会重新编译jsp文件。
编译的三个步骤:解析jsp文件、将jsp文件转换为servlet、编译servlet。
2. JSP初始化
容器载入jsp文件后,会在请求之前调用jspInit()方法,所以如果我们需要执行自定义jsp文件的初始化任务时,只需要重写jspInit()方法即可。
public void jspInit(){
}
和Servlet一样,jsp也只初始化一次,所以我们一般在此操作初始化数据库连接、打开文件、创建表等操作。
3. JSP执行
一个客户端请求,就会执行一次_jspService()方法。
public void _jspService(HttpServletRequest request,
HttpServletRespone respone){
}
_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。
4. JSP清理
JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。
jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。
public void jspDestroy(){
}
我们结合jsp的生命周期写一个简单的jsp示例。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index.jsp</title>
</head>
<body>
<%!
private int iCount = 0; // 初始化次数
private int sCount = 0; // 请求次数
private int dCount = 0; // 销毁次数
%>
<%!
public void jspInit(){
iCount++;
System.out.println("jspInit()执行了" + iCount + "次");
}
public void jspDestroy(){
dCount++;
System.out.println("jspDestroy()执行了" + dCount + "次");
}
%>
<%
sCount++;
System.out.println("jspService()执行了" + sCount + "次");
String content1 = "初始化了" + iCount + "次";
String content2 = "响应客户端请求" + sCount + "次";
String content3 = "销毁次数" + dCount + "次";
%>
<h1>简单jsp示例</h1>
<p><%=content1 %></p>
<p><%=content2 %></p>
<p><%=content3 %></p>
</body>
</html>
执行结果如下,F5每刷新一次sCount的次数就增加一次: