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()方法并处理请求,然后返回响应。
相关推荐
### Servlet与JSP深入详解:基于Tomcat的Web开发 #### 一、Servlet技术概述 Servlet是一种用Java编写的服务器端应用程序接口(API),它扩展了Java Web开发的功能。Servlet可以响应HTTP请求,并且能够处理复杂的...
**JSP源码详解——RSSMaker JSP版 v1.0** RSS(Really Simple Syndication)是一种用于发布和聚合Web内容的XML格式,它允许用户通过RSS阅读器或聚合器订阅网站更新,无需频繁访问网站。RSSMaker JSP版 v1.0是一个...
《Tomcat工作原理详解——(5)容器》 在深入探讨Tomcat的工作原理时,我们不得不提到一个核心概念——容器。Tomcat作为一个流行的开源Java Servlet容器,它的内部架构设计是理解其高效运行的关键。本篇将详细介绍...
【JSP源码详解——构建高效网站的基石】 JSP(JavaServer Pages)是一种由Sun Microsystems公司推出的动态网页开发技术,它将Java代码嵌入到HTML文档中,以实现服务器端的动态网页生成。"8优技巧网_8ujq.zip"这个...
《独门架构——JavaWeb开发应用详解》是一本深度探讨JavaWeb开发技术的专业书籍,旨在帮助已经具备Java基础知识的学习者和开发者进一步提升在Web领域的专业技能。本书详细讲解了JavaWeb开发中的各种核心概念、技术和...
7. **Web容器**:例如Tomcat,是运行JSP应用的必要环境,理解其工作原理和配置方法。 8. **安全性**:如何在JSP应用中实施基本的安全措施,如防止SQL注入、XSS攻击等。 9. **响应式设计**:考虑到教学资源共享系统...
容器则负责调用servlet的service方法,执行更多的预处理任务,如加载servlet、验证用户、管理会话等。 Catalina的架构是模块化和优雅设计的体现,图示中的架构图仅展示了简化版。实际上,容器内部包含了多个子模块...
【JSP源码详解——构建信息办公系统】 JSP(JavaServer Pages)是Java平台上的一个服务器端脚本语言,用于开发动态Web应用程序。在这个名为"ICan网络秘书"的项目中,我们看到了JSP技术在信息办公领域的应用。源码...
总之,《神兵利器——Eclipse开发技术详解》一书将深入探讨Eclipse的各项核心功能,通过实例解析和实践指导,帮助读者掌握Eclipse在Java开发中的应用,提升开发效率,优化开发流程。无论你是初学者还是经验丰富的...
《基于JSP的通用在线考试系统详解》 本项目是一个基于JSP的通用在线考试系统,采用经典的SSH(Struts + Spring + Hibernate)框架进行开发,并结合Oracle数据库存储数据,展现了Web开发中的常见技术和架构模式。...
综上所述,"JSP源码——企业级新闻系统(SSH+MYSQL).zip"提供的是一套完整的Java Web应用解决方案,它涵盖了前端展示、后端逻辑处理、数据库交互等多个层面,对于学习和理解企业级应用开发具有很高的参考价值。
【JSP源码详解——构建个人求职管理系统】 JSP(JavaServer Pages)是一种基于Java技术的服务器端脚本语言,用于开发动态Web应用程序。在这个"信息办公"个人求职管理系统_jobgljsp项目中,开发者利用JSP的优势,...
【JSP源码详解——构建SaaS OA协同办公软件】 JSP(JavaServer Pages)是一种由Sun Microsystems公司推出的技术,用于动态生成Web页面。在【信息办公】凯撒java版SaaS OA协同办公软件 v2.0_saas-oa.zip这个压缩包中...
**JSP内置对象详解** 在JavaServer Pages (JSP)技术中,内置对象是指由JSP引擎自动创建并提供给开发者使用的对象,无需通过new关键字显式实例化。这些对象为开发人员提供了便利,帮助他们简化Web应用的开发流程。本...
JSP文件会被Web容器(如Tomcat)转换为Servlet,然后编译成Java字节码执行。这种模型使得JSP能够高效地处理动态内容,同时也具备了Java的跨平台优势。 【毕业设计中的关键元素】 1. **数据库设计**:一个教学资源...
【JSP源码详解——永恒文章管理系统YHCMS v2.0】 JSP(JavaServer Pages)是一种基于Java技术的动态网页开发技术,它允许开发者将静态HTML与动态Java代码结合,以创建交互式Web应用。永恒文章管理系统YHCMS v2.0是...
《JSP+JavaBean+Servlet开发的CD管理系统详解》 在Web开发领域,JSP(JavaServer Pages)、JavaBean和Servlet是三个核心组件,它们共同构建了动态网站的基础架构。本篇文章将深入探讨如何利用这三者来开发一个实用...