一. JSP简介
JSP(Java Server Pages)是由Sun公司倡导、多家公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。
JSP是一种实现普通静态HTML和动态部分混合编码的技术。JSP设计的目的在于简化表示层的表示。JSP并没有增加任何本质上不能用Servlet实现的功能。
二. JSP 的执行过程
当用户访问JSP页面时,JSP页面的处理过程如图所示。
1). 当客户第一次请求JSP页面时,JSP引擎会通过预处理把JSP文件中的静态数据(HTML文本)和动态数据(Java脚本)全部转换为Java代码。这个转换工作非常直观,对于HTML文本只是简单的用out.println()方法包裹起来,对于Java脚本只是保留或做简单的处理。
2). JSP引擎把生成的.java文件编译成Servlet类文件(.class)。
3). 编译后的class对象被加载到容器中,并根据用户的请求生成HTML格式的响应页面。
在执行JSP网页时,通常可分为两个时期:转译时期(Translation Time)和请求时期(Request Time)。在转译时期,JSP网页被转译成Servlet类,然后被编译成类文件;在请求时期,Servlet类执行后,响应结果至客户端。整个过程如图所示。
尽管JSP文件看起来更像是HTML文件而不是Servlet文件,但事实上它将转换为Servlet文件,其中的静态HTML仅仅用来输出Servlet服务方法返回的信息。如果JSP页面已经被转换为Servlet且该Servlet被编译进而被转载(在第一次被请求时),这样再次请求次JSP页面时,将感觉不到延迟。
三. JSP页面的结构
构造一个JSP页面,除了可内嵌规则的HTML代码之外,还有三类主要的JSP元素:脚本元素(Scripting Element),指令(Directive)和动作(Action)。脚本元素用来嵌入Java代码,这些Java代码将成为转换得到的Servlet的一部分;指令用来从整体上控制Servlet的结构;动作用来引入现有的组件来控制Web容器的行为。
1. 脚本元素
脚本元素(Scripting Element)包含三个部分:Scriptlet、Expression(表达式)和Declaration(声明)。
Scriptlet元素允许Java代码被直接嵌入到JSP页面。
Expression元素是Java语言表达式,它的值用于计算以及作为字符串返回到页面。
Declaration元素用于声明在页面中初始化的变量、方法和类。
1). Scriptlet元素
语法:<% code %>
功能:Scriptlet中可以包含有效的程序片段,只要是合乎Java本身的标准语法即可。通常主要的程序也是写在这里,Scriptlet是以<%为开始,%>为结尾。
注意:编译JSP时,编译器在_jspService()方法中只是简单地不做修改地包含Scriptlet的内容。
Scriptlet能够包含多个语句,方法,变量,表达式,可以完成以下功能。
(1) 声明将要用到的变量或方法;
(2)显示出表达式;
(3)使用任何隐含对象和使用<jsp:useBean>声明过的对象;
(4)当JSP收到客户端的请求时,Scriptlet就好被执行,如同Servlet的doGet()和doPost()。
2). Expression元素
语法:<%=expression %>
功能:JSP提供了一种简单方法访问可用的Java变量和Java表达式,并生成页面HTML字符串。Expression元素是以<%=为开始,%>为结尾的,其中内容包含一段合法Java的表达式。
注意:
(1)表达式会被自动转化为字符串然后显示出来;
(2)<%与=之间不能有空格;
(3)表达式不能以分号结尾。
3). Declaration元素
语法:<%!declaration;%>
功能:在JSP程序中声明变量、方法和类。声明是以<%!为开始,%>为结尾的。
注意:
(1)编译JSP时,scriptlet生成了_jspService()方法的一部分,而Declaration(声明)却生成于_jspService()方法之外,与源文件合为一起。使用<%! %>方式所声明的变量为全局变量,即表示若同时有n个用户在执行此JSP网页时会共享此变量。因此应尽量少用声明变量,若要使用变量时,直接在Scriptlet之中声明使用即可;
(2)每一个声明仅在一个页面中有效,如果要在每个页面都用到一些声明,最好把它们写成一个单独的JSP网页,然后用<%@include%>或<jsp:include >元素包含进来;
(3)<%与!之间不能有空格;
(4)Declaration元素必须是完整的Java语句,以分号结尾,和Scriptlet元素一样;
(5)Declaration元素不能产生任何输出,而Scriptlet和Expression元素可以产生输出。
2. 指令
JSP指令负责发送消息到JSP引擎,不包含业务逻辑,不修改out流,只是告诉JSP引擎JSP页面应该如何编译。JSP指令的作用范围仅限于包含指令本身的JSP页面。JSP指令的语法如下:
<%@directive attribute="attribute value"%>
JSP指令可有三种类型:page指令、include指令和taglib指令。
1). page指令
page指令定义了一些属性,通知关于JSP页面一般设置的Servlet引擎的属性。page指令可以指出的属性如下:
language=”ScriptLanguage”:指定JSP Container用什么语言来编译,目前只支持JAVA语言。默认为JAVA
extends=”className”:定义此JSP网页产生的Servlet是继承哪个
import=”importList”:定义此JSP网页要使用哪些Java API
session=”true|false”:决定此页面是否使用session对象。默认为true
buffer=”none|size in kb”:决定输出流(Input stream)是否又缓冲区。默认为8kb
autoFlush=”true|false”:决定输出流的缓冲区慢了后是否需要自动清除,缓冲区慢了后会产生异常错误(Exception),默认为true
isThreadSafe=”true|false”:是否支持线程。默认为true
errorPage=”url”:如果此页发生异常,网页会重新指向一个url
isErrorPage=”true|false”:表示此页面是否为错误处理页面。默认为false
contentType=”text/html;charset=gb2312”:表示MIME类型和JSP的编码方式
pageEncoding=”ISO-8859-1”:编码方式
isELLgnored=”true|false”:表示是否在此JSP页面中EL表达式。true则忽略,反之false则支持。默认为false
page指令是针对当前页面的指令,常用的page指令有8个:
<%@page language="java"%>:设置jsp中用到的语言,用到的是java,也是目前唯一有效的设定
<%@page extends="mypackage.myclass"%>:设置目前jsp要继承的父类,一般不需要设置,在默认情况下,jsp页面默认的父类是HttpJspBase
<%@page import="java.sql.*"% >: jsp页面所用到的类
<%@page errorPage="error.jsp"%>:设置该jsp页面出现异常时所要转到的页面,如果没设定,容器将使用当前的页面显示错误信息
<%@page isErrorPage="true"%>:设置该jsp页面是否作为错误显示页面,默认是false,如果设置为true,容器则会在当前页面生成一个exception对象,和errorPage配合使用
<%@page contentType="text/html;charset=gb2312"%>:设置页面文件格式和编码方式
<%@page isThreadSafe="true"% >:设置容器以多线程还是单线程运行该jsp页面,默认是true,是多线程。设置为false,则以单线程的方式运行该jsp页面
<%@page session="true"% >:设置该jsp页面是否可以用到session对象(jsp内置对象,为web容器创建),默认是true,能用到session。设置为false,则用不到
<@ page %>指令作用于整个JSP页面,同样包含静态的包含文件。但是<%@page%>指令不能作用于动态的包含文件。可以在一个页面中引用多个<%@ page %>指令,但是除了import属性能多次使用之外,其他的属性都只能用一次。<%@ page %>指令可以放在JSP文件的任何地方,但是为了JSP程序的可读性及养成好的编程习惯,最好还是放在JSP文件的顶部。
2). include指令
用include指令指出编译JSP页面时要插入的文件名(以相对URL形式),所以被包括的文件内容成为JSP页面的一部分。include指令也可以用来插入为多页面所公用的部分代码,以避免对每个代码实例单独使用bean。通过include指令包含的文件是由JSP分析的,并且这部分分析工作是在转换阶段,即在JSP被编译为Servlet是进行的。
3. 动作
JSP动作不同于JSP指令,它利用XML语法格式的标记来控制Servlet引擎的行为。JSP动作可以改变out流,以及创建和使用对象。遵循XML标准,JSP动作也可以有属性。有2个属性是所有JSP动作共有的:
id属性:唯一地标识JSP动作,这就允许在JSP页面内引入动作。
scope属性:标识JSP动作的生命期。scope属性有4个可能的值:page、request、session、和application。
id属性和scope属性直接相关,因为scope属性决定与id相关联的对象的生命期。
JSP动作的语法如下:
<jsp:action attribute="attribute value"/>
JSP动作可以分为两类:Resource动作和JavaBean动作。
1). Resource动作
<jsp:include>
可以用于将静态和动态页面插入当前页面,include动作的语法如下:
<jsp:include page="URL" flush="true"/>
这里的flush参数必须为true。
注意:include动作和include指令有很大的不同。include动作在执行时才对包含的文件进行处理,如果对包含的文件进行了修改,那么运行时可以看到所包含文件修改后的结果。而include指令包含的文件如果发生了变化,必须重新将JSP文件编译为Servlet文件才能看到所包含文件修改后的结果。
<jsp:forward>
终止当前页面的动作并将请求转发到另一个资源。
<jsp:plugin>
根据浏览器的类型,插入通过Java插件运行Java Applet所必须的OBJECT和EMBED元素。
2). JavaBean动作
JavaBean动作都涉及在JSP页面内使用服务器端JavaBean,包括:
<jsp:useBean>:用于寻找或者实例化一个新的javaBean供以后在JSP页面中使用。
<jsp:setProperty>:设置JavaBean的属性。
<jsp:getProperty>:获取JavaBean的属性。