版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
12.1標簽庫概述12.2自定義標簽庫的開發(fā)12.3安裝配置支持JSTL的IDE12.4JSTL應用編程舉例習題12第12章JSP標簽庫
標簽庫與JavaBean類似,也是一種軟件復用技術,但標簽庫具有比JavaBean更豐富的運行時協(xié)議。
本章首先講述標簽庫的概念、JSTL標簽分類和標簽實現(xiàn)接口,接著介紹用戶自定義標簽的開發(fā)。為了使我們更容易地使用標準標簽庫,本章第3節(jié)介紹了一種支持JSTL的集成開發(fā)環(huán)境:Eclipse+MyEclipse+Tomcat。第4節(jié)講述如何使用JSTL開發(fā)Web應用。
12.1.1標簽庫的概念
標簽擴展是一個Java類,它是運行一個或者兩個接口的JavaBean。在JSP規(guī)范里,標簽具有比JavaBean更豐富的運行時(Runtime)協(xié)議。它可以非常緊密地和JSP的表示邏輯聯(lián)系在一起,同時它又具有和普通JavaBean相同的業(yè)務邏輯處理能力。標簽庫的典型應用有控制顯示邏輯、內(nèi)容迭代和訪問數(shù)據(jù)庫等。12.1標?簽?庫?概?述與HTML、XML類似,標簽可以帶有屬性和主體(Body),也可以沒有屬性和主體,它們是可選的。最簡單的標簽沒有屬性和主體。下面是幾種典型的標簽:
●不帶屬性和主體的標簽。
●不帶主體但有屬性的標簽。
●帶有屬性和主體的標簽。
另外,一個標簽也可以嵌套在另一個標簽里面,這就使得標簽可以有很強的頁面內(nèi)容管理能力。從標簽的來源上看,JSP中的標簽庫可以分為兩種類型:一種是JSP標準標簽庫(JSPStandardTagLibrary,JSTL),它是JSP開發(fā)環(huán)境供應商開發(fā)的;另一種是JSP開發(fā)環(huán)境的使用者(即用戶)自己定義的標簽。
通過使用標簽庫,可以簡化JSP和Web應用程序的開發(fā),減少JSP中的腳本代碼量,大大降低JSP頁面的復雜度,并且使代碼最大程度地重用。
12.1.2標簽庫的接口和類的繼承關系
JSP所有的標簽都實現(xiàn)了javax.servlet.jsp.tagext.JspTag接口。這個接口是一個標記接口,它有兩個直接子接口:一個是SimpleTag接口,它是JSP2.0新增加的接口,代表簡單的標簽;另一個是Tag接口,它是經(jīng)典的、必須實現(xiàn)的接口,它有一個直接子接口IterationTag。標簽庫的接口和類的繼承關系如圖12.1所示。
圖12.1標簽庫的接口和類的繼承關系
IterationTag是用于開發(fā)迭代的標簽,它有一個簡單的實現(xiàn)類TagSupport。在開發(fā)時,我們只要從TagSupport擴展就可以開發(fā)出迭代的標簽了。IterationTag還有一個子接口BodyTag,該子接口允許帶有Body。BodyTag也有一個實現(xiàn)類BodyTagSupport。在開發(fā)BodyTag時,往往直接從BodyTagSupport繼承就可以了。當然,我們在開發(fā)自己的標簽時,除了繼承原有的類之外,也可以直接實現(xiàn)Tag接口。SimpleTag是JSP2.0新增加的一種標簽類。12.1.3Tag接口中定義的方法和常量
在Tag接口中,定義了如下一些方法:doStartTag(),doEndTag(),setPagcontext(),setParent(),getParent(),release()。
表12.1給出了Tag接口中定義的標識符常量和成員方法。
表12.1Tag接口中定義的標識符常量和成員方法12.1.4JSTL介紹
從JSP1.1開始,JSP就支持在JSP中使用自定義標簽了。自定義標簽的廣泛使用造成了程序員的重復定義,這就促成了標準標簽庫(JSPStandardTagLibaray,JSTL)的誕生。
JSTL是一個不斷完善的開放源代碼的JSP標簽庫,是由Apache的Jakarta小組開發(fā)的。JSTL運行在支持JSP1.2和Servlet2.3以上規(guī)范的容器上,如Tomcat4.0以上的版本。在JSP2.0規(guī)范中,JSTL被作為標準支持。JSTL的最新版本是JSTL1.1。
JSTL是一個實現(xiàn)Web應用程序中通用功能的定制標簽的集合,這些功能包括迭代和條件判斷、數(shù)據(jù)管理格式化、XML操作以及數(shù)據(jù)庫訪問等。目前,在JSTL中有core、format、sql和xml四個定制的標簽庫,每個標簽庫中都包含一些特定的標簽。
core標簽庫提供了定制操作,通過限制了作用域的變量管理數(shù)據(jù),以及執(zhí)行頁面內(nèi)容的迭代和條件操作。format標簽庫定義了用來格式化數(shù)據(jù)(尤其是數(shù)字和日期)的操作。它還支持使用本地化資源來進行JSP頁面的國際化。xml標簽庫包含一些用來操作通過XML表示數(shù)據(jù)的標簽。sql標簽庫定義了一些用來查詢關系數(shù)據(jù)庫的操作。各個標簽庫所包含的標簽及其功能等見表12.2。關于這方面的更詳細描述請參閱/j2ee/1.3/docs/tutorial/doc/JSTL3.html~JSTL9.html。
表12.2目前JSTL中包含的標簽、前綴及其分類和功能12.1.5表達式語言(EL)
表達式語言(ExpressionLanguage)是JSP2.0新增加的技術。通過表達式語言,可以非常簡單地訪問JavaBean中的屬性,可以簡化JSP開發(fā),使代碼整潔。在使用標簽庫時常用到表達式語言。
表達式語言是用符號“$”開始的,內(nèi)容包括在花括號“{”和“}”中。例如,在12.4.1節(jié)的示例程序c12_3.jsp中就有下面兩句使用了表達式語言:
<c:outvalue="${header['user-agent']}"/>
<c:outvalue="${a}"escapeXml="true"/>
其中的${header['user-agent']}和${a}都是表達式語言。
1.常用的隱含對象
JSP表達式語言定義了一些隱含對象,使用表達式語言可以方便地訪問這些隱含對象。這些隱含對象除了我們在第5章介紹的內(nèi)置對象中的request、response、sessin、cookie、pageContent外,還有:
●
requestScope:把請求作用域內(nèi)的屬性名稱和值進行映射。
●
sessionScope:把會話作用域內(nèi)的屬性名稱和值進行映射?!?/p>
applicationScope:把應用程序作用域內(nèi)的屬性名稱和值進行映射。
●
pageScope:把頁面作用域內(nèi)的屬性名稱和值進行映射。
●
param:把請求中的參數(shù)名稱和單個值進行映射。
●
paramValues:把請求中的參數(shù)名和單個值進行映射。
●
header:把請求中的header名和一個String類型的數(shù)組進行映射。
●
headerValues:把請求中的header名和一個String類型的數(shù)組進行映射。
2.?EL運算符
表達式語言定義了以下的操作:
●算術運算符:+、-、*、/(或div)和%(或mod)。
●關系運算符:==(或eq)、!=(或ne)、<(或lt)、>(或gt)、<=(或le)和>=(或ge)。
●邏輯運算符:&&(或and)、||(或or)和!(或not)。上述三類操作與我們在第4章講述的內(nèi)容一致。
●驗證運算符:empty。用于判斷某個值是否為null或empty。
●點運算符:.。點運算符通常用于訪問對象的特性。例如,在表達式${user.firstName}中,使用點運算符來訪問user標識符所引用對象的名為firstName的特性?!穹嚼ㄌ栠\算符:[]。方括號運算符用來檢索數(shù)組和集合的元素。在數(shù)組和有序集合的情況下,把要檢索的元素的下標放在方括號中。對于實現(xiàn)java.util.Map接口的集合,方括號運算符使用關聯(lián)的鍵查找存儲在映射中的值。在方括號中指定鍵,并將相應的值作為表達式的值返回。
點運算符和方括號運算符在某種程度上可以互換。點運算符和方括號運算符具有最高的優(yōu)先級。
自定義標簽技術是從JSP1.1開始支持的,而且在JSP1.2和2.0規(guī)范中得到了不斷加強。通過定義標簽庫,可以簡化JSP和Web應用程序的開發(fā),減少JSP中的腳本代碼量,大大降低JSP頁面的復雜度,并且使代碼最大程度地重用。12.2自定義標簽庫的開發(fā)12.2.1自定義標簽的組成和開發(fā)步驟
自定義標簽由標簽處理程序和標簽的描述組成。標簽處理程序就是Java類,類中包含了請求期間將要執(zhí)行的Java代碼。當遇到特定的標簽時,標簽處理程序就會告訴系統(tǒng)應該做什么。標簽的描述聲明了怎樣使用這個標簽。如果用戶要開發(fā)和使用自定義標簽,則有下述四個步驟:
(1)開發(fā)標簽實現(xiàn)類。也就是用Java語言來開發(fā)自己的標簽庫。開發(fā)標簽實現(xiàn)類又有兩種選擇:一種是直接實現(xiàn)原始的Tag接口;另一種是從TagSupport類繼承。
(2)編寫標簽描述文件。這個描述文件通常是以
.tld結尾的。
(3)修改web.xml文件。在web.xml文件中指定標簽庫的引用。
(4)編寫JSP頁面文件。在這個頁面中通過<%
@
taglib>標簽將自定義標簽引入,從而實現(xiàn)使用自定義標簽的目的。JSP容器使用這個標簽庫來確定在遇到定制標簽時該怎么做。12.2.2繼承TagSupport類開發(fā)自定義標簽
下面通過繼承TagSupport類來開發(fā)一個簡單的標簽,以說明自定義標簽的開發(fā)過程。該例共包括四個文件,分別是HelloTag.java、mytag.tld、web.xml和c12_1.jsp。通常,這些文件都有特定的存放位置,弄不好就會出現(xiàn)找不到文件的錯誤。為此,我們首先將HelloTag.java文件放在src/bean目錄下(src目錄是系統(tǒng)自動生成的),將web.xml文件放在WEB-INF目錄中(該目錄也是系統(tǒng)自動生成的);然后,再在WEB-INF目錄下建一個tlds目錄,將mytag.tld文件放在這個目錄下。
1.開發(fā)標簽實現(xiàn)類
開發(fā)實現(xiàn)類就是編寫
.java文件。本例通過繼承TagSupport類來開發(fā)標簽實現(xiàn)類,文件名是HelloTag.java,它被放在一個名為bean的包中。
HelloTag.java文件的內(nèi)容如下:
packagebean; //給出包名
importjavax.servlet.jsp.*;
importjavax.servlet.jsp.tagext.*;
importjava.io.IOException;
importjava.util.Date;
//通過繼承TagSupport類來開發(fā)標簽
publicclassHelloTagextendsTagSupport
{
publicintdoStartTag()throwsJspTagException
{//覆蓋doStartTag方法
returnEVAL_BODY_INCLUDE;
}
publicintdoEndTag()throwsJspTagException
{//覆蓋doEndTag方法
StringdateString=newDate().toString();
try
{
pageContext.getOut().write("你好這是我自己開發(fā)的標簽HelloTag<br>
現(xiàn)在的時間是:"+dateString);
}
catch(IOExceptionex)
{
thrownewJspTagException("Error:hellotagconldnotwritetoJSP");
}
returnEVAL_PAGE;
}
}
2.編寫標簽描述文件
標簽描述文件是用XML格式書寫的,且其擴展名固定為
.tld。本例的標簽描述文件名為mytag.tld,其內(nèi)容如下:
<?xmlversion="1.0"encoding="gb2312"?>
<taglib>
<description>
AtaglibraryexercisingSimpleTaghandlers.
</description>
<tlib-version>1.0</tlib-version><!--標簽版本不能為空,且必須為準確值-->
<short-name>examples</short-name>
<uri>/demotag</uri>
<!--指定調用此標簽的URI,demotag是系統(tǒng)默認的自定義標簽庫-->
<description>Asimpletablibraryfortheexample</description>
<tag>
<name>hello_tag</name>
<tag-class>bean.HelloTag</tag-class>
<!--類文件名一定要有包,且不可以使用默認的包-->
<body-content>empty</body-content>
<description>
Simplehelloworldexamples.Takesnoattribute,andsimplygeneratesHTML
</description>
</tag>
</taglib>
3.編寫web.xml文件
在web.xml文件中指定標簽庫的引用。本例中web.xml文件的內(nèi)容如下:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<web-app>
<taglib>
<taglib-uri>/demotag</taglib-uri>
<taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location>
</taglib>
</web-app>
在這個文件中,最關鍵的是<taglib-uri>和<taglib-location>兩句,它們分別指出標簽文件的存放路徑和標簽描述文件的存放位置,不能寫錯。
4.編寫使用自定義標簽的JSP頁面文件
在JSP頁面文件中通過<%@taglib>指令將自定義標簽引入,從而實現(xiàn)使用自定義標簽的目的。本例中的JSP頁面文件是c12_1.jsp,其內(nèi)容如下:
<%@tagliburi="/demotag"prefix="hello"%>
<%@pagecontentType="text/html;charset=gb2312"language="java"%>
<html>
<head>
<title>自定義tag使用實例</title>
</head>
<body>
<p>以下的內(nèi)容從Taglib中顯示:</p>
<p><i><hello:hello_tag/></i></p>
</body>
</html>完成了上述文件的編寫后,就可以在瀏覽器地址欄中輸入:
http://localhost:8080/ch12/c12_1.jsp
執(zhí)行這個JSP文件,就可以看到如圖12.2所示的效果。
這一過程看起來似乎有些復雜,但是,如果要在多處使用同樣的代碼時,就可以將這些代碼寫在一個自定義的標簽中,做到一次編寫,多處使用。此外,由于使用了標簽,不僅增加了代碼的重用度,而且也使頁面易于維護。例如,可以把一些需要迭代顯示的內(nèi)容做成一個標簽,在每次迭代顯示時,使用這個標簽就可以了,不必重復書寫這些代碼。
圖12.2使用自定義標簽hello的示例程序的執(zhí)行效果12.2.3實現(xiàn)Tag接口開發(fā)自定義標簽
下面再給出一個通過實現(xiàn)Tag接口的方式來開發(fā)標簽程序的例子。這個例子和12.1.3節(jié)給出的例子只在
.java文件的內(nèi)容上有所不同。這是因為接口提供的方法都是抽象方法,需要在使用此接口的程序中實現(xiàn)這些方法。其它幾個文件內(nèi)容只需做簡單的修改就可以了。實現(xiàn)Tag接口的HelloTag2.java文件的內(nèi)容如下:
packagebean;
importjavax.servlet.jsp.*;
importjavax.servlet.jsp.tagext.*;
importjava.io.IOException;
importjava.util.Date;
publicclassHelloTagimplementsjavax.servlet.jsp.tagext.Tag
{//實現(xiàn)Tag接口
privatePageContextpageContext;
privateTagparent;
publicHelloTag(){super();}//構造方法
publicvoidsetPageContext(finaljavax.servlet.jsp.PageContextpageContext)
{this.pageContext=pageContext;}//設置標簽的頁面的上下文
publicvoidsetParent(finaljavax.servlet.jsp.tagext.Tagparent)
{this.parent=parent;}//設置上一級標簽
publicjavax.servlet.jsp.tagext.TaggetParent()
{returnparent;}//獲取上一級標簽
publicintdoStartTag()throwsjavax.servlet.jsp.JspTagException
{returnSKIP_BODY;
//開始標簽時的操作返回SKIP_BODY,表示不計算標簽體
}
publicintdoEndTag()throwsjavax.servlet.jsp.JspTagException
{//結束標簽時的操作
try
{pageContext.getOut().write("Hello,你好!"); }
catch(java.io.IOExceptione)
{ thrownewJspTagException("IOError:"+e.getMessage());}
returnEVAL_PAGE;
}
publicvoidrelease(){}//釋放標簽程序占用的資源
}完成上述HelloTag.java程序的編寫后,修改12.2.2節(jié)的web.xml文件,在該文件的</taglib>之后插入下述內(nèi)容:
<taglib>
<taglib-uri>/hellotag2</taglib-uri>
<taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location>
</taglib>
接著,再在12.2.2節(jié)的mytag.tld文件的</tag>之后插入下述內(nèi)容:
<uri>/hellotag2</uri>
<tag>
<name>hello_tag2</name>
<tag-class>bean.HelloTag2</tag-class>
<body-content>empty</body-content>
<description>
Simplehelloworldexamples. Takesnoattribute,andsimplygeneratesHTML
</description>
</tag>
最后,再編寫一個具有如下內(nèi)容的c12_2.jsp程序:
<%@tagliburi="/hellotag2"prefix="hello"%>
<%@pagecontentType="text/html;charset=gb2312"language="java"%>
<html>
<head><title>firstcumstomedtag</title></head>
<body>
<p>以下的內(nèi)容從Taglib中顯示:</p>
<p><i><hello:hello_tag2/></i></p>
</body>
</html>完成上述文件的修改和編寫后,在瀏覽器地址欄輸入:
http://localhost:8080/ch12/c12_2.jsp
執(zhí)行這個JSP文件,就可以輸出如圖12.3所示的“Hello,你好!”的信息。
圖12.3使用自定義標簽hello的示例程序的執(zhí)行效果
雖然自JSP1.0開始就有了JSTL,而且從JSP2.0起,JSTL得到了進一步加強,并作為標準的支持。但是,由于第3章介紹的Eclipse中文加強版還沒有把JSTL和Tomcat捆綁在一起,若要使用JSTL,需要下載
.jar和
.tld文件,而且這些文件都有特定的存放位置,需要創(chuàng)建相應的文件夾進行安裝,操作比較復雜且容易出錯。為此,我們在本節(jié)引入支持JSTL的集成開發(fā)環(huán)境,即Eclipse+MyEclipse+Tomcat環(huán)境,講解如何把這些工具整合在一起使用。使用本節(jié)介紹的方法,就可以去除使用JSTL的上述煩惱。12.3安裝配置支持JSTL的IDE12.3.1安裝前的準備工作
Eclipse、MyEclipse都是開源軟件,而且是免費的,可以直接在其官方網(wǎng)站上下載。這些文件的下載地址如下:
Eclipse3.2.2:/downloads/
MyEclipse5.1.1:/
Tomcat6.0:注意:Eclipse版本與MyEclipse版本必須匹配,如果你使用的Eclipse版本和上面列示的不一樣,那你必須找到和你的Eclipse版本匹配的MyEclipse版本,否則是不能正常安
裝的。
從上面列出的站點下載下列資源到f:\abc文件夾下。這是因為本例以f:\abc文件夾為安裝目錄,如果你計劃的安裝目錄與我們的不同,請下載到你計劃的目錄中(下同)。
eclipse-SDK-3.2.2-win32.zip;
MyEclipse_5.1.1GA_installer.exe
apache-tomcat-6.0.10.exe
jdk-6-windows-i586.exe
下載完成后,將eclipse-SDK-3.2.2-win32.zip解壓縮到f:\abc文件夾下。12.3.2安裝配置MyEclipse的步驟
首先把Eclipse3.2.2解壓縮到你的指定目錄下,接著安裝MyEclipse5.1.1插件。在安裝過程中需要注意的是:如圖12.4所示,一定要明確指定Eclipse的安裝目錄,這樣才可以把插件正確地安裝進去。
圖12.4安裝MyEclipse_5.1.1——選擇Eclipse文件夾
(1)安裝JDK1.6與Tomcat6的步驟見第3章。本節(jié)是在第3章JDK已安裝好的前提條件下進行的。如果你還沒有安裝JDK,請按照第3章介紹的方法先把JDK安裝好。
JDK1.6的安裝目錄是:F:\Java\jdk1.6.0。
Tomcat6.0.10的安裝目錄是:F:\abc\Tomcat6.0。
(2)安裝MyEclipse_5.1.1插件。運行MyEclipse_5.1.1GA_Installer.exe,出現(xiàn)如圖12.4所示的對話框。在這個對話框中輸入存放eclipse文件的路徑;也可單擊“Choose…”按鈕,指定eclipse的存放位置。本例指定的安裝位置如圖12.4所示,是F:\abc\eclipse-SDK-3.2.2-win32\eclipse。指定后單擊“Next”按鈕,彈出圖12.5所示對話框。
(3)在圖12.5所示的對話框中,需要指定安裝MyEclipse的文件夾。本例指定的安裝文件夾如圖12.4所示,是F:\abc。然后單擊“Next”,彈出圖12.6所示對話框。
(4)圖12.6所示是創(chuàng)建圖標和熱鍵對話框,在這里可取默認值。單擊“Next”,彈出圖12.7所示對話框。
(5)圖12.7是對前幾步設置的確認信息對話框。單擊“Install”按鈕,開始安裝,彈出圖12.8所示的對話框。圖12.5安裝MyEclipse_5.1.1——選擇安裝文件夾
圖12.6創(chuàng)建圖標和熱鍵對話框
圖12.7安裝位置確認對話框
圖12.8是否打開“ReleaseNotes”對話框
(6)圖12.8所示的對話框是詢問在安裝完成后是否打開“ReleaseNotes”對話框。取默認值,單擊“Next”,彈出圖12.9所示的對話框。
(7)圖12.9是顯示“ReleaseNotes”信息的對話框。單擊“Done”按鈕,完成安裝。
圖12.9安裝成功對話框12.3.3MyEclipse的其它一些設置
(1)設置工作區(qū)(目錄)。運行f:\abc下的MyEclipse5.1.1GA,選擇或設置工作區(qū)。如圖12.10所示,本例設置的工作區(qū)為F:\xiti。
(2)配置Profereces。如圖12.11所示,在MyEclipse的菜單欄中依次選擇“Window”、“Profereces”,彈出如圖12.12所示的“Preferences”對話框。
圖12.10選擇工作目錄對話框圖12.11設置MyEclipse的Profereces在圖12.12所示的“Preferences”對話框的左側目錄樹中,逐層展開“MyEclipse”、“ApplicationServers”選項;在“ApplicationServers”中選擇“Tomcat5”或“Tomcat6”,然后再在右側選中“TomcatServer”下的“Enable”單選按鈕;最后,點擊“Apply”按鈕后再單擊“OK”按鈕,完成這一設置過程。
圖12.12配置Profereces12.3.4一個使用JSTL的通用web.xml文件
在使用JSTL標簽時總要用到web.xml文件。為了簡化本章以下各節(jié)中有關這個文件的修改,下面我們給出一個使用JSTL的通用web.xml文件。該文件的內(nèi)容如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<web-app>
<jsp-config>
<taglib>
<taglib-uri>/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/fmt-rt</taglib-uri>
<taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/sql-rt</taglib-uri>
<taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/x</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/x-rt</taglib-uri>
<taglib-location>/WEB-INF/x-rt.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
本節(jié)對12.1.4節(jié)介紹的JSTL庫中的各類標簽,選擇其中較常用的部分標簽給出應用實例進行說明。
12.4.1<c:set>和<c:out>標簽應用
1.
<c:set>標簽語法
<c:set>標簽用于設置某個對象的作用范圍(page,request,session,application)或某個對象的屬性。它有如下幾種語法格式:12.4JSTL應用編程舉例
(1)使用value屬性設置var屬性的值和作用范圍(scope)。
<c:setvalue="value"var="varName"[scope="{page|request|session|application}"]/>
(2)設置var屬性的作用范圍,并且?guī)в幸粋€body。
<c:setvar="varName"[scope="{page|request|session|application}"]>
標簽主體內(nèi)容
</c:set>
(3)設置某個對象的一個屬性。
<c:setvalue="value"target="target"property="proprtyName"/>
(4)設置某個對象的一個屬性,并帶有一個body。
<c:settarget="target"property="proprtyName"/>
標簽主體內(nèi)容
</c:set>
其中:var是用于表示value值的屬性名;value屬性的取值可以是一個具體值,也可以是一個將要計算的EL表達式;scope是var的有效范圍;target代表將要設置屬性的對象,它必須是一個JavaBean或java.util.Map對象;property是設置對象target的一個屬性名。
2.?<c:out>標簽語法
<c:out>標簽的作用是輸出表達式的值,相當于JSP腳本中的<%=variableName%>語句。它的語法如下:
(1)沒有body時。
<c:outvalue="value"escapeXml="{true
|
false}"[default="defaultValue"]/>
(2)帶有body時。
<c:outvalue="${variableNam}"[escapeXml="{true|false}"]>
defaultvalue
</c:out>其中:value的取值可以是一個具體值,也可以是一個將要計算的EL表達式;escapeXml屬性的作用是確定以下五個字符:<、>、&、’、”,在結果字符串中是否被轉換成字符實體代碼,該屬性的默認值為true;default是個可選取項,當value為null時,輸出default的值。
3.在MyEclipse中創(chuàng)建應用JSTL程序的過程
作為使用JSTL的第一個例子,下面我們從MyEclipse中創(chuàng)建項目的操作開始,分步講解在MyEclipse中創(chuàng)建一個項目到運行一個測試程序的過程。
1)創(chuàng)建項目
啟動MyEclipse,在菜單欄中依次單擊打開“File”、“New”、“Project”菜單項,彈出如圖12.13所示的“NewProject”對話框。
圖12.13“NewProject”對話框在這個對話框中,依次單擊展開“MyEclipse”、“J2EEProject”,選中“WebProject”項后,單擊“Next”按鈕,出現(xiàn)如圖12.14所示的對話框(注意,第1次使用時需要注冊)。在這個對話框的“ProjectName”后的框中輸入名稱“ch12”。然后,再選中“JSTLSupport”項下的“AddJSTLlibrariesto…”復選框;再選中“JSTL1.0”和“JSTL1.1”兩個單選按鈕中的任意一個(目前通常選JSTL1.1)。最后,點擊“Finish”按鈕,完成這一設置。
圖12.14配置新建項目對話框
2)創(chuàng)建JSP文件
接著我們再新建一個名為c12_3.jsp的JSP文件。在“PackageExplorer”(資源管理器)窗口的“ch12”項目上單擊右鍵,彈出如圖12.15所示的快捷菜單。在這個菜單中依次選擇“New”、“JSP(AdvancedTemplates)”,出現(xiàn)如圖12.16所示的對話框。
圖12.15快捷菜單
圖12.16定義文件名對話框在圖12.16所示的對話框的“FileName”后的文本框中輸入文件名“c12_3.jsp”,然后單擊“Finish”按鈕,出現(xiàn)編輯文件的界面。
3)輸入JSP程序代碼
在編輯界面中,為c12_3.jsp文件輸入如下所示的測試代碼:
<%@pageimport="java.util.*"contentType="text/html;charset=GB2312"%>
<%@taglibprefix="c"uri="/jsp/jstl/core"%>
<html>
<head><title>測試第一個使用JSTL的網(wǎng)頁</title></head>
<body>
<c:outvalue="歡迎測試第一個使用JSTL的網(wǎng)頁"/>
</br>使用的用戶代理是:</br>
<c:outvalue="${header['user-agent']}"/>
</br>輸出我們自己定義的變量值:</br>
<c:setvar="a"value="DavidO′Davies"/>
<c:outvalue="${a}"escapeXml="true"/>
</body>
</html>
4)修改web.xml文件
接下來我們需要對WEB-INF目錄下的web.xml文件做一些修改,即在web.xml文件中指定標簽庫的引用。由于我們在12.3.4節(jié)已經(jīng)給出了一個通用的web.xml文件,所以,這里的修改工作只是把12.3.4節(jié)給出的web.xml文件復制到WEB-INF目錄下。但需要指出的是,由于本例中只使用了<c:out>和<c:set>標簽,所以實際上只用到該文件中的下述兩段:
<taglib>
<taglib-uri>/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>此外,有些web.xml文件設置<taglib>標簽時會產(chǎn)生異常。產(chǎn)生這種異常的一種可能是因為web.xml文檔需要的DTD格式不一致。對于這種情況,只要把<web-app>后面的屬性全部刪除就可以了。還有一種情況是由于新版本的web.xml文件中沒有<taglib>標簽項。在這種情況下,可以先在<web-app>層內(nèi)加入<jsp-config>層,再把<taglib>標簽的內(nèi)容寫在<jsp-config>層內(nèi)就可以運行了。12.3.4節(jié)給出的web.xml文件就是經(jīng)過上述處理的。
5)運行發(fā)布前的工作
運行發(fā)布時需要指定所使用的服務器。圖12.17~圖12.20說明了這一過程。操作步驟如下:
(1)單擊圖12.17工具欄中圓圈標示的按鈕,出現(xiàn)圖12.18所示的界面。
圖12.17運行發(fā)布界面
(2)在圖12.18所示的界面上,首先單擊“Project”后的下拉列表按鈕,選定項目名。本例的項目名是在圖12.14中設置的,如圖12.18所示,為ch12。然后單擊“Add”按鈕,出現(xiàn)如圖12.19所示的對話框,為項目添加服務器。
(3)在圖12.19所示的界面上,首先單擊“Server”后的下拉列表按鈕,從中選定服務器。本例的服務器如圖12.20所示,是Tomcat6。然后單擊“Finish”按鈕,出現(xiàn)如圖12.20所示的對話框。
(4)在圖12.20所示的對話框上,直接單擊“OK”按鈕,完成這一過程。
圖12.18指定項目名并為項目添加服務器對話框
圖12.19選擇服務器對話框
圖12.20為項目添加了服務器的界面
6)運行程序
首先單擊圖12.21工具欄中圓圈標示的按鈕后的下拉列表按鈕,在出現(xiàn)的列表中依次選擇“Tomcat6”、“Start”項,啟動服務器。然后,再單擊圖12.22工具欄中圓圈標示的“地球”按鈕,在出現(xiàn)的地址列表框中輸入或選擇“http://localhost:8080/ch12/c12_3.jsp”,就可以看到圖12.22中部窗口中的運行結果。
圖12.21啟動服務器發(fā)布項目的界面
圖12.22運行程序的界面及運行結果啟動IE瀏覽器,在地址欄中輸入“http://localhost:8080/ch12/c12_3.jsp”,運行效果如圖12.23所示。
圖12.23c12_3.jsp的運行效果12.4.2迭代標簽<c:forEach>應用
在JSP開發(fā)中,迭代是經(jīng)常使用的操作。例如,腳本語言中的for循環(huán)和while循環(huán)等。JSTLcore大類中的<c:forEach>標簽提供指定次數(shù)的循環(huán)或在某個數(shù)據(jù)結構(Collection/Array)上進行循環(huán)的能力。它有如下兩種用法。
語法格式1:循環(huán)固定的次數(shù)。
<c:forEach
[var="varName"]
[varStatus="varStatusName"]begin="begin"
end="end"
[step="step"]>
標簽主體的內(nèi)容
</c:forEach>
語法格式2:在Collection/Array上進行循環(huán)。
<c:forEach[var="varName"]
items="collection"
[varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
標簽主體的內(nèi)容
</c:forEach>
其中,方括號中的內(nèi)容是可選的。<c:forEach>的屬性描述于表12.3中。
表12.3<c:forEach>的屬性下面通過一個例子來說明<c:forEach>標簽的使用。這個例子由兩個程序組成:一個是名為TestBean.java的Java文件;另一個是使用<c:forEach>標簽的JSP程序c12_4.jsp。
TestBean.java程序源代碼如下:
packagech12;
publicclassTestBean
{ publicStringuserName;
publicStringuserID;
publicintage;
publicvoidsetUserName(Stringname) { this.userName=name; }
publicvoidsetUserID(Stringpassword){ this.userID=userID; }
publicStringgetUserName(){ returnthis.userName; }
publicStringgetUserID(){ returnuserID; }
publicintgetAge() { returnthis.age; }
publicvoidsetAge(intage) { this.age=age; }
}
c12_4.jsp程序源代碼如下:
<%@taglibprefix="c"uri="/jstl/core"%>
<%@pagecontentType="text/html;charset=gb2312"language="java"%>
<%@pageimport="java.util.*,ch12.TestBean"%>
<%
Collectionusers=newArrayList();
for(inti=0;i<5;i++)
{
TestBeanuser=newTestBean();
user.setUserName("0624120"+i);
user.setUserID("2006040"+i);
user.setAge(20+i);
users.add(user);
}
session.setAttribute("users",users);
%>
<html>
<head>
<title>JSTL:c:forEach的使用</title>
</head>
<bodybgcolor="#FFFFFF"><center>
<h4>借閱者列表</h4>
<tableborder="1"align="center">
<tr><tdalign="center">學號</td><tdalign="center">ID</td>
<tdalign="center">年齡</td></tr>
<c:forEachvar="users"items="${users}">
<tr><td><c:outvalue="${users.userName}"/></td>
<td><c:outvalue="${users.userID}"/></td>
<tdalign="center"><c:outvalue="${users.age}"/></td></tr>
</c:forEach>
</table>
</center></body>
</html>
這個例子的運行結果見圖12.24。
圖12.24使用<c:forEach>標簽的程序的運行結果12.4.3SQL類標簽應用
SQL標簽庫有六個標簽:<sql:setDataSource>、<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>、<sql:transaction>,提供設置數(shù)據(jù)源、查詢數(shù)據(jù)庫、更新數(shù)據(jù)庫和事務處理等功能。這里我們拋磚引玉地介紹<sql:setDataSource>、<sql:query>和<sql:update>三個標簽的使用方法。
1.<sql:setDataSource>標簽
<sql:setDataSource>標簽是設置數(shù)據(jù)源的標簽。對于沒有默認數(shù)據(jù)庫的JSP頁面,<sql:setDataSource>標簽能夠準備一個數(shù)據(jù)庫以供使用。<sql:setDataSource>標簽的語法格式如下。
<sql:setDataSource{dataSource="dataSource"|url="jdbcUrl"
[driver="driverClassName"][user="username"][password="password"]}
[var="varName"]scope="scope"/>
<sql:setDataSource>標簽的屬性如表12.4所示。
表12.4<sql:setDataSource>標簽的屬性例如,下面的語句使用<sql:setDataSource>標簽創(chuàng)建了一個數(shù)據(jù)源:
<sql:setDataSourcevar="jstl_sql"driver="sun.jdbc.odbc.JdbcOdbcDriver"url="jdbc:odbc:TestDB"scope="session"/>
在這個數(shù)據(jù)源中,代表數(shù)據(jù)庫的變量名(var)是jstl_sql;數(shù)據(jù)庫名是TestDB;由于JDBC驅動程序類的名稱是sun.jdbc.odbc.JdbcOdbcDriver,故數(shù)據(jù)庫類型是MSAccess。jstl_sql的作用范圍是session。
2.?<sql:query>標簽
<sql:query>標簽是SQL查詢標簽,使用該標簽可以從數(shù)據(jù)庫的表中讀取數(shù)據(jù)。該標簽有如下三種用法。
語法格式1:沒有Body時。
<sql:querysql="sqlQuery"var="varName"[dataSource="dataSource"]
[scope="scope"][maxRows="maxRows"][startRow="startRow"]/>
語法格式2:有一個Body,并且在Body中指定了查詢的參數(shù)。
<sql:querysql="sqlQuery"var="varName"[dataSource="dataSource"]
[scope="scope"][maxRows="maxRows"][startRow="startRow"]>
<sql:param>actions
</sql:query>
語法格式3:有Body并且指定可選的查詢參數(shù)時。
<sql:queryvar="varName"[dataSource="dataSource"]
[scope="scope"][maxRows="maxRows"][startRow="startRow"]>
SQLquery
optional<sql:param>actions
</sql:query>
<sql:query>標簽的屬性如表12.5所示。
表12.5<sql:query>標簽的屬性3.用于更新的<sql:update>標簽
<sql:update>標簽用于更新數(shù)據(jù)庫。它的語法中除了查詢語句是SQL更新語句外,其它一些屬性選項與<sql:query>標簽是相同的。
4.SQL標簽應用程序示例
下面是一個使用SQL類的標簽設置數(shù)據(jù)源,查詢數(shù)據(jù)庫表中數(shù)據(jù)的sql_query.jsp程序實例。該例將JSP與MSAccess數(shù)據(jù)庫TestDB.mdb連接,使用兩種查詢語句從student表中查詢輸出所有記錄和某一條記錄。student表的結構和內(nèi)容見表12.6。
表12.6student表的結構和內(nèi)容sql_query.jsp程序如下:
<%@taglibprefix="c"uri="/jstl/core"%>
<%@taglibprefix="sql"uri="/jstl/sql"%>
<%@pagecontentType="text/html;charset=gb2312"%>
<html>
<head><title>JSTL:的使用</title></head>
<bodybgcolor="#FFFFFF">
創(chuàng)建Access數(shù)據(jù)源,
<sql:setDataSourcevar="jstl_sql"driver="sun.jdbc.odbc.JdbcOdbcDriver"
url="jdbc:odbc:TestDB"scope="session"/>
查詢輸出student表:<hr>
<%--將得到表的結果集賦給queryResults--%>
<sql:queryvar="queryResults"dataSource="${jstl_sql}">
SELECT*FROMstudent
</sql:query>
<tableborder="1">
<%--輸出queryResults中的表頭--%>
<c:forEachvar="columnName"items="${queryResults.columnNames}">
<th><c:outvalue="${columnName}"/></th>
</c:forEach>
<%--輸出queryResults中的內(nèi)容--%>
<c:forEachvar="row"items="${queryResults.rows}">
<tr>
<td><c:outvalue="${row.id}"/></td>
<td><c:outvalue="${}"/></td>
<td><c:outvalue="${row.score}"/></td>
</tr>
</c:forEach>
</table>
<p>
查詢名字為李莉的同學:<hr>
<sql:queryvar="query1"dataSource="${jstl_sql}">
SELECT*FROMstudentwherename=?
<sql:paramvalue="李莉"/>
</sql:query>
<tableborder="1">
<tr><td>學號</td><td>姓名</td><td>成績</td>
</tr>
<c:forEachvar="row"items="${query1.rows}">
<tr>
<td><c:outvalue="${row.id}"/></td>
<td><c:outvalue="${}"/></td>
<td><c:outvalue="${row.score}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>該程序的運行結果如圖12.25所示。這個程序中的<sql:queryvar="queryResults"dataSource="${jstl_sql}">SELECT*FROMstudent</sql:query>語句指出從變量名jstl_sql所指的數(shù)據(jù)庫中查詢student表,將查詢的結果賦給queryResults對象保存(queryResults對象是javax.servlet.jsp.jstl.sql.Result類的實例)。然后通過<c:forEach>到</c:forEach>標簽循環(huán)地取得結果集中的數(shù)據(jù),再通過<c:out>標簽進行輸出。其中第一組<c:forEach>標簽用于循環(huán)地取得表中的字段名;第二組<c:forEach>標簽用于循環(huán)地取得表中的每一條記錄。
JSTL的SQL標簽提供了JSP頁面與數(shù)據(jù)庫進行交互的功能,訪問數(shù)據(jù)庫比較方便。然而它卻是違反MVC模型規(guī)范的。因為與數(shù)據(jù)庫交互的工作本身就屬于業(yè)務邏輯層的工作,所以不應該在JSP頁面中出現(xiàn),而應該在模型層中進行。但是,SQL標簽的存在對于早期純JSP開發(fā)的應用以及小型的開發(fā)有重要的意義。另外,對于那些不熟悉或不適應Java語言的JSP頁面作者提供了方便。
圖12.25sql_query.jsp的運行結果12.4.4XML核心動作應用
在企業(yè)級應用越來越依賴XML的今天,XML格式的數(shù)據(jù)被作為信息交換的優(yōu)先選擇。JSTL標簽庫中的XML標簽為程序設計者提供了對XML格式文件的基本操作。在該標簽庫中共有10個標簽,被分為三類,分別是:XML核心動作、XML流程控制動作和XML轉換動作。本節(jié)通過兩個例子簡要地說明XML核心動作和XML流程控制動作標簽。注意,若要在本章第3節(jié)介紹的Eclipse+Myeclipse
+Tomcat的運行環(huán)境中使用JSTL的XML標簽,還需要下載xalan.jar和serializer.jar兩個支持包。讀者可以從/dist/xml/xalan-j/下載xalan-j_2_7_0-bin-2jars.zip文件,解壓后將其中的xalan.jar和serializer.jar兩個包復制到Tomcat的lib目錄中。
XML核心動作有<x:parse>、<x:out>和<x:set>三個標簽。其中:<x:parse>用于解析XML文檔;<x:out>用于計算Xpath表達式,并把計算結果返回給JspWriter對象進行輸出;<x:set>也用于計算Xpath表達式,但它把計算結果保存到某個范圍的變量中。它們的語法格式分別如下所示。表12.7列出了這些標簽中的屬性。
<x:parse>語法格式1:解析由String或者Reader對象組成的XML文檔。
<x:parsexml="XMLDocument"{var="var"[scope="scope"]|varDom="var"
[scopeDom="scope"]}[systemId="systemId"][filter="filter"]/>
<x:parse>語法格式2:解析在Body中指定的XML文檔。
<x:parse{var="var"[scope="scope"]|varDom="var"[scopeDom="scope"]}
[systemId="systemId"][filter="filter"]/>
XMLDocumenttoparse
</x:parse>
<x:out>語法格式:
<x:outselect="XpathExpressin"[escapeXml="{true|false}"]/>
<x:set>語法格式:
<x:setselect="XpathExpressin"var="varName"[scope="scope"]/>
表12.7XML核心動作的屬性下面的例子說明XML核心動作的使用。我們使用12.3.4節(jié)介紹的方法新建一個名為ch12_xml的Web項目,在這個項目中新建一個名為xml_tag.jsp的JSP文件,在這個文件中輸入下述代碼:
<%@tagliburi="/jstl/core"prefix="c"%>
<%@tagliburi="/jstl/xml"prefix="x"%>
<%@pagecontentType="text/html;charset=gb2312"%>
<html>
<head><title>JSTL:XML的使用</title></head>
<bodybgcolor="#FFFFFF">
<x:parsevar="bookxml">
<books>
<bookid="02">
<name>BookName:Web應用開發(fā)技術:JSP</name>
<author>Author:崔尚森張白一</author>
<publisher>publisher:西安電子科技大學出版社</publisher>
</book>
</books>
</x:parse>
<x:outselect="$bookxml/books//name"/><br/>
<x:outselect="$bookxml/books//author"/><br/>
<x:outselect="$bookxml/books//publisher"/>
</body>
</html>
輸入完成后,發(fā)布運行xml_tag.jsp程序,可看到如圖12.26所示的結果。
圖12.26xml_tag.jsp的運行結果12.4.5XML流程控制動作應用
XML流程控制動作標簽有<x:if>、<x:choose>、<x:when>、<x:otherwise>和<x:forEach>五個,它們提供了基于XPath表達式的流程控制。它與core流程控制動作標簽<c:if>、<c:choose>和<c:forEach>等非常類似,不同的是XML流程控制動作標簽應用了XPath表達式。例如:
<x:forEachselect="$do
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023九年級數(shù)學下冊 第27章 圓27.2 與圓有關的位置關系1點與圓的位置關系說課稿 (新版)華東師大版
- 2025從“京派、海派”之爭辨析民間委托炒股合同的效力
- 2025合同模板股東合作合同范本
- 2025借款合同版(單位住房)
- 2025勞動合同的有效要件范本
- 2025代工生產(chǎn)合同
- 清洗施工方案
- 路燈燈具整改施工方案
- 路燈改造工程施工方案
- Unit 3 Amazing animals PartA (說課稿)-2024-2025學年人教PEP版(2024)英語三年級上冊
- 五年級數(shù)學(小數(shù)乘除法)計算題專項練習及答案匯編
- 上海市楊浦區(qū)2024-2025學年八年級上學期英語期末考卷(含筆試答案無聽力答案、原文及音頻)
- 2024年蘇州農(nóng)業(yè)職業(yè)技術學院高職單招語文歷年參考題庫含答案解析
- 2025年北京生命科技研究院招聘筆試參考題庫含答案解析
- 銀行金融機構銀行金融服務協(xié)議
- GB/T 27697-2024立式油壓千斤頂
- 《消防機器人相關技術研究》
- 游泳館安全隱患排查
- 《媒介社會學》課件
- 項目設計報告范文高中
- 成人手術后疼痛評估與護理團體標準
評論
0/150
提交評論