JSP - 起源、执行过程、运行原理、生命周期

简介: JSP - 起源、执行过程、运行原理、生命周期

一、起源

在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。

如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。  

对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。

为了弥补Servlet的缺陷,SUN公司在Servlet的基础上推出了JSP(Java Server Pages)技术作为解决方案。

JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。

JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp。

在JSP页面中编写的Java代码需要嵌套在<%和%>中,嵌套在<%和%>之间的Java代码被称之为脚本片段(Scriptlets),没有嵌套在<%和%>之间的内容被称之为JSP的模版元素。

JSP中的Java代码可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,也可以使用System.out.println语句将它们打印到命令行窗口。

JSP文件就像普通的HTML文件一样,它们可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态内容,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

Jsp快速入门:在jsp页面中输出当前时间。

不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

其原因为,程序的数据通常要美化后再输出:

让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。

让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示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)。

image.pngimage.png客户端发出请求,请求为JSP,web容器就会找出相应的servlet进行处理。

image.png将servlet转成字节码文件。image.png将字节码文件加载到web容器里。image.png这时会在web容器里建立实例。image.png进行初始化。image.png通过service接受请求。image.png然后web容器会自动产生两个对象servlet和service;最后进行销毁。image.png

三、运行原理

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

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

(3)Tomcat 5把为JSP页面创建的Servlet源文件和class类文件放置在“apache-tomcat-5.5.26\work\Catalina\localhost\<应用程序名>\”目录中,Tomcat将JSP页面翻译成的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)

<%@pagelanguage="java"import="java.util.*"pageEncoding="gb2312"%><html><head><title>简单JSP页面示例</title></head><body>这是一个简单的JSP页面示例——HelloJSP<br></body></html>

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)

importjavax.servlet.*;
importjavax.servlet.http.*;
importjavax.servlet.jsp.*;
importjava.util.*;
publicfinalclassHelloJSP_jspextendsorg.apache.jasper.runtime.HttpJspBaseimplementsorg.apache.jasper.runtime.JspSourceDependent {
privatestaticjava.util.List_jspx_dependants;
publicObjectgetDependants() {
return_jspx_dependants;
  }
publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse) throwsjava.io.IOException,ServletException {
JspFactory_jspxFactory=null;
PageContextpageContext=null;
HttpSessionsession=null;
ServletContextapplication=null;
ServletConfigconfig=null;
JspWriterout=null;
Objectpage=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 (Throwablet) {
if (!(tinstanceofSkipPageException)){
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);
    }
  }
}

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

文件如下:

image.png

四、生命周期

Servlet的生命周期

1)构造方法(第1次访问)

2)init方法(第1次访问)

3)service方法

4)destroy方法

Jsp的生命周期(翻看源码就可以发现jsp的方法和servlet很像)

1)翻译: jsp->java文件

2)编译: java文件->class文件(servlet程序)

3)构造方法(第1次访问)

4)init方法(第1次访问):_jspInit()

5)service方法:_jspService()

6)destroy方法:_jspDestroy()

五、总结

可以发现JSP就是Servlet,以及JSP间接继承了HttpServlet,所以JSP就是Servlet。Servlet的技术都可以用到JSP中,但JSP的技术不全能用到Servlet中。

目录
相关文章
|
8月前
|
存储 缓存 Java
JSP页面生命周期详解及优化建议
JSP页面生命周期详解及优化建议
147 0
|
4月前
|
自然语言处理 Java 数据库连接
探索研究JSP 生命周期
【9月更文挑战第29天】
38 0
|
7月前
|
缓存 小程序 前端开发
Java服务器端技术探秘:Servlet与JSP的核心原理
【6月更文挑战第23天】Java Web开发中的Servlet和JSP详解:Servlet是服务器端的Java小程序,处理HTTP请求并响应。生命周期含初始化、服务和销毁。创建Servlet示例代码展示了`doGet()`方法的覆盖。JSP则侧重视图,动态HTML生成,通过JSP脚本元素、声明和表达式嵌入Java代码。Servlet常作为控制器,JSP处理视图,遵循MVC模式。优化策略涉及缓存、分页和安全措施。这些技术是Java服务器端开发的基础。
74 9
|
7月前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
78 7
|
8月前
|
Java 容器
JSP 教程 之 JSP 生命周期 3
了解JSP生命周期对掌握其核心功能至关重要。它包括编译、初始化、执行和销毁四个阶段。在编译阶段,JSP被转化成servlet源码并编译为类。初始化阶段加载servlet,创建实例并执行初始化方法。执行阶段调用_servletService()处理请求和响应,每次请求都会触发该方法处理GET、POST等HTTP操作。最后,销毁阶段调用servlet的销毁方法并删除实例。
58 2
|
8月前
|
Java 数据库连接 容器
JSP 教程 之 JSP 生命周期 4
JSP生命周期包括编译、初始化、执行和销毁四个阶段。在编译阶段,JSP转换为servlet。初始化阶段加载并实例化servlet。执行阶段调用服务方法响应请求。销毁阶段调用销毁方法,如`jspDestroy()`,用于资源释放。示例代码展示了`jspInit()`、`_jspService()`和`jspDestroy()`方法在生命周期中的应用。浏览器显示初始化、服务请求和销毁的计数。
49 1
|
8月前
|
Java 数据库连接 开发者
JSP 教程 之 JSP 生命周期 2
JSP教程探讨了JSP生命周期,包括编译、初始化、执行和销毁四个阶段。当浏览器请求页面时,JSP引擎可能先编译JSP,将其转化为servlet并执行初始化方法jspInit()。在执行阶段,调用servlet的服务方法。最后,通过调用jspDestroy()销毁servlet实例。开发者可覆盖jspInit()进行自定义初始化操作,如建立数据库连接。
49 1
|
8月前
|
Java 容器
JSP 教程 之 JSP 生命周期 1
**JSP生命周期概览**: JSP的生命周期从编译开始,当需要时,servlet容器将JSP转换为servlet类。接着是初始化,加载servlet并实例化,调用初始化方法。执行阶段涉及调用服务方法响应客户端请求。最后,销毁阶段servlet实例的销毁方法被调用,实例被释放。此过程与servlet生命周期相似,但多了编译步骤。
61 1
|
8月前
|
存储 Java 应用服务中间件
JSP的运行原理是什么?JSP的作用域有哪些?
JSP四大作用域分别为:page、request、session、application。
113 11
|
8月前
|
前端开发 Java 数据库
【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解
【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解