前几天看了点关于JSP的知识。JSP他是一种运行在服务器端的语言。他与ASP、PHP等语言相似。
1、JSP的简介:
JSP的全称叫做Java server pages。他是由SUN公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。
JSP是以JAVA语言作为脚本语言的,JSP网页为整个服务器端的JAVA库单元提供了一个接口来服务于HTTP的应用程序。JSP文件的开发的web应用可以跨平台使用的。
下面代码是一个JSP程序。
<html> <head> <title>第一个JSP程序</title> </head> <body> <--!下面实际上就是一个JSP的脚本段--> <% out.println("Hello World!"); %> </body> </html>
2、JSP的结构:
网络服务器需要一个JSP引擎。也就是一个容器来处理JSP页面。容器负责截获对JSP页面 的请求。
JSP容器与Web服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于JSP网页的特殊元素。
下图显示JSP容器和JSP文件在web应用中所处的位置:
图中绿色部分就是处理JSP的容器(此部分图片来自互联网)
2、处理JSP的过程
web服务器如何使用JSP来创建网页?
a.首先你的浏览器发送一个HTTP请求给服务器。
b.web服务器识别出这是一个对JSP网页的请求,并将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
c.JSP引擎将磁盘里的JSP文件载入,然后将他们转化为servlet类。这种转换只是将所有模板的文本改用println( )语句,并且将所有的JSP元素转化为JAVA代码。
d.JSP引擎将servlet编译成可执行的类文件(.class文件)。并将原始请求传递给servlet引擎。
e.web服务器的组件会将调用servlet引擎的,然后会载入并执行servlet类。在执行的过程中,servlet会产生HTML格式的输出并将其内嵌于HTTP response中,上交给web服务器。
f.web服务器以静态的HTML网页的形式将HTTP response 返回到你的浏览器中(客户端)。
g.最终,客户端浏览器处理HTTP response中动态产生的HTML网页,就像在处理静态网页一样。
下图为此过程的流程图:
图 JSP创建页面的过程(图片来自互联网)
一般情况下,JSP引擎会检查JSP文件对应的servlet是否已经存在,并且检查JSP文件的修改日期是否早于servlet。如果JSP文件的修改日期早于对应的servlet,那么容器就可以确定JSP文件没有被修改过并且servlet是有效的。这使得整个流程与其他脚本语言(比如PHP)相比要高效快捷一些。
总的来说,JSP网页就是用另一种方式来编写servlet类而你不用成为Java编程高手。除了解释阶段外(将JSP转换为servlet类阶段),JSP网页几乎可以被当成一个普通的servlet类来对待。
4、JSP的生命周期
JSP生命周期就是从创建到销毁的这么一个过程。主要分为四个阶段:编译阶段,初始化阶段,执行阶段,销毁阶段。
a.编译阶段:首先是将JSP文件转换为servlet源文件,然后由servlet容器编译servlet源文件,生成servlet类。
当浏览器请求JSP页面时,JSP引擎首先会去检查是否需要编译这个文件。如果这个文件没有被编译过或者在上次编译之后又被修改过。则编译这个JSP文件。编译的过程有3步:
1 解析JSP文件。
2 将jsp文件转化为servlet类。
3 编译servlet 类。
b.初始化阶段:加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法。
容器载入JSP文件后,他会在为请求提供任何服务前调用jsInit()初始化方法,如果需要执行自定义的jsInit()方法,就覆写该方法即可。注意:一般来说程序只初始化一次。servlet也是如此的。通常情况下您可以在jspInit()方法中完成初始化数据库连接、打开文件和创建查询表之类的动作。
c.执行阶段:调用与JSP对应的servlet实例的service()方法。
这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。当JSP网页完成初始化后,JSP引擎会调用jspService()方法。
jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数,就像下面这样:
void _jspService(HttpServletRequest request, HttpServletResponse response){ // 服务端处理代码}
jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。(注意request和response总是成对出现的。)
d.销毁阶段:调用与JSP对应的servlet实例的destroy方法,然后销毁servlet实例。
JSP生命周期的销毁阶段,描述的当一个JSP网页从容器中被移除时发生的一切。jspDestroy()方法在JSP中等价于servlet中的销毁方法。当你需要执行任何清理工作的时候覆写jspDestroy()方法,比如释放数据库的连接或者关闭文件夹之类的操作。
5、图解JSP的生命周期
测试JSP生命周期的代码:
<body> <h1>用于测试JSP生命周期的</h1><br> <%request.setCharacterEncoding("utf-8"); %> <%! private int initCount=0; private int destroyCount=0; private int serviceCount=0; %> <%! //首先要覆写这些方法 public void jspInit() { initCount++; System.out.println("JSP初始化了:"+initCount+"次"); } public void jspDestroy() { destroyCount++; System.out.println("JSP销毁了:"+destroyCount+"次"); } %> <% serviceCount++; System.out.println("JSP响应了"+serviceCount+"次请求"); String str1="销毁了"+destroyCount+"次"; String str2="初始化了"+initCount+"次"; String str3="响应了"+serviceCount+"次请求"; %> <%=str2 %><br> <%=str1 %><br> <%=str3 %><br> </body>
测试结果如下:
在每次刷新页面的时候,初始化的count值是不变的。而service的count值会在不断的增加。