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. import javax.servlet.*;
  4. import javax.servlet.http.*;
  5. import javax.servlet.jsp.*;
  6. import java.text.*;
  7. import java.util.*;;
  8. public final class showdate_jsp extends org.apache.jasper.runtime.HttpJspBase
  9. implements org.apache.jasper.runtime.JspSourceDependent {
  10. private static java.util.List _jspx_dependants;
  11. public Object getDependants() {
  12. return _jspx_dependants;
  13. }
  14. public void _jspService(HttpServletRequest request, HttpServletResponse response)
  15. throws java.io.IOException, ServletException {
  16. JspFactory _jspxFactory = null;
  17. PageContext pageContext = null;
  18. HttpSession session = null;
  19. ServletContext application = null;
  20. ServletConfig config = null;
  21. JspWriter out = null;
  22. Object page = 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>Show time</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. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
  45. String str = format.format(new Date());
  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 (Throwable t) {
  53. if (!(t instanceof SkipPageException)){
  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. 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. out.write("\r\n");
  8. out.write("<html>\r\n");
  9. out.write("<head>\r\n");
  10. out.write("<title>Show time</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. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
  3. String str = format.format(new Date());
  4. %>

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

  1. SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
  2. String str = format.format(new Date());

第四部分:表达式

  1. <%=str %>
  2. out.print(str ); //写即打印str变量的值
时间: 2024-11-07 12:40:58

JSP转译成Servlet详细过程的相关文章

jsp页面编译成Servlet类文件

package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import java.util.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase     implements org.apache.jasper.runtime.JspSource

jsp被转成servlet后eclipse把这个servlet放在哪个目录下呢?

马 克-to-win:(视频下载) (全部书籍)对于学有余力的同学,我最后再延伸讲一点.Eclipse运行jsp的时候,先把它变成一个servlet(发生在第一次访问jsp时).eclipse把这个servlet放在哪个目录下呢?我们可以按照下面的步骤找到它:右击项目/Run as/Run Configuration找到你的Tomcat Server/Argument其中找到deploy这个参数,它清清楚楚的标明,你的Servlet项目被部署到哪个目录下了!到那个目录附近,耐心打 开每个目录.仔

jsp页面转发到servlet

一个简单的例子来了解一下jsp页面转发到servlet的过程,环境 eclipse.tomcat 1.工程目录结构如下 2.各部分代码如下 1>index.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML

JSP编译成Servlet(四)JSP与Java行关系映射

我们知道java虚拟机只认识class文件,要在虚拟机上运行就必须要遵守class文件格式,所以JSP编译成servlet后还需要进一步编译成class文件,但从JSP文件到java文件再到class文件的过程需要考虑的事情比较多,其中一个比较重要的就是调试问题,由于语法不一样,jsp某行执行的逻辑怎样与java文件对应起来,这样在JVM执行过程发生异常或错误才能找到JSP对应的行,提供一个友好的调试信息.类似的,jsp文件名编译后的java文件名同样也要有映射关系. 总的来说,为了解决从非ja

网站渗透测试原理及详细过程

网站渗透测试原理及详细过程 渗透测试(Penetration Testing)目录 零.前言一.简介二.制定实施方案三.具体操作过程四.生成报告五.测试过程中的风险及规避参考资料FAQ集 零.前言 渗透测试在未得到被测试方授权之前依据某些地区法律规定是违法行为. 这里我们提供的所有渗透测试方法均为(假设为)合法的评估服务,也就是通常所说的道德黑客行为(Ethical hacking),因此我们这里的所有读者应当都是Ethical Hackers,如果您还不是,那么我希望您到过这里后会成为他们中的

Tomcat(三):tomcat处理连接的详细过程

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h

库存物资管理系统代码,详细过程和总结

库存物资管理系统实验要求如下: 1.背景资料 1.有一个存放商品的仓库,每天都有商品出库和入库.2.每种商品都有名称.生产厂家.型号.规格等.3.出入库时必须填写出入库单据,单据包括商品名称.生产厂家.型号.规格.数量.日期.时间.入库单位(或出库单位)名称.送货(或提货)人姓名.2.系统要求与功能设计2.1页面要求(1)能够在Tomcat服务器中正确部署,并通过浏览器查看:(1分)(2)网站页面整体风格统一:2.2设计要求1.设计出入库单据的录入.2.实现按商品名称.出入库日期的查询. 3.评

只用jsp实现同样的Servlet功能

Jsp最终都会转化成java形式的Servlet执行,因此也可以说Jsp的本质就是Servlet,在jsp执行后,会在服务器上(例如tomcat中)生成.java以及.class文件.具体执行过程如下: Fig.1 Jsp的执行过程 Fig.2 Jsp具体执行过程 如图所示,Servlet能实现的功能,Jsp也能实现. 举个简单的例子,之前我用jsp显示前端+Servlet实现后端逻辑,这里我把逻辑实现也用Jsp实现: <body> <form action="ResultJs

mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)

继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-web 2.修改web.xml,配置启动Spring容器 3.新建BookServer 4.新建BookServlet 5.修改ApplicationContext.xml 6.测试 继续!!! 五.使用监听器启动Spring容器 1.修改pom.xml,添加Spring-web包(注:上一篇中的pom