JSP简介

 

什么是Java Server Pages?

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

 


为什么使用JSP?

JSP程序与CGI程序有着相似的功能,但和CGI程序相比,JSP程序有如下优势:

  • 性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。
  • 服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。
  • JSP 基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。
  • JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持。

最后,JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。

 


JSP的优势

以下列出了使用JSP带来的其他好处:

  • 与ASP相比:JSP有两大优势。首先,动态部分用Java编写,而不是VB或其他MS专用语言,所以更加强大与易用。第二点就是JSP易于移植到非MS平台上
  • 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句
  • 与SSI相比:SSI无法使用表单数据、无法进行数据库链接。
  • 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是JavaScript很难与服务器交互因此不能提供复杂的服务,比如访问数据库和图像处理等等。
  • 与静态HTML相比:静态HTML不包含动态信息

JSP 结构

网络服务器需要一个 JSP 引擎,也就是一个容器来处理 JSP 页面。容器负责截获对 JSP 页面的请求。例如使用内嵌 JSP 容器的 Apache 来支持 JSP 开发。

JSP 容器与 Web 服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于 JSP 网页的特殊元素。

 

下图显示了 JSP 容器和 JSP 文件在 Web 应用中所处的位置。

 


JSP 处理

以下步骤表明了 Web 服务器是如何使用JSP来创建网页的:

  • 就像其他普通的网页一样,您的web浏览器发送一个 HTTP 请求给服务器

  • Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。通过使用 URL或者 .jsp 文件来完成。

  • JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。这种转化只是简单地将所有模板文本改用 println() 语句,并且将所有的 JSP 元素转化成 Java 代码

  • JSP 引擎将 Servlet 编译成可执行类(xxx.class),并且将原始请求传递给 Servlet 引擎

  • Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。

  • Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。

  • 最终,Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样。

以上提及到的步骤可以用下图来表示:

 

一般情况下,JSP 引擎会检查 JSP 文件对应的 Servlet 是否已经存在,并且检查 JSP 文件的修改日期是否早于 Servlet。如果 JSP 文件的修改日期早于对应的 Servlet,那么容器就可以确定 JSP 文件没有被修改过并且 Servlet 有效。这使得整个流程与其他脚本语言(比如 PHP)相比要高效快捷一些。

总的来说,JSP 网页就是用另一种方式来编写 Servlet 而不用成为 Java 编程高手。除了解释阶段外,JSP 网页几乎可以被当成一个普通的 Servlet 来对待。

 


JSP 生命周期

理解JSP底层功能的关键就是去理解它们所遵守的生命周期。

生命周期 就是从创建到销毁的整个过程.

JSP生命周期类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。

 

以下是JSP生命周期中所走过的几个阶段:

  • 1. 编译阶段

    JSP引擎将JSP元素转化成servlet(Java 代码), 然后servlet容器编译servlet源文件,生成servlet类

  • 2. 初始化阶段

    加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法

  • 3. 执行阶段

    调用与JSP对应的servlet实例的服务方法

  • 4. 销毁阶段

    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

 

很明显,JSP生命周期的四个主要阶段和servlet生命周期非常相似,下面给出图示:

 

 


 

JSP编译

 当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。

 编译的过程包括三个步骤: 

  • 解析JSP文件。
  • 将JSP文件转为servlet。
  • 编译servlet。

 

JSP初始化

 容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了,就像下面这样:

 public void jspInit(){

 // 初始化代码 }

 一般来讲程序只初始化一次,servlet也是如此。通常情况下您可以在jspInit()方法中初始化数据库连接、打开文件和创建查询表。

 

JSP执行 

这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。 

当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。 

_jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数,就像下面这样: 

void _jspService(HttpServletRequest request, HttpServletResponse response) { // 服务端处理代码 }

 

_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。

 

JSP清理 

JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。 

jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。 

jspDestroy()方法的格式如下 :

public void jspDestroy() { // 清理代码 }

 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

实例 

JSP生命周期代码实例如下所示: 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>life.jsp</title> </head> <body> <%! private int initVar=0; private int serviceVar=0; private int destroyVar=0; %> <%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次"); } %> <% serviceVar++; System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求"); String content1="初始化次数 : "+initVar; String content2="响应客户请求次数 : "+serviceVar; String content3="销毁次数 : "+destroyVar; %> <h1>菜鸟教程 JSP 测试实例</h1> <p><%=content1 %></p> <p><%=content2 %></p> <p><%=content3 %></p> </body> </html>

 

浏览器打开该页面,输出结果为:

 

 

相关文章