JSP转译成Servlet详细过程


很多人都会认为JSP的执行性能会和Servlet相差很多,其实执行性能上的差别只在第一次的执行。本文讲详细的介绍JSP转译成Servlet的主要过程。

AD:2013云计算架构师峰会课程资料下载

很多人都会认为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. <%@pagelanguage="java"contentType="text/html;charset=gb2312"import="java.text.*,java.util.*;"%>
  3. <html>
  4. <head>
  5. <title>Showtime</title>
  6. </head>
  7. <body>
  8. Hello:
  9. <%
  10. SimpleDateFormatformat=newSimpleDateFormat("yyyy/MM/dd");
  11. Stringstr=format.format(newDate());
  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. packageorg.apache.jsp.ch04;
  3. importjavax.servlet.*;
  4. importjavax.servlet.http.*;
  5. importjavax.servlet.jsp.*;
  6. importjava.text.*;
  7. importjava.util.*;;
  8. publicfinalclassshowdate_jspextendsorg.apache.jasper.runtime.HttpJspBase
  9. implementsorg.apache.jasper.runtime.JspSourceDependent{
  10. privatestaticjava.util.List_jspx_dependants;
  11. publicObjectgetDependants(){
  12. return_jspx_dependants;
  13. }
  14. publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)
  15. throwsjava.io.IOException,ServletException{
  16. JspFactory_jspxFactory=null;
  17. PageContextpageContext=null;
  18. HttpSessionsession=null;
  19. ServletContextapplication=null;
  20. ServletConfigconfig=null;
  21. JspWriterout=null;
  22. Objectpage=this;
  23. JspWriter_jspx_out=null;
  24. PageContext_jspx_page_context=null;
  25. try{
  26. _jspxFactory=JspFactory.getDefaultFactory();
  27. response.setContentType("text/html;charset=gb2312");
  28. pageContext=_jspxFactory.getPageContext(this,request,response,
  29. null,true,8192,true);
  30. _jspx_page_context=pageContext;
  31. application=pageContext.getServletContext();
  32. config=pageContext.getServletConfig();
  33. session=pageContext.getSession();
  34. out=pageContext.getOut();
  35. _jspx_out=out;
  36. out.write("\r\n");
  37. out.write("<html>\r\n");
  38. out.write("<head>\r\n");
  39. out.write("<title>Showtime</title>\r\n");
  40. out.write("</head>\r\n");
  41. out.write("<body>\r\n");
  42. out.write("\tHello:\r\n");
  43. out.write("\t");
  44. SimpleDateFormatformat=newSimpleDateFormat("yyyy/MM/dd");
  45. Stringstr=format.format(newDate());
  46. out.write("\r\n");
  47. out.write("\t");
  48. out.print(str);
  49. out.write("\r\n");
  50. out.write("</body>\r\n");
  51. out.write("</html>");
  52. }catch(Throwablet){
  53. if(!(tinstanceofSkipPageException)){
  54. out=_jspx_out;
  55. if(out!=null&&out.getBufferSize()!=0)
  56. out.clearBuffer();
  57. if(_jspx_page_context!=null)_jspx_page_context.handlePageException(t);
  58. }
  59. }finally{
  60. if(_jspxFactory!=null)_jspxFactory.releasePageContext(_jspx_page_context);
  61. }
  62. }
  63. }

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


  
  1. publicvoid_jspInit(){..}
  2. --当JSP网页一开始执行时,最先执行此方法,执行初始化工作
  3. publicvoid_jspDestory(){...}–JSP网页最后执行的方法
  4. publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)
  5. throwsjava.io.IOException,ServletException{

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

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


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

第二部分:HTML标签


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

第三部分:声明的对象


  
  1. <%
  2. SimpleDateFormatformat=newSimpleDateFormat("yyyy/MM/dd");
  3. Stringstr=format.format(newDate());
  4. %>

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


  
  1. SimpleDateFormatformat=newSimpleDateFormat("yyyy/MM/dd");
  2. Stringstr=format.format(newDate());

第四部分:表达式


  
  1. <%=str%>
  2. out.print(str);//写即打印str变量的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值