`

容器如何处理JSP——原理及执行流程详解

阅读更多

1、当客户第一次访问Jsp页面时,容器主要按以下流程处理JSP文件。大体流程如下图所示。
   

                                                       图1 JSP总体执行流程图

 

2、执行原理及流程

 

    假设:容器=具体的Jsp引擎(Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面

 

    1)客户通过浏览器向服务器端的JSP页面发送请求。

 

    2)容器接受到客户请求后,会检查JSP文件对应编译后的Servlet文件(.class)是否存在。如果不存在,则跳转到第4)步,否则执行下一步。

 

    3)容器检查JSP页面是否有更新(修改),没有更新,则跳转到第5)步,否则执行下一步。

 

    4)容器将JSP文件转换为Servlet类源文件(.java)。(此步会检查和捕获JSP语法错误)

 

    5)容器将Servlet源文件(.java)编译成相应的字节码(.class)文件。(会检查和捕获Java语法错误)

 

    6)容器将字节码(.class)文件加载到内存。

 

    7)容器实例化Servlet(调用构造函数),然后调用初始化方法(jspInit())初始化Servlet。到此为止,Servlet对象真正成为一个Servlet,准备就绪,可以处理客户的请求了。

 

    8)容器创建一个新的线程来运行Servlet并运行Servlet的_jspService()方法处理客户的请求。

 

    9)Servlet生成并向客户返回一个响应(或把请求转发给另一个Web应用组件处理)。

 

3、流程补充说明

 

    1)按照容器处理Jsp的流程,通常可以大体分为两个时期:转译时期(Translate Time)和请求时期(Request Time)。

 

        a)转译时期:将Jsp文件转换成Servlet类 。

        b)请求时期:使用Servlet处理请求并把响应返回客户端。

 

    而转译时期具体包含转换和编译工作

        a)转换:将JSP文件转换为Servlet类源文件(.java)。(此步会检查和捕获JSP语法错误)

        b)编译:将Servlet源文件(.java)编译成字节码(.class)文件。(会检查和捕获Java语法错误)

 

    2) 容器在转译时期的转换工作主要包括哪些呢?

 

        a)容器(Jsp引擎)查看Jsp指令(page、include及taglib),得到转换时可能需要的信息。

        b)容器创建一个HttpServlet子类。生成的Servlet一般继承org.apache.jasper.runtime.HttpJspBase。

        c)如果page指令带有import属性,则容器会在类文件的pagekage语句下面插入import语句。在Tomcat5中,pagekage语句为:package org.apache.jsp。

        d)如果有声明(<%! %>标志的内容以及容器自己的声明),容器会将声明作为实例变量写到类文件中,通常是类声明下面,service()方法前面。

        e)容器建立_jspService()服务方法。所生成Servlet的_jspService()方法会覆盖超类的service()方法,而且通过超类的service()方法调用,由超类的service()方法传入请求和响应参数。于此同时,容器会声明并初始化Jsp中的所有隐式(内置)对象。

        f)容器将普通的Html(模板文件)、scriptlet(脚本文件)和表达式放到jsp_Service()方法中,并最终写到PrintWriter响应输出。

 

    实例参考:一个简单的Jsp文件转换为Servlet文件

    Jsp源文件:index.jsp   

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ page import="com.linwei.model.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP page</title>
  </head>
  <body>
    <%! 
    	int count=0;
        public int doubleCount(){
        	return count*2;
        }
    %>
    The page count is now:<%=++count %>
    <br>
    doubleCount:<%= doubleCount()%>
    <br>
    <%  
        String localVar = "World";
    	Person p=new Person();
        p.setName("Hello");
    %>
    person.name:<%=p.getName() %>
    <br>
    localVar:<%=localVar %>
    <br>
    Today is:<%= new Date()%>
  </body>
</html>

   

   编译后形成的Servlet文件:index_jsp.java

package org.apache.jsp;   //容器生成的package语句

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import com.linwei.model.*; //自定义导入的包

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  //Jsp中定义的全局变量=Servlet类的实例变量
  int count=0;

  //Jsp中定义的方法=Servlet类的方法
  public int doubleCount(){
	return count*2;
  }
    
  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.AnnotationProcessor _jsp_annotationprocessor;

  public Object getDependants() {
    return _jspx_dependants;
  }
  
  //初始化方法
  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  }
  
  //销毁方法
  public void _jspDestroy() {
  }
  
  //服务方法
  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {
    
   //以下是容器生成的一系列Jsp隐式(内置)对象
    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 {
	  //设置响应内容类型
      response.setContentType("text/html;charset=ISO-8859-1");
	  //实例化各种隐式(内置)对象
      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;
	  
      //普通的Html模板文件
       out.write("\r\n");
      out.write("\r\n");
      
      //scriptlet脚本代码(Java语句)
       String path = request.getContextPath();
      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("  <head>\r\n");
      //表达式
       out.write("    <base href=\""); 
      out.print(basePath);
      out.write("\">\r\n");
      out.write("    <title>My JSP page</title>\r\n");
      out.write("  </head>\r\n");
      out.write("  <body>\r\n");
      out.write("    ");
      out.write("\r\n");
      out.write("    The page count is now:");
      //实例变量
       out.print(++count ); 
      out.write("\r\n");
      out.write("    <br>\r\n");
      out.write("    doubleCount:");
      //调用方法
       out.print( doubleCount());
      out.write("\r\n");
      out.write("    <br>\r\n");
      out.write("    ");
      
      //局部变量
       String localVar = "World"; 
      Person p=new Person();
      p.setName("Hello");
    
      out.write("\r\n");
      out.write("    person.name:");
      out.print(p.getName() );
      out.write("\r\n");
      out.write("    <br>\r\n");
      out.write("    localVar:");
      out.print(localVar );
      out.write("\r\n");
      out.write("    <br>\r\n");
      out.write("    Today is:");
      out.print( new Date());
      out.write("\r\n");
      out.write("  </body>\r\n");
      out.write("</html>\r\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

   

    3)容器转译(转换和编译)Jsp的工作只发生一次,即容器第一次收到客户的Jsp请求时。Jsp转译后就成为一个“Servlet”对象(初始化前还只是一个普通的Java对象)了。一旦Servlet得到加载和初始化,当有新的请求到达时,容器要做的就是创建或分配一个线程来运行service()方法并处理请求,然后返回响应。

 

  • 大小: 53.9 KB
分享到:
评论

相关推荐

    Servlet JSP深入详解 基于Tomcat的Web开发

    ### Servlet与JSP深入详解:基于Tomcat的Web开发 #### 一、Servlet技术概述 Servlet是一种用Java编写的服务器端应用程序接口(API),它扩展了Java Web开发的功能。Servlet可以响应HTTP请求,并且能够处理复杂的...

    JSP源码——网站RSS订阅功能插件RSSMaker JSP版 v1.0_rssmaker_jsp.zip

    **JSP源码详解——RSSMaker JSP版 v1.0** RSS(Really Simple Syndication)是一种用于发布和聚合Web内容的XML格式,它允许用户通过RSS阅读器或聚合器订阅网站更新,无需频繁访问网站。RSSMaker JSP版 v1.0是一个...

    how tomcat works——(5)容器

    《Tomcat工作原理详解——(5)容器》 在深入探讨Tomcat的工作原理时,我们不得不提到一个核心概念——容器。Tomcat作为一个流行的开源Java Servlet容器,它的内部架构设计是理解其高效运行的关键。本篇将详细介绍...

    JSP源码——[整站程序]8优技巧网_8ujq.zip

    【JSP源码详解——构建高效网站的基石】 JSP(JavaServer Pages)是一种由Sun Microsystems公司推出的动态网页开发技术,它将Java代码嵌入到HTML文档中,以实现服务器端的动态网页生成。"8优技巧网_8ujq.zip"这个...

    独门架构——JavaWeb开发应用详解(电子版)

    《独门架构——JavaWeb开发应用详解》是一本深度探讨JavaWeb开发技术的专业书籍,旨在帮助已经具备Java基础知识的学习者和开发者进一步提升在Web领域的专业技能。本书详细讲解了JavaWeb开发中的各种核心概念、技术和...

    JSP毕业设计——JSP网上教学资源共享系统(源代码+论文).zip

    7. **Web容器**:例如Tomcat,是运行JSP应用的必要环境,理解其工作原理和配置方法。 8. **安全性**:如何在JSP应用中实施基本的安全措施,如防止SQL注入、XSS攻击等。 9. **响应式设计**:考虑到教学资源共享系统...

    tomcat工作原理深入详解——HowTomcatWorks中文版.pdf

    容器则负责调用servlet的service方法,执行更多的预处理任务,如加载servlet、验证用户、管理会话等。 Catalina的架构是模块化和优雅设计的体现,图示中的架构图仅展示了简化版。实际上,容器内部包含了多个子模块...

    JSP源码——[信息办公]iCan网络秘书_ican.zip

    【JSP源码详解——构建信息办公系统】 JSP(JavaServer Pages)是Java平台上的一个服务器端脚本语言,用于开发动态Web应用程序。在这个名为"ICan网络秘书"的项目中,我们看到了JSP技术在信息办公领域的应用。源码...

    神兵利器——Eclipse开发技术详解(电子版)

    总之,《神兵利器——Eclipse开发技术详解》一书将深入探讨Eclipse的各项核心功能,通过实例解析和实践指导,帮助读者掌握Eclipse在Java开发中的应用,提升开发效率,优化开发流程。无论你是初学者还是经验丰富的...

    JSP源码——通用的在线考试系统(jsp+struts+hibernate+oracle).zip

    《基于JSP的通用在线考试系统详解》 本项目是一个基于JSP的通用在线考试系统,采用经典的SSH(Struts + Spring + Hibernate)框架进行开发,并结合Oracle数据库存储数据,展现了Web开发中的常见技术和架构模式。...

    JSP源码——企业级新闻系统(SSH+MYSQL).zip

    综上所述,"JSP源码——企业级新闻系统(SSH+MYSQL).zip"提供的是一套完整的Java Web应用解决方案,它涵盖了前端展示、后端逻辑处理、数据库交互等多个层面,对于学习和理解企业级应用开发具有很高的参考价值。

    JSP源码——[信息办公]个人求职管理系统_jobgljsp.zip

    【JSP源码详解——构建个人求职管理系统】 JSP(JavaServer Pages)是一种基于Java技术的服务器端脚本语言,用于开发动态Web应用程序。在这个"信息办公"个人求职管理系统_jobgljsp项目中,开发者利用JSP的优势,...

    JSP源码——[信息办公]凯撒java版SaaS OA协同办公软件 v2.0_saas-oa.zip

    【JSP源码详解——构建SaaS OA协同办公软件】 JSP(JavaServer Pages)是一种由Sun Microsystems公司推出的技术,用于动态生成Web页面。在【信息办公】凯撒java版SaaS OA协同办公软件 v2.0_saas-oa.zip这个压缩包中...

    web学习笔记 —— jsp内置对象

    **JSP内置对象详解** 在JavaServer Pages (JSP)技术中,内置对象是指由JSP引擎自动创建并提供给开发者使用的对象,无需通过new关键字显式实例化。这些对象为开发人员提供了便利,帮助他们简化Web应用的开发流程。本...

    jsp毕业设计——JSP网上教学资源共享系统(源代码+论文).zip

    JSP文件会被Web容器(如Tomcat)转换为Servlet,然后编译成Java字节码执行。这种模型使得JSP能够高效地处理动态内容,同时也具备了Java的跨平台优势。 【毕业设计中的关键元素】 1. **数据库设计**:一个教学资源...

    JSP源码——[新闻文章]永恒文章管理系统(YHCMS) v2.0 源码版_yhcms_v20_src.zip

    【JSP源码详解——永恒文章管理系统YHCMS v2.0】 JSP(JavaServer Pages)是一种基于Java技术的动态网页开发技术,它允许开发者将静态HTML与动态Java代码结合,以创建交互式Web应用。永恒文章管理系统YHCMS v2.0是...

    用JSP+JavaBean+Servlet开发的数据库应用实例——CD管理系统

    《JSP+JavaBean+Servlet开发的CD管理系统详解》 在Web开发领域,JSP(JavaServer Pages)、JavaBean和Servlet是三个核心组件,它们共同构建了动态网站的基础架构。本篇文章将深入探讨如何利用这三者来开发一个实用...

Global site tag (gtag.js) - Google Analytics