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中。

目录
相关文章
|
2月前
|
存储 缓存 Java
JSP页面生命周期详解及优化建议
JSP页面生命周期详解及优化建议
|
6月前
|
Java
18JavaWeb基础 - 图解JSP输出缓冲区原理
18JavaWeb基础 - 图解JSP输出缓冲区原理
20 0
|
7月前
|
XML Java 数据库连接
jsp访问原理和跳转流程
jsp访问原理和跳转流程
61 0
|
3月前
|
前端开发 JavaScript Java
基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】
基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】
|
4月前
|
存储 Java
JSP原理以及基本语法
JSP原理以及基本语法
|
9月前
|
前端开发 Java 关系型数据库
欢迎来到Jsp编程课时十三——分解原理:构建自己的思路,目标更好的理解对数据的增伤改查的原理和过程。
欢迎来到Jsp编程课时十三——分解原理:构建自己的思路,目标更好的理解对数据的增伤改查的原理和过程。
72 0
|
Java 容器
jsp生命周期
jsp生命周期
64 0
|
小程序 Java 应用服务中间件
jsp 的运行原理
jsp 的运行原理
jsp 的运行原理
|
Java 容器
JSP 生命周期
JSP 生命周期
55 0
|
Java 应用服务中间件
使用最新版IDEA(21.3.2)创建一个最小的JAVAWEB应用(JSP,Servlet运行方法)
1.IDEA内创建一个基于Tomcat的项目 首先新建一个普通的项目
231 1
使用最新版IDEA(21.3.2)创建一个最小的JAVAWEB应用(JSP,Servlet运行方法)