首页 > 技术文章 > Jsp介绍(1)

ipetergo 2017-03-12 09:09 原文

JSP(Java Server Pages)
是运行在服务端的语言
是一种动态网页开发技术
它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
是一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。
JSP文件后缀名为(*.jsp)。
JSP开发的WEB应用可以跨平台使用,既可以运行在Linux上也能运行在Window上。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
JSP基于Java Servlets API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。

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

 

JSP 结构

网络服务器需要一个JSP引擎,也就是一个容器来处理JSP页面。容器负责截获对JSP页面的请求。

JSP处理

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

  • 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
  • Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
  • JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
  • JSP引擎将servlet编译成可执行类,并且将原始请求传递给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 生命周期

     

    JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。

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

    • 编译阶段:

      servlet容器编译servlet源文件,生成servlet类

    • 初始化阶段:

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

    • 执行阶段:

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

    • 销毁阶段:

      调用与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" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'MyJsp.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </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;
      %>
      <h2>test jsp</h2>
      <P><%=content1 %></P>
      <P><%=content2 %></P>
      <P><%=content3 %></P>
  </body>
</html>

  JSP语法:

JSP声明

一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。

JSP声明的语法格式:

<%! declaration; [ declaration; ]+ ... %>


JSP表达式

一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。

由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。

表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。

JSP表达式的语法格式:

<%= 表达式 %>

JSP指令

 

 


 

推荐阅读