一個(gè)JSP文件包括模板數據和JSP元素。模板數據是指JSP中存在的HTML或XML文本,Web容器在轉換JSP時(shí)直接將模板數據作為響應輸出。JSP元素分為以下幾類(lèi):
Directive(指示符),Scripting Elements(腳本元素),Comments(注釋?zhuān)┖虯ction(動(dòng)作)。每類(lèi)元素又可以進(jìn)行細分。
JSP規定了一般JSP語(yǔ)法和符合XML格式的語(yǔ)法。對于Directive,Scripting Elements和Comments,存在XML格式的語(yǔ)法和一般JSP語(yǔ)法格式。以下逐一說(shuō)明各類(lèi)語(yǔ)法。
一、Directives
Driectives定義了JSP對應的servlet的整體結構。它包括Include Directive,Page Directive和Tablib Directive。它們都是以“<%@”開(kāi)頭,幾種Directive分別對應servlet的幾類(lèi)宏信息。
1.Include Directive
Include Directive在當前JSP中包含另一個(gè)靜態(tài)文件。其格式為:
<%@ include file = "relativeURL" %>
其對應XML格式為:
<jsp: directive.include file="relativeURL"/>
被包含的路徑為相對URL。如果relativeURL以“/”打頭,則表示相對于當前Web應用所在路徑,若不以“/”打頭,則表示相對于當前JSP目錄。
Include Directive在JSP被轉換和編譯時(shí)將文本文件插入JSP中。被包含的文件可以是JSP文件,HTML文件,XML文件或TXT文件,甚至是Java編程語(yǔ)言代碼。這個(gè)過(guò)程是“靜態(tài)”的,也就是說(shuō)在Web容器對JSP轉換時(shí)直接插入到JSP中,不會(huì )在后來(lái)每次JSP調用時(shí)重新插入。下面是一個(gè)Include Directive的例子。
includejsp.jsp:
<html>
<head><title>Include Date JSP</title></head>
<body bgcolor="white">
<font color="blue">
當前時(shí)間是:<%@ include file="date.jsp"%>
</font>
</body>
</html>
date.jsp:
<%@ page import="java.util.*"%>
<%=(new java.util.Date()).toLocaleString()%>
2.Page Directive
Page Driective定義了整個(gè)JSP的屬性。其語(yǔ)法格式如下:
<%@ page
[language="java"]
[extends="package.class"]
[import="{package.class|package.*},..."]
[session="true|false"]
[buffer="none|8kb|sizekb"]
[autoFlush="true|false"]
[isThreadSafe="true|false"]
[info="text"]
[errorPage="relativeURL"]
[contentType="mimeType[;charset=characterSet]"|"text/html;charset=ISO-8859-1"]
[isErrorPage="true|false"]
[pageEncoding="characterSet|ISO-8859-1"]
%>
共中粗體部分表示默認值。
XML語(yǔ)法格式為:
<jsp: directive.page pageDirectiveAttrilist />
語(yǔ)法中各部分屬性說(shuō)明如下:
language="java":定義JSP適用的編程語(yǔ)言,目前惟一允許的語(yǔ)言是java。
extends="package.class":定義這個(gè)JSP編譯后生成類(lèi)的超類(lèi),一般使用默認值。
[import="{package.class|package.*},..."]:相當于java語(yǔ)言的import指令。java.lang.*,javax.servlet.*,javax.servlet.jsp.*,java.servlet.htt.*已經(jīng)被默認引入,不需要在JSP中再引入。
session="true|false":決定是否該客戶(hù)在使用JSP時(shí)必須參加HTTP會(huì )話(huà)。若該屬性值為true,JSP中的session對象定義為當前會(huì )話(huà)或新的會(huì )話(huà);若為false,則在該JSP中不能使用session對象。
buffer="none|8kb|sizekb":定義JSP響應游覽器輸出out對象緩沖器大小。[autoFlush="true|false"]:設定當緩沖器滿(mǎn)時(shí)緩沖器中的輸出內容是否會(huì )被清空。如果該屬性為false,當緩沖器滿(mǎn)時(shí)就會(huì )有異常彈出。
isThreadSafe="true|false":定義JSP是否支持線(xiàn)程安全。若設為true,編程者必須在JSP代碼中保證多個(gè)客戶(hù)的線(xiàn)程安全;若設為false,則JSP容器保證同一時(shí)刻一個(gè)JSP只處理一個(gè)請求。
info="text":定義JSP的基本信息,信息可以使用Servlet.getServletInfo()方法得到。
errorPage="relativeURL":定義JSP對應的錯誤處理JSP的相對URL。如果relativeURL以“/”打頭,則表示相對于當前Web應用所在路徑,若不以“/”打頭,則表示相對于當前JSP目錄。
contentType="mimeType[;charset=characterSet]"|"text/html;charset=ISO-8859-1":定義JSP在Web響應中使用的MIME類(lèi)型和字符編碼。
isErrorPage="true|false":定義當前JSP對應的錯誤頁(yè)。如果為true,JSP中可以使用exception對象;否則JSP中不能使用exception對象。
pageEncoding="characterSet|ISO-8859-1":定義Web容器對JSP響應的字符編碼。
以下是幾個(gè)Page Directive的使用實(shí)例:
<%@ page import="java.io.*"%>
<%@ page contextType="text/html;charset=gb2312" session="true"%>
<%@ page buffer="12kb" autoFlush="false"%>
<jsp:directive.page errorPage="error.jsp"/>
3.Taglib Directive
Taglib Directive定義在JSP中使用的定制標記的標記庫和前綴。Taglib是JSP中的拓展的技術(shù),主要指編程人員可以編寫(xiě)自己定義的標記。在JSP中Taglib directive必須在定制標記之前使用。關(guān)于Taglib另起篇幅詳細說(shuō)明。
Taglib Directive的語(yǔ)法格式如下:
<%@ taglib uri="URIForLibrary" prefix="tagPrefix" %>
屬性說(shuō)明如下:
uri:通用資源標識符。定義了用來(lái)描述特定定制標記的TLD位置。URI可能是一個(gè)URL,URN,或者是一個(gè)絕對或相對路徑。
prefix:定義了Tagbib前綴名稱(chēng)。例如,在<feytag: inputcheck>標記中feytag。這個(gè)屬性不能為空。編程開(kāi)發(fā)人員開(kāi)發(fā)的Taglib前綴不允許使用下列標記前綴名稱(chēng):jsp,jspx,java,servlet,sun和sunw。
下例是一個(gè)Tablib Directive使用實(shí)例:
<%@ tablib uri="http://www.fey.com.cn/tags/" prefix="feytag" %>
<feytag:inputcheck>
...
</feytag:inputcheck>
二、Scripting Elements
Scripting Elements可以讓編程者在JSP中使用動(dòng)態(tài)編程語(yǔ)言,它可以在JSP中嵌入類(lèi)似Java的程序。Scripting Elements包括Declaration,Expression和Scriptlet。它提供了靈活的編程機制,同時(shí)也會(huì )導致JSP結構混亂,不易被理解。JSP2.0版本提供了代替Scripting Elements的方法。
1.Declaration
Declaration定義了JSP腳本語(yǔ)言使用的變量和函數,這類(lèi)似于Java中定義全局變量,或可以把它想像成pascal編程語(yǔ)言中的單元文件的interface部分。其語(yǔ)法格式為:
<%! declaration;[declaration;]...%>
XML格式為:
<jsp:declaration>
declaration;[declaration;]...
</jsp:declaration>
下面是Declaration的使用實(shí)例:
<%! int i = 0;%>
<%! int a,b,c; String s = newString();%>
2.Expression
Expression是JSP腳本語(yǔ)言中的表達式,它直接將處理過(guò)的文字結果輸出到JSP響應中。Expression的格式為:
<%=expression%>
XML格式為:
<jsp:expression>
expression
</jsp:expression>
前面的例子中已經(jīng)多處使用到了Expression。
3.Scriptlet
Scriptlet是指在JSP中嵌的程序片斷,它使JSP直接使用Java的編程功能。其格式為:
<% code fragment %>
XML格式為:
<jsp:scriptlet>
code fragment
</jsp:scriptlet>
一個(gè)Scriptlet就是一段程序??梢栽谄渲卸x變量和方法,使用合法的表達式,以及使用JSP的隱藏對象。Scriptleg是JSP中的“動(dòng)態(tài)”處理部分,在處理每次JSP請求時(shí)被執行,相當于JSP轉換成servlet后的servlet代碼。如果Scriptlet要輸出響應文字,應調用out對象。
以下實(shí)例是是Scriptlet的一個(gè)使用實(shí)例。請注意該程序突出了下的Scriptlet的“動(dòng)態(tài)”屬性:
<%@ page import="java.util.*" %>
<% Calendar myCalendar = Calendar.getInstanse();
int currentHour = myCalendar.get(Calendar.HOUR_OF_DAY);%>
Welcome!
<br>
<% if(currentHour <12){%>
Good Morning!
<% } else if((currentHour >12)&&(current<18)){%>
Good Afternoon!
<%} else {%>
Good Evening!
<%}%>
4.Comments
Comments是JSP的注釋?zhuān)拖馢ava代碼中的注釋一樣。Comment的格式為:
<%-- coment --%>
三、Actions
Actions表示JSP中的一個(gè)具體操作,它使用規定的標簽和用法,將具體的編程細節封閉成一個(gè)Action。
1.<jsp:forward>
將Web請求轉交給另外的HTML文件、JSP或servlet。這相當于servlet中的RequestDispatcher.forward()功能(見(jiàn)前面的《servlet的協(xié)作一篇》)。它有兩種格式:
<jsp:forward page="{relativeURL|<%=expression%>"/>
可以在轉交請求時(shí)增加請求參數(Request.parameters):
<jsp:forward page="{relativeURL|<%%=expression%>">
<jsp:param name="parametername" value="{parametervalue|<%=expression%>}"/>...
</jsp:forward>
2.<jsp:include>
在響應中包括靜態(tài)文件或其他動(dòng)態(tài)Web構件的處理結果。它相當于servlet中的RequestDispatcher.include()功能(見(jiàn)前面的《servlet的協(xié)作一篇》)。它的格式如下:
<jsp:include page="{relativeURL|<%=expression>}" flush="true|false" />
<jsp:include page="{relativeURL|<%=expression>}" flush="true|false" >
<jsp:param name="parametername" value="{parameterValue|<%=expression%>}">...
</jsp:include>
3.<jsp:useBean>
根據設定的范圍找到初始化JSP中使用的JavaBean(關(guān)于JavaBean在JSP中的用法將另起篇幅詳細介紹)。其格式為:
<jsp:useBean id="beanInstanceName">
scope="page|request|session|application"
{
class="package.class"[type="package.class"]|
beanName="{package.class|<%=expression%>}"
}
{/>|>other elements</jsp:useBean>}
<jsp:useBean>會(huì )找到JSP使用的JavaBean的實(shí)體。如果這個(gè)JavaBean不存在,它會(huì )生成一個(gè)新實(shí)例。<jsp:useBean>之中可以包含<jsp:serProperty>用來(lái)設置JavaBean的參數。
各屬性說(shuō)明如下:
id:定義了識別JavaBean的標識符??梢栽贘SP中的expression或Scriptlegs中通過(guò)這個(gè)id調用JavaBean。
scope:定義JavaBean存在的范圍,默認值是“page”。若設為request,則可以通過(guò)request.getAttribute(beanInstanceName)方法獲得JavaBean。
class:指JavaBean的類(lèi)名
type:如果JavaBean已經(jīng)在某個(gè)范圍存在,type設定了其數據類(lèi)型。數據類(lèi)型可以是class的超類(lèi)。
beanName:根據類(lèi)名或序列化模板創(chuàng )建一個(gè)JavaBean。
下面是一些useBean的使用實(shí)例:
<jsp:useBean id="cart" scope="session" class="fey.Login"/>
<jsp:setProperty name="login" property="*"/>
<jsp:useBean id="user" scope="session" class="fey.User">
<jsp:setProperty name="user" property="username" value="zhangsan"/>
</jsp:useBean>
<jsp:getProperty>使用JavaBean的get方法得到一個(gè)屬性值并將結果插入到JSP響應中。在使用<jsp:getProperty>之前必須先使用<jsp:useBean>引入一個(gè)JavaBean。其格式如下:
<jsp:getProperty name="beanInstanceName" property="propertyname">
<jsp:setProperty>使用JavaBean屬性的set方法設定JavaBean屬性的值。同樣,在使用它之前也必須先使用<jsp:useBean>引入JavaBean。其格式如下:
<jsp:setProperty name="beanInstanceName"
{
property="*"|
property="propertyname"[param="parameterName"]|
property="propertyname" value="{stringLiteral|<%=expression%>}"
}
/>
各個(gè)屬性說(shuō)明如下:
name:已經(jīng)被創(chuàng )建或獲得的JavaBean名稱(chēng)。這個(gè)屬性要和<jsp:useBean>的id一致。
property="*":將全部的Web請求參數(request parameter)存放到JavaBean的屬生中(JavaBean屬性的名稱(chēng)必須和請求參數的名稱(chēng)一致)。
property="propertyname"[param="parameterName"]:設定一個(gè)JavaBean屬性為一個(gè)請求參數的值。
property="propertyname" value="{stringLiteral|<%=expression%>}":直接由一個(gè)字符串或表過(guò)式指定一個(gè)JavaBean的值。
4.<jsp:plugin>
<jsp:plugin>通過(guò)在瀏覽器的java插件上運行一個(gè)Java Applet或者JavaBean。其格式為:
<jsp:plugin
type="bean|applet"
code="classFileName"
codebase="classFileDirectoryName"
[name="instanceName"]
[archive="URIToArchive,..."]
[align="bottom|top|middle|left|right"]
[height="{displayPixels|<%=expression%>}"]
[width="{displayPixels|<%=expression%>}"]
[hspace="leftRightPixels"]
[vspace="topBottomPixels"]
[jreversion="JREVersionNumber|1.2"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"]>
[<jsp:params>
[<jsp:param name="parameterName" value="{parameterValue|<%=expression%>}"]...
</jsp:params>]
[<jsp:fallback> text message for user </jsp:fallback>]
</jsp:plugin>
各個(gè)屬性說(shuō)明如下:
type="bean|applet":表明對象是JavaBean還是Applet;
code="classFileName":指也Java Plug-in需要運行的程序的類(lèi)名。文件應該是在codebase屬生指定的目錄中。
codebase="classFileDirectoryName":指出Java Plug-in需要運行的程序所在的目錄名。如果沒(méi)有指定這個(gè)屬性,默認為當前JSP所在目錄。
[name="instanceName"]:JavaBean或Applet的名稱(chēng),可以供同一JSP內部的JavaBean或Applet對象之間的通信。
[archive="URIToArchive,..."]:需要加載的jar文件的路徑。這些jar會(huì )通過(guò)Web安全地加載到客戶(hù)機。
[align="bottom|top|middle|left|right"]:指定對象在瀏覽器中的位置。
[height="{displayPixels|<%=expression%>}"]:指定對象最初在瀏覽器中的寬度。
[width="{displayPixels|<%=expression%>}"]:指定對象最初在瀏覽器中的高度。
[hspace="leftRightPixels"]:指定對象周?chē)臻g的高度
[vspace="topBottomPixels"]:指定對象周?chē)臻g的寬度
[jreversion="JREVersionNumber|1.2"]:說(shuō)明JRE的版本號。
[nspluginurl="URLToPlugin"]:提供Netscape下載JRE Plug-in的網(wǎng)址。
[iepluginurl="URLToPlugin"]>:提供IE下載JRE Plug-in的網(wǎng)址。
[<jsp:params>
[<jsp:param name="parameterName" value="{parameterValue|<%=expression%>}"]...
</jsp:params>〕:指定可以供Applet或JavaBean使用的初始變量的值。
[<jsp:fallback> text message for user </jsp:fallback>]:當plug-in不能啟動(dòng)時(shí)用來(lái)顯示的文本信息。如果plug-in啟動(dòng)了但不能運行,一般會(huì )有對話(huà)框彈出解釋錯誤的信息。
5.兩個(gè)與XML格式JSP有關(guān)的元素
<jsp:root>定義了標準的JSP元素和Taglib的namespace。它的格式為:
<jsp:root
xmlns:jsp="http://java.sun.com/JSP/Page"
[xmlns:taglibPrefix="URI"]...
version="1.2"
JSP Page
</jsp:root>
<jsp:text>用來(lái)添加模板數據。格式為:
<jsp:text>
template data
</jsp:text>