JSP运行原理及运行过程

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hanxuemin12345/article/details/23831645

学习J2EE时,初步了解了JSP,写过一篇小的总结:J2EE-JSP,当时还不是很了解它的运行机制。

学习DRP时,再次接触了JSP,在原来基础上有了更深的了解,了解了它的执行原理

1JSP的运行原理

1WEB容器JSP页面的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。

2)每个JSP页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着把这个Servlet源程序编译成Servletclass类文件,然后再由WEB容器像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

3Tomcat 5把为JSP页面创建的Servlet源文件和class类文件放置在“apache-tomcat-5.5.26\work\Catalina\localhost\<应用程序名>\”目录中,TomcatJSP页面翻译成的Servlet的包名为org.apache.jsp(即:apache-tomcat-5.5.26\work\Catalina\localhost\org\apache\jsp\文件下)

例子:

HelloJSP.jsp:(文件目录:D:\apache-tomcat-5.5.26\webapps\test_jsp\HelloJSP.jsp

<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@pagelanguage="java"import="java.util.*"pageEncoding="gb2312"%>
<html>
<head>
          <title>简单JSP页面示例</title>
</head>
<body>
这是一个简单的 JSP页面示例——HelloJSP <br>
</body>
</html></span>

HelloJSP.jsp页面被请求时,Web服务器中JSP编译器会编译生成对应的Java文件,如下:

 

HelloJSP_jsp.java:(文件目录:D:\apache-tomcat-5.5.26\work\Catalina\localhost\test_jsp\org\apache\jsp\HelloJSP_jsp.java)

 

<span style="font-family:KaiTi_GB2312;font-size:18px;">packageorg.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
public final class HelloJSP_jsp extendsorg.apache.jasper.runtime.HttpJspBase
    implementsorg.apache.jasper.runtime.JspSourceDependent {
private static java.util.List _jspx_dependants;
public Object getDependants() {
    return _jspx_dependants;
  }
public void _jspService(HttpServletRequest request,HttpServletResponse response)
        throws java.io.IOException,ServletException {
JspFactory _jspxFactory = null;
    PageContext pageContext =null;
    HttpSession session =null;
    ServletContext application =null;
    ServletConfig config =null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out =null;
    PageContext _jspx_page_context =null;
try {
      _jspxFactory =JspFactory.getDefaultFactory();
     response.setContentType("text/html;charset=gb2312");
      pageContext =_jspxFactory.getPageContext(this, request, response,
                             null,true, 8192, true);
      _jspx_page_context =pageContext;
      application =pageContext.getServletContext();
      config =pageContext.getServletConfig();
      session =pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
out.write("\r\n");
     out.write("<html>\r\n");
     out.write("\t<head>\r\n");
      out.write("   \t<title>简单JSP页面示例</title>\r\n");
     out.write("\t</head>\r\n");
     out.write("<body>\r\n");
      out.write("\t这是一个简单的JSP页面示例――HelloJSP <br>\r\n");
      out.write("\t</body>\r\n");
     out.write("</html>\r\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null &&out.getBufferSize() != 0)
          out.clearBuffer();
        if (_jspx_page_context != null)_jspx_page_context.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null)_jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}</span>


上面这段代码就是HelloJSP.jsp编译生成的Java代码它的路径(我的电脑)为:D:\apache-tomcat-5.5.26\work\Catalina\localhost\test_jsp\org\apache\jsp(其中:test_jsp为我的项目名称)。在这个目录下有两个对应的文件,一个是class文件一个是java

文件如下:


2JSP的执行过程

JSP的执行过程主要可以分为以下几点:

1)客户端发出请求。

2Web容器将JSP转译成Servlet源代码。

3Web容器将产生的源代码进行编译。

4Web容器加载编译后的代码并执行。

5)把执行结果响应至客户端。


3,总结

JSP执行过程:

1)首先,客户端发出请求(request ),请求访问JSP网页

2)接着,JSP Container将要访问的.JSP文件 转译Servlet的源代码(.java文件)

3)然后,将产生的Servlet的源代码(.java文件)经过编译,生成.class文件,并加载到内存执行

4)最后把结果响应(response )给客户端

   执行JSP网页文件时,需要经过两个时期:转译时期(TranslationTime)请求时期(RequestTime)

   转译时期:JSP转译成Servlet(.class文件)

   请求时期:Servlet(.class文件)执行后,响应结果至客户端。

  转译期间主要做了两件事情:

   (1)JSP网页转译为Servlet源代码(.java),此段称为转译时期(Translation time)

   (2)Servlet源代码(.java)编译成Servlet(.class),此阶段称为编译时期(Compilation time)

其实,JSP就是一个Servlet。

展开阅读全文

没有更多推荐了,返回首页