JSP转译成Servlet详细过程

  很多人都会认为JSP的执行性能会和Servlet相差很多,其实执行性能上的差别只在第一次的执行。因为JSP在执行第一次后,会被编译成Servlet的类文件,即.class,当再重复调用执行时,就直接执行第一次所产生的Servlet,而不再重新把JSP编译成Servelt。

  因此,除了第一次的编译会花较久的时间之外,之后JSP和Servlet的执行速度就几乎相同了。Web容器处理JSP文件请求的执行过程主要包括以下4个部分:

  1.客户端发出Request请求

  2.JSP Container 将JSP转译成Servlet的源代码

  3.将产生的Servlet源代码经过编译后,并加载到内存执行

  4.把结果Response(响应)至客户端

  在执行JSP网页时,通常可以分为两个时期:转译时期(Translation Time)和请求时期(Request Time)。

  ◆转译时期:JSP网页转移成Servlet类。

  ◆请求时期:Servlet类执行后,响应结果至客户端。

  转译期间做了两件事情:

  ◆转译时期:将JSP网页转移为Servlet源代码 .java.

  ◆编译时期:将Servlet 源代码 .java编译成 Servlet类 .class.

  当JSP网页在执行时,JSP Container会做检查工作,如果发现JSP网页有更新修改时,JSP Container才会再次编译JSP成Servlet; 如果JSP没有更新时,就直接执行前面所产生的Servlet。

   
   
   
   
1 . (showdate.jsp)
2 . <% @ page language = " java " contentType = " text/html;charset=gb2312 " import = " java.text.*,java.util.*; " %>
3 . < html >
4 . < head >
5 . < title > Show time < / title>
6 . < / head>
7 . < body >
8 . Hello :
9 . <%
10 . SimpleDateFormat format = new SimpleDateFormat( " yyyy/MM/dd " );
11 . String str = format.format( new Date());
12 . %>
13 . <%= str %>
14 . < / body>
15 . < / html>

  当部署好 showdate.jsp之后,启动Tomcat服务器。

  1.在IE浏览器中输入配置好的路径 .... showdate.jsp 请求这个页面。

  2.JSP Container 即Tomcat 服务器会将 showdate.jsp 转译成 showdate_jsp.java 源文件。

  3.同时将 showdate_jsp.java 源文件编译成 showdate_jsp.class。

  4.编译执行showdate_jsp.class 类,处理请求,返回响应,容器将生成的页面返回给客户端显示。

   
   
   
   
1 . (转移成的java源文件 showdate_jsp.java)
2 . package org.apache.jsp.ch04;
3 .
4 . import javax.servlet. * ;
5 . import javax.servlet.http. * ;
6 . import javax.servlet.jsp. * ;
7 . import java.text. * ;
8 . import java.util. * ;;
9 .
10 . public final class showdate_jsp extends org.apache.jasper.runtime.HttpJspBase
11 . implements org.apache.jasper.runtime.JspSourceDependent {
12 .
13 . private static java.util.List _jspx_dependants;
14 .
15 . public Object getDependants() {
16 . return _jspx_dependants;
17 . }
18 .
19 . public void _jspService(HttpServletRequest request, HttpServletResponse response)
20 . throws java.io.IOException, ServletException {
21 .
22 . JspFactory _jspxFactory = null ;
23 . PageContext pageContext = null ;
24 . HttpSession session = null ;
25 . ServletContext application = null ;
26 . ServletConfig config = null ;
27 . JspWriter out = null ;
28 . Object page = this ;
29 . JspWriter _jspx_out = null ;
30 . PageContext _jspx_page_context = null ;
31 .
32 . try {
33 . _jspxFactory = JspFactory.getDefaultFactory();
34 . response.setContentType( " text/html;charset=gb2312 " );
35 . pageContext = _jspxFactory.getPageContext( this , request, response,
36 . null , true , 8192 , true );
37 . _jspx_page_context = pageContext;
38 . application = pageContext.getServletContext();
39 . config = pageContext.getServletConfig();
40 . session = pageContext.getSession();
41 . out = pageContext.getOut();
42 . _jspx_out = out;
43 .
44 . out.write( " \r\n " );
45 . out.write( " \r\n " );
46 . out.write( " \r\n " );
47 . out.write( " Show time\r\n " );
48 . out.write( " \r\n " );
49 . out.write( " \r\n " );
50 . out.write( " \tHello : \r\n " );
51 . out.write( " \t " );
52 .
53 . SimpleDateFormat format = new SimpleDateFormat( " yyyy/MM/dd " );
54 . String str = format.format( new Date());
55 .
56 . out.write( " \r\n " );
57 . out.write( " \t " );
58 . out.print(str );
59 . out.write( " \r\n " );
60 . out.write( " \r\n " );
61 . out.write( " " );
62 . } catch (Throwable t) {
63 .
64 . if ( ! (t instanceof SkipPageException)){
65 . out = _jspx_out;
66 . if (out != null && out.getBufferSize() != 0 )
67 . out.clearBuffer();
68 . if (_jspx_page_context != null ) _jspx_page_context.handlePageException(t);
69 . }
70 .
71 . } finally {
72 .
73 . if (_jspxFactory != null ) _jspxFactory.releasePageContext(_jspx_page_context);
74 . }
75 . }
76 . }

  当JSP页面被转译成Servlet时,内容主要包含三个部分:

   
   
   
   
1 . public void _jspInit(){ ..}
2 . -- 当JSP网页一开始执行时,最先执行此方法,执行初始化工作
3 . public void _jspDestory(){...} – JSP网页最后执行的方法
4 . public void _jspService(HttpServletRequest request, HttpServletResponse response)
5 . throws java.io.IOException, ServletException {

  JSP网页中最主要的程序都是在此执行,将showdate.jsp和showdate_jsp.java做一个简单对比:

  第一部分:页面属性的对比

   
   
   
   
1 . <% @ page language = " java " contentType = " text/html;charset=gb2312 " %>
2 . response.setContentType( " text/html;charset=gb2312 " );
3 . // 通过 response响应设置返回客户端的页面属性

  第二部分:HTML标签

   
   
   
   
1 . < html >
2 . < head >
3 . < title > Show time < / title>
4 . < / head>
5 . ..
6 . < / html>
7 .
8 . out.write( " \r\n " );
9 . out.write( " \r\n " );
10 . out.write( " \r\n " );
11 . out.write( " Show time\r\n " );
12 . out.write( " \r\n " );
13 . out.write( " \r\n " );
14 . out.write( " \tHello : \r\n " );
15 . out.write( " \t " );
16 . // 通过 out对象 向客户端写HTML标签

  第三部分:声明的对象

   
   
   
   
1 . <%
2 . SimpleDateFormat format = new SimpleDateFormat( " yyyy/MM/dd " );
3 . String str = format.format( new Date());
4 . %>

  在_jspService 方法中声明的局部变量:

  第四部分:表达式

   
   
   
   
<%= str %>
out.print(str );
// 写即打印str变量的值

你可能感兴趣的:(JSP,转译,Servlet,Web)