《Web應(yīng)用開發(fā)技術(shù)》課件第十二章_第1頁
《Web應(yīng)用開發(fā)技術(shù)》課件第十二章_第2頁
《Web應(yīng)用開發(fā)技術(shù)》課件第十二章_第3頁
《Web應(yīng)用開發(fā)技術(shù)》課件第十二章_第4頁
《Web應(yīng)用開發(fā)技術(shù)》課件第十二章_第5頁
已閱讀5頁,還剩149頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

12.1標(biāo)簽庫概述12.2自定義標(biāo)簽庫的開發(fā)12.3安裝配置支持JSTL的IDE12.4JSTL應(yīng)用編程舉例習(xí)題12第12章JSP標(biāo)簽庫

標(biāo)簽庫與JavaBean類似,也是一種軟件復(fù)用技術(shù),但標(biāo)簽庫具有比JavaBean更豐富的運(yùn)行時(shí)協(xié)議。

本章首先講述標(biāo)簽庫的概念、JSTL標(biāo)簽分類和標(biāo)簽實(shí)現(xiàn)接口,接著介紹用戶自定義標(biāo)簽的開發(fā)。為了使我們更容易地使用標(biāo)準(zhǔn)標(biāo)簽庫,本章第3節(jié)介紹了一種支持JSTL的集成開發(fā)環(huán)境:Eclipse+MyEclipse+Tomcat。第4節(jié)講述如何使用JSTL開發(fā)Web應(yīng)用。

12.1.1標(biāo)簽庫的概念

標(biāo)簽擴(kuò)展是一個(gè)Java類,它是運(yùn)行一個(gè)或者兩個(gè)接口的JavaBean。在JSP規(guī)范里,標(biāo)簽具有比JavaBean更豐富的運(yùn)行時(shí)(Runtime)協(xié)議。它可以非常緊密地和JSP的表示邏輯聯(lián)系在一起,同時(shí)它又具有和普通JavaBean相同的業(yè)務(wù)邏輯處理能力。標(biāo)簽庫的典型應(yīng)用有控制顯示邏輯、內(nèi)容迭代和訪問數(shù)據(jù)庫等。12.1標(biāo)?簽?庫?概?述與HTML、XML類似,標(biāo)簽可以帶有屬性和主體(Body),也可以沒有屬性和主體,它們是可選的。最簡單的標(biāo)簽沒有屬性和主體。下面是幾種典型的標(biāo)簽:

●不帶屬性和主體的標(biāo)簽。

●不帶主體但有屬性的標(biāo)簽。

●帶有屬性和主體的標(biāo)簽。

另外,一個(gè)標(biāo)簽也可以嵌套在另一個(gè)標(biāo)簽里面,這就使得標(biāo)簽可以有很強(qiáng)的頁面內(nèi)容管理能力。從標(biāo)簽的來源上看,JSP中的標(biāo)簽庫可以分為兩種類型:一種是JSP標(biāo)準(zhǔn)標(biāo)簽庫(JSPStandardTagLibrary,JSTL),它是JSP開發(fā)環(huán)境供應(yīng)商開發(fā)的;另一種是JSP開發(fā)環(huán)境的使用者(即用戶)自己定義的標(biāo)簽。

通過使用標(biāo)簽庫,可以簡化JSP和Web應(yīng)用程序的開發(fā),減少JSP中的腳本代碼量,大大降低JSP頁面的復(fù)雜度,并且使代碼最大程度地重用。

12.1.2標(biāo)簽庫的接口和類的繼承關(guān)系

JSP所有的標(biāo)簽都實(shí)現(xiàn)了javax.servlet.jsp.tagext.JspTag接口。這個(gè)接口是一個(gè)標(biāo)記接口,它有兩個(gè)直接子接口:一個(gè)是SimpleTag接口,它是JSP2.0新增加的接口,代表簡單的標(biāo)簽;另一個(gè)是Tag接口,它是經(jīng)典的、必須實(shí)現(xiàn)的接口,它有一個(gè)直接子接口IterationTag。標(biāo)簽庫的接口和類的繼承關(guān)系如圖12.1所示。

圖12.1標(biāo)簽庫的接口和類的繼承關(guān)系

IterationTag是用于開發(fā)迭代的標(biāo)簽,它有一個(gè)簡單的實(shí)現(xiàn)類TagSupport。在開發(fā)時(shí),我們只要從TagSupport擴(kuò)展就可以開發(fā)出迭代的標(biāo)簽了。IterationTag還有一個(gè)子接口BodyTag,該子接口允許帶有Body。BodyTag也有一個(gè)實(shí)現(xiàn)類BodyTagSupport。在開發(fā)BodyTag時(shí),往往直接從BodyTagSupport繼承就可以了。當(dāng)然,我們在開發(fā)自己的標(biāo)簽時(shí),除了繼承原有的類之外,也可以直接實(shí)現(xiàn)Tag接口。SimpleTag是JSP2.0新增加的一種標(biāo)簽類。12.1.3Tag接口中定義的方法和常量

在Tag接口中,定義了如下一些方法:doStartTag(),doEndTag(),setPagcontext(),setParent(),getParent(),release()。

表12.1給出了Tag接口中定義的標(biāo)識符常量和成員方法。

表12.1Tag接口中定義的標(biāo)識符常量和成員方法12.1.4JSTL介紹

從JSP1.1開始,JSP就支持在JSP中使用自定義標(biāo)簽了。自定義標(biāo)簽的廣泛使用造成了程序員的重復(fù)定義,這就促成了標(biāo)準(zhǔn)標(biāo)簽庫(JSPStandardTagLibaray,JSTL)的誕生。

JSTL是一個(gè)不斷完善的開放源代碼的JSP標(biāo)簽庫,是由Apache的Jakarta小組開發(fā)的。JSTL運(yùn)行在支持JSP1.2和Servlet2.3以上規(guī)范的容器上,如Tomcat4.0以上的版本。在JSP2.0規(guī)范中,JSTL被作為標(biāo)準(zhǔn)支持。JSTL的最新版本是JSTL1.1。

JSTL是一個(gè)實(shí)現(xiàn)Web應(yīng)用程序中通用功能的定制標(biāo)簽的集合,這些功能包括迭代和條件判斷、數(shù)據(jù)管理格式化、XML操作以及數(shù)據(jù)庫訪問等。目前,在JSTL中有core、format、sql和xml四個(gè)定制的標(biāo)簽庫,每個(gè)標(biāo)簽庫中都包含一些特定的標(biāo)簽。

core標(biāo)簽庫提供了定制操作,通過限制了作用域的變量管理數(shù)據(jù),以及執(zhí)行頁面內(nèi)容的迭代和條件操作。format標(biāo)簽庫定義了用來格式化數(shù)據(jù)(尤其是數(shù)字和日期)的操作。它還支持使用本地化資源來進(jìn)行JSP頁面的國際化。xml標(biāo)簽庫包含一些用來操作通過XML表示數(shù)據(jù)的標(biāo)簽。sql標(biāo)簽庫定義了一些用來查詢關(guān)系數(shù)據(jù)庫的操作。各個(gè)標(biāo)簽庫所包含的標(biāo)簽及其功能等見表12.2。關(guān)于這方面的更詳細(xì)描述請參閱/j2ee/1.3/docs/tutorial/doc/JSTL3.html~JSTL9.html。

表12.2目前JSTL中包含的標(biāo)簽、前綴及其分類和功能12.1.5表達(dá)式語言(EL)

表達(dá)式語言(ExpressionLanguage)是JSP2.0新增加的技術(shù)。通過表達(dá)式語言,可以非常簡單地訪問JavaBean中的屬性,可以簡化JSP開發(fā),使代碼整潔。在使用標(biāo)簽庫時(shí)常用到表達(dá)式語言。

表達(dá)式語言是用符號“$”開始的,內(nèi)容包括在花括號“{”和“}”中。例如,在12.4.1節(jié)的示例程序c12_3.jsp中就有下面兩句使用了表達(dá)式語言:

<c:outvalue="${header['user-agent']}"/>

<c:outvalue="${a}"escapeXml="true"/>

其中的${header['user-agent']}和${a}都是表達(dá)式語言。

1.常用的隱含對象

JSP表達(dá)式語言定義了一些隱含對象,使用表達(dá)式語言可以方便地訪問這些隱含對象。這些隱含對象除了我們在第5章介紹的內(nèi)置對象中的request、response、sessin、cookie、pageContent外,還有:

requestScope:把請求作用域內(nèi)的屬性名稱和值進(jìn)行映射。

sessionScope:把會話作用域內(nèi)的屬性名稱和值進(jìn)行映射?!?/p>

applicationScope:把應(yīng)用程序作用域內(nèi)的屬性名稱和值進(jìn)行映射。

pageScope:把頁面作用域內(nèi)的屬性名稱和值進(jìn)行映射。

param:把請求中的參數(shù)名稱和單個(gè)值進(jìn)行映射。

paramValues:把請求中的參數(shù)名和單個(gè)值進(jìn)行映射。

header:把請求中的header名和一個(gè)String類型的數(shù)組進(jìn)行映射。

headerValues:把請求中的header名和一個(gè)String類型的數(shù)組進(jìn)行映射。

2.?EL運(yùn)算符

表達(dá)式語言定義了以下的操作:

●算術(shù)運(yùn)算符:+、-、*、/(或div)和%(或mod)。

●關(guān)系運(yùn)算符:==(或eq)、!=(或ne)、<(或lt)、>(或gt)、<=(或le)和>=(或ge)。

●邏輯運(yùn)算符:&&(或and)、||(或or)和!(或not)。上述三類操作與我們在第4章講述的內(nèi)容一致。

●驗(yàn)證運(yùn)算符:empty。用于判斷某個(gè)值是否為null或empty。

●點(diǎn)運(yùn)算符:.。點(diǎn)運(yùn)算符通常用于訪問對象的特性。例如,在表達(dá)式${user.firstName}中,使用點(diǎn)運(yùn)算符來訪問user標(biāo)識符所引用對象的名為firstName的特性?!穹嚼ㄌ栠\(yùn)算符:[]。方括號運(yùn)算符用來檢索數(shù)組和集合的元素。在數(shù)組和有序集合的情況下,把要檢索的元素的下標(biāo)放在方括號中。對于實(shí)現(xiàn)java.util.Map接口的集合,方括號運(yùn)算符使用關(guān)聯(lián)的鍵查找存儲在映射中的值。在方括號中指定鍵,并將相應(yīng)的值作為表達(dá)式的值返回。

點(diǎn)運(yùn)算符和方括號運(yùn)算符在某種程度上可以互換。點(diǎn)運(yùn)算符和方括號運(yùn)算符具有最高的優(yōu)先級。

自定義標(biāo)簽技術(shù)是從JSP1.1開始支持的,而且在JSP1.2和2.0規(guī)范中得到了不斷加強(qiáng)。通過定義標(biāo)簽庫,可以簡化JSP和Web應(yīng)用程序的開發(fā),減少JSP中的腳本代碼量,大大降低JSP頁面的復(fù)雜度,并且使代碼最大程度地重用。12.2自定義標(biāo)簽庫的開發(fā)12.2.1自定義標(biāo)簽的組成和開發(fā)步驟

自定義標(biāo)簽由標(biāo)簽處理程序和標(biāo)簽的描述組成。標(biāo)簽處理程序就是Java類,類中包含了請求期間將要執(zhí)行的Java代碼。當(dāng)遇到特定的標(biāo)簽時(shí),標(biāo)簽處理程序就會告訴系統(tǒng)應(yīng)該做什么。標(biāo)簽的描述聲明了怎樣使用這個(gè)標(biāo)簽。如果用戶要開發(fā)和使用自定義標(biāo)簽,則有下述四個(gè)步驟:

(1)開發(fā)標(biāo)簽實(shí)現(xiàn)類。也就是用Java語言來開發(fā)自己的標(biāo)簽庫。開發(fā)標(biāo)簽實(shí)現(xiàn)類又有兩種選擇:一種是直接實(shí)現(xiàn)原始的Tag接口;另一種是從TagSupport類繼承。

(2)編寫標(biāo)簽描述文件。這個(gè)描述文件通常是以

.tld結(jié)尾的。

(3)修改web.xml文件。在web.xml文件中指定標(biāo)簽庫的引用。

(4)編寫JSP頁面文件。在這個(gè)頁面中通過<%

@

taglib>標(biāo)簽將自定義標(biāo)簽引入,從而實(shí)現(xiàn)使用自定義標(biāo)簽的目的。JSP容器使用這個(gè)標(biāo)簽庫來確定在遇到定制標(biāo)簽時(shí)該怎么做。12.2.2繼承TagSupport類開發(fā)自定義標(biāo)簽

下面通過繼承TagSupport類來開發(fā)一個(gè)簡單的標(biāo)簽,以說明自定義標(biāo)簽的開發(fā)過程。該例共包括四個(gè)文件,分別是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目錄下建一個(gè)tlds目錄,將mytag.tld文件放在這個(gè)目錄下。

1.開發(fā)標(biāo)簽實(shí)現(xiàn)類

開發(fā)實(shí)現(xiàn)類就是編寫

.java文件。本例通過繼承TagSupport類來開發(fā)標(biāo)簽實(shí)現(xiàn)類,文件名是HelloTag.java,它被放在一個(gè)名為bean的包中。

HelloTag.java文件的內(nèi)容如下:

packagebean; //給出包名

importjavax.servlet.jsp.*;

importjavax.servlet.jsp.tagext.*;

importjava.io.IOException;

importjava.util.Date;

//通過繼承TagSupport類來開發(fā)標(biāo)簽

publicclassHelloTagextendsTagSupport

{

publicintdoStartTag()throwsJspTagException

{//覆蓋doStartTag方法

returnEVAL_BODY_INCLUDE;

}

publicintdoEndTag()throwsJspTagException

{//覆蓋doEndTag方法

StringdateString=newDate().toString();

try

{

pageContext.getOut().write("你好這是我自己開發(fā)的標(biāo)簽HelloTag<br>

現(xiàn)在的時(shí)間是:"+dateString);

}

catch(IOExceptionex)

{

thrownewJspTagException("Error:hellotagconldnotwritetoJSP");

}

returnEVAL_PAGE;

}

}

2.編寫標(biāo)簽描述文件

標(biāo)簽描述文件是用XML格式書寫的,且其擴(kuò)展名固定為

.tld。本例的標(biāo)簽描述文件名為mytag.tld,其內(nèi)容如下:

<?xmlversion="1.0"encoding="gb2312"?>

<taglib>

<description>

AtaglibraryexercisingSimpleTaghandlers.

</description>

<tlib-version>1.0</tlib-version><!--標(biāo)簽版本不能為空,且必須為準(zhǔn)確值-->

<short-name>examples</short-name>

<uri>/demotag</uri>

<!--指定調(diào)用此標(biāo)簽的URI,demotag是系統(tǒng)默認(rèn)的自定義標(biāo)簽庫-->

<description>Asimpletablibraryfortheexample</description>

<tag>

<name>hello_tag</name>

<tag-class>bean.HelloTag</tag-class>

<!--類文件名一定要有包,且不可以使用默認(rèn)的包-->

<body-content>empty</body-content>

<description>

Simplehelloworldexamples.Takesnoattribute,andsimplygeneratesHTML

</description>

</tag>

</taglib>

3.編寫web.xml文件

在web.xml文件中指定標(biāo)簽庫的引用。本例中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>

在這個(gè)文件中,最關(guān)鍵的是<taglib-uri>和<taglib-location>兩句,它們分別指出標(biāo)簽文件的存放路徑和標(biāo)簽描述文件的存放位置,不能寫錯。

4.編寫使用自定義標(biāo)簽的JSP頁面文件

在JSP頁面文件中通過<%@taglib>指令將自定義標(biāo)簽引入,從而實(shí)現(xiàn)使用自定義標(biāo)簽的目的。本例中的JSP頁面文件是c12_1.jsp,其內(nèi)容如下:

<%@tagliburi="/demotag"prefix="hello"%>

<%@pagecontentType="text/html;charset=gb2312"language="java"%>

<html>

<head>

<title>自定義tag使用實(shí)例</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í)行這個(gè)JSP文件,就可以看到如圖12.2所示的效果。

這一過程看起來似乎有些復(fù)雜,但是,如果要在多處使用同樣的代碼時(shí),就可以將這些代碼寫在一個(gè)自定義的標(biāo)簽中,做到一次編寫,多處使用。此外,由于使用了標(biāo)簽,不僅增加了代碼的重用度,而且也使頁面易于維護(hù)。例如,可以把一些需要迭代顯示的內(nèi)容做成一個(gè)標(biāo)簽,在每次迭代顯示時(shí),使用這個(gè)標(biāo)簽就可以了,不必重復(fù)書寫這些代碼。

圖12.2使用自定義標(biāo)簽hello的示例程序的執(zhí)行效果12.2.3實(shí)現(xiàn)Tag接口開發(fā)自定義標(biāo)簽

下面再給出一個(gè)通過實(shí)現(xiàn)Tag接口的方式來開發(fā)標(biāo)簽程序的例子。這個(gè)例子和12.1.3節(jié)給出的例子只在

.java文件的內(nèi)容上有所不同。這是因?yàn)榻涌谔峁┑姆椒ǘ际浅橄蠓椒?,需要在使用此接口的程序中?shí)現(xiàn)這些方法。其它幾個(gè)文件內(nèi)容只需做簡單的修改就可以了。實(shí)現(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

{//實(shí)現(xiàn)Tag接口

privatePageContextpageContext;

privateTagparent;

publicHelloTag(){super();}//構(gòu)造方法

publicvoidsetPageContext(finaljavax.servlet.jsp.PageContextpageContext)

{this.pageContext=pageContext;}//設(shè)置標(biāo)簽的頁面的上下文

publicvoidsetParent(finaljavax.servlet.jsp.tagext.Tagparent)

{this.parent=parent;}//設(shè)置上一級標(biāo)簽

publicjavax.servlet.jsp.tagext.TaggetParent()

{returnparent;}//獲取上一級標(biāo)簽

publicintdoStartTag()throwsjavax.servlet.jsp.JspTagException

{returnSKIP_BODY;

//開始標(biāo)簽時(shí)的操作返回SKIP_BODY,表示不計(jì)算標(biāo)簽體

}

publicintdoEndTag()throwsjavax.servlet.jsp.JspTagException

{//結(jié)束標(biāo)簽時(shí)的操作

try

{pageContext.getOut().write("Hello,你好!"); }

catch(java.io.IOExceptione)

{ thrownewJspTagException("IOError:"+e.getMessage());}

returnEVAL_PAGE;

}

publicvoidrelease(){}//釋放標(biāo)簽程序占用的資源

}完成上述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>

最后,再編寫一個(gè)具有如下內(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í)行這個(gè)JSP文件,就可以輸出如圖12.3所示的“Hello,你好!”的信息。

圖12.3使用自定義標(biāo)簽hello的示例程序的執(zhí)行效果

雖然自JSP1.0開始就有了JSTL,而且從JSP2.0起,JSTL得到了進(jìn)一步加強(qiáng),并作為標(biāo)準(zhǔn)的支持。但是,由于第3章介紹的Eclipse中文加強(qiáng)版還沒有把JSTL和Tomcat捆綁在一起,若要使用JSTL,需要下載

.jar和

.tld文件,而且這些文件都有特定的存放位置,需要創(chuàng)建相應(yīng)的文件夾進(jìn)行安裝,操作比較復(fù)雜且容易出錯。為此,我們在本節(jié)引入支持JSTL的集成開發(fā)環(huán)境,即Eclipse+MyEclipse+Tomcat環(huán)境,講解如何把這些工具整合在一起使用。使用本節(jié)介紹的方法,就可以去除使用JSTL的上述煩惱。12.3安裝配置支持JSTL的IDE12.3.1安裝前的準(zhǔn)備工作

Eclipse、MyEclipse都是開源軟件,而且是免費(fèi)的,可以直接在其官方網(wǎng)站上下載。這些文件的下載地址如下:

Eclipse3.2.2:/downloads/

MyEclipse5.1.1:/

Tomcat6.0:注意:Eclipse版本與MyEclipse版本必須匹配,如果你使用的Eclipse版本和上面列示的不一樣,那你必須找到和你的Eclipse版本匹配的MyEclipse版本,否則是不能正常安

裝的。

從上面列出的站點(diǎn)下載下列資源到f:\abc文件夾下。這是因?yàn)楸纠詅:\abc文件夾為安裝目錄,如果你計(jì)劃的安裝目錄與我們的不同,請下載到你計(jì)劃的目錄中(下同)。

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的安裝目錄,這樣才可以把插件正確地安裝進(jìn)去。

圖12.4安裝MyEclipse_5.1.1——選擇Eclipse文件夾

(1)安裝JDK1.6與Tomcat6的步驟見第3章。本節(jié)是在第3章JDK已安裝好的前提條件下進(jìn)行的。如果你還沒有安裝JDK,請按照第3章介紹的方法先把JDK安裝好。

JDK1.6的安裝目錄是:F:\Java\jdk1.6.0。

Tomcat6.0.10的安裝目錄是:F:\abc\Tomcat6.0。

(2)安裝MyEclipse_5.1.1插件。運(yùn)行MyEclipse_5.1.1GA_Installer.exe,出現(xiàn)如圖12.4所示的對話框。在這個(gè)對話框中輸入存放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)建圖標(biāo)和熱鍵對話框,在這里可取默認(rèn)值。單擊“Next”,彈出圖12.7所示對話框。

(5)圖12.7是對前幾步設(shè)置的確認(rèn)信息對話框。單擊“Install”按鈕,開始安裝,彈出圖12.8所示的對話框。圖12.5安裝MyEclipse_5.1.1——選擇安裝文件夾

圖12.6創(chuàng)建圖標(biāo)和熱鍵對話框

圖12.7安裝位置確認(rèn)對話框

圖12.8是否打開“ReleaseNotes”對話框

(6)圖12.8所示的對話框是詢問在安裝完成后是否打開“ReleaseNotes”對話框。取默認(rèn)值,單擊“Next”,彈出圖12.9所示的對話框。

(7)圖12.9是顯示“ReleaseNotes”信息的對話框。單擊“Done”按鈕,完成安裝。

圖12.9安裝成功對話框12.3.3MyEclipse的其它一些設(shè)置

(1)設(shè)置工作區(qū)(目錄)。運(yùn)行f:\abc下的MyEclipse5.1.1GA,選擇或設(shè)置工作區(qū)。如圖12.10所示,本例設(shè)置的工作區(qū)為F:\xiti。

(2)配置Profereces。如圖12.11所示,在MyEclipse的菜單欄中依次選擇“Window”、“Profereces”,彈出如圖12.12所示的“Preferences”對話框。

圖12.10選擇工作目錄對話框圖12.11設(shè)置MyEclipse的Profereces在圖12.12所示的“Preferences”對話框的左側(cè)目錄樹中,逐層展開“MyEclipse”、“ApplicationServers”選項(xiàng);在“ApplicationServers”中選擇“Tomcat5”或“Tomcat6”,然后再在右側(cè)選中“TomcatServer”下的“Enable”單選按鈕;最后,點(diǎn)擊“Apply”按鈕后再單擊“OK”按鈕,完成這一設(shè)置過程。

圖12.12配置Profereces12.3.4一個(gè)使用JSTL的通用web.xml文件

在使用JSTL標(biāo)簽時(shí)總要用到web.xml文件。為了簡化本章以下各節(jié)中有關(guān)這個(gè)文件的修改,下面我們給出一個(gè)使用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庫中的各類標(biāo)簽,選擇其中較常用的部分標(biāo)簽給出應(yīng)用實(shí)例進(jìn)行說明。

12.4.1<c:set>和<c:out>標(biāo)簽應(yīng)用

1.

<c:set>標(biāo)簽語法

<c:set>標(biāo)簽用于設(shè)置某個(gè)對象的作用范圍(page,request,session,application)或某個(gè)對象的屬性。它有如下幾種語法格式:12.4JSTL應(yīng)用編程舉例

(1)使用value屬性設(shè)置var屬性的值和作用范圍(scope)。

<c:setvalue="value"var="varName"[scope="{page|request|session|application}"]/>

(2)設(shè)置var屬性的作用范圍,并且?guī)в幸粋€(gè)body。

<c:setvar="varName"[scope="{page|request|session|application}"]>

標(biāo)簽主體內(nèi)容

</c:set>

(3)設(shè)置某個(gè)對象的一個(gè)屬性。

<c:setvalue="value"target="target"property="proprtyName"/>

(4)設(shè)置某個(gè)對象的一個(gè)屬性,并帶有一個(gè)body。

<c:settarget="target"property="proprtyName"/>

標(biāo)簽主體內(nèi)容

</c:set>

其中:var是用于表示value值的屬性名;value屬性的取值可以是一個(gè)具體值,也可以是一個(gè)將要計(jì)算的EL表達(dá)式;scope是var的有效范圍;target代表將要設(shè)置屬性的對象,它必須是一個(gè)JavaBean或java.util.Map對象;property是設(shè)置對象target的一個(gè)屬性名。

2.?<c:out>標(biāo)簽語法

<c:out>標(biāo)簽的作用是輸出表達(dá)式的值,相當(dāng)于JSP腳本中的<%=variableName%>語句。它的語法如下:

(1)沒有body時(shí)。

<c:outvalue="value"escapeXml="{true

|

false}"[default="defaultValue"]/>

(2)帶有body時(shí)。

<c:outvalue="${variableNam}"[escapeXml="{true|false}"]>

defaultvalue

</c:out>其中:value的取值可以是一個(gè)具體值,也可以是一個(gè)將要計(jì)算的EL表達(dá)式;escapeXml屬性的作用是確定以下五個(gè)字符:<、>、&、’、”,在結(jié)果字符串中是否被轉(zhuǎn)換成字符實(shí)體代碼,該屬性的默認(rèn)值為true;default是個(gè)可選取項(xiàng),當(dāng)value為null時(shí),輸出default的值。

3.在MyEclipse中創(chuàng)建應(yīng)用JSTL程序的過程

作為使用JSTL的第一個(gè)例子,下面我們從MyEclipse中創(chuàng)建項(xiàng)目的操作開始,分步講解在MyEclipse中創(chuàng)建一個(gè)項(xiàng)目到運(yùn)行一個(gè)測試程序的過程。

1)創(chuàng)建項(xiàng)目

啟動MyEclipse,在菜單欄中依次單擊打開“File”、“New”、“Project”菜單項(xiàng),彈出如圖12.13所示的“NewProject”對話框。

圖12.13“NewProject”對話框在這個(gè)對話框中,依次單擊展開“MyEclipse”、“J2EEProject”,選中“WebProject”項(xiàng)后,單擊“Next”按鈕,出現(xiàn)如圖12.14所示的對話框(注意,第1次使用時(shí)需要注冊)。在這個(gè)對話框的“ProjectName”后的框中輸入名稱“ch12”。然后,再選中“JSTLSupport”項(xiàng)下的“AddJSTLlibrariesto…”復(fù)選框;再選中“JSTL1.0”和“JSTL1.1”兩個(gè)單選按鈕中的任意一個(gè)(目前通常選JSTL1.1)。最后,點(diǎn)擊“Finish”按鈕,完成這一設(shè)置。

圖12.14配置新建項(xiàng)目對話框

2)創(chuàng)建JSP文件

接著我們再新建一個(gè)名為c12_3.jsp的JSP文件。在“PackageExplorer”(資源管理器)窗口的“ch12”項(xiàng)目上單擊右鍵,彈出如圖12.15所示的快捷菜單。在這個(gè)菜單中依次選擇“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>測試第一個(gè)使用JSTL的網(wǎng)頁</title></head>

<body>

<c:outvalue="歡迎測試第一個(gè)使用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文件中指定標(biāo)簽庫的引用。由于我們在12.3.4節(jié)已經(jīng)給出了一個(gè)通用的web.xml文件,所以,這里的修改工作只是把12.3.4節(jié)給出的web.xml文件復(fù)制到WEB-INF目錄下。但需要指出的是,由于本例中只使用了<c:out>和<c:set>標(biāo)簽,所以實(shí)際上只用到該文件中的下述兩段:

<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文件設(shè)置<taglib>標(biāo)簽時(shí)會產(chǎn)生異常。產(chǎn)生這種異常的一種可能是因?yàn)閣eb.xml文檔需要的DTD格式不一致。對于這種情況,只要把<web-app>后面的屬性全部刪除就可以了。還有一種情況是由于新版本的web.xml文件中沒有<taglib>標(biāo)簽項(xiàng)。在這種情況下,可以先在<web-app>層內(nèi)加入<jsp-config>層,再把<taglib>標(biāo)簽的內(nèi)容寫在<jsp-config>層內(nèi)就可以運(yùn)行了。12.3.4節(jié)給出的web.xml文件就是經(jīng)過上述處理的。

5)運(yùn)行發(fā)布前的工作

運(yùn)行發(fā)布時(shí)需要指定所使用的服務(wù)器。圖12.17~圖12.20說明了這一過程。操作步驟如下:

(1)單擊圖12.17工具欄中圓圈標(biāo)示的按鈕,出現(xiàn)圖12.18所示的界面。

圖12.17運(yùn)行發(fā)布界面

(2)在圖12.18所示的界面上,首先單擊“Project”后的下拉列表按鈕,選定項(xiàng)目名。本例的項(xiàng)目名是在圖12.14中設(shè)置的,如圖12.18所示,為ch12。然后單擊“Add”按鈕,出現(xiàn)如圖12.19所示的對話框,為項(xiàng)目添加服務(wù)器。

(3)在圖12.19所示的界面上,首先單擊“Server”后的下拉列表按鈕,從中選定服務(wù)器。本例的服務(wù)器如圖12.20所示,是Tomcat6。然后單擊“Finish”按鈕,出現(xiàn)如圖12.20所示的對話框。

(4)在圖12.20所示的對話框上,直接單擊“OK”按鈕,完成這一過程。

圖12.18指定項(xiàng)目名并為項(xiàng)目添加服務(wù)器對話框

圖12.19選擇服務(wù)器對話框

圖12.20為項(xiàng)目添加了服務(wù)器的界面

6)運(yùn)行程序

首先單擊圖12.21工具欄中圓圈標(biāo)示的按鈕后的下拉列表按鈕,在出現(xiàn)的列表中依次選擇“Tomcat6”、“Start”項(xiàng),啟動服務(wù)器。然后,再單擊圖12.22工具欄中圓圈標(biāo)示的“地球”按鈕,在出現(xiàn)的地址列表框中輸入或選擇“http://localhost:8080/ch12/c12_3.jsp”,就可以看到圖12.22中部窗口中的運(yùn)行結(jié)果。

圖12.21啟動服務(wù)器發(fā)布項(xiàng)目的界面

圖12.22運(yùn)行程序的界面及運(yùn)行結(jié)果啟動IE瀏覽器,在地址欄中輸入“http://localhost:8080/ch12/c12_3.jsp”,運(yùn)行效果如圖12.23所示。

圖12.23c12_3.jsp的運(yùn)行效果12.4.2迭代標(biāo)簽<c:forEach>應(yīng)用

在JSP開發(fā)中,迭代是經(jīng)常使用的操作。例如,腳本語言中的for循環(huán)和while循環(huán)等。JSTLcore大類中的<c:forEach>標(biāo)簽提供指定次數(shù)的循環(huán)或在某個(gè)數(shù)據(jù)結(jié)構(gòu)(Collection/Array)上進(jìn)行循環(huán)的能力。它有如下兩種用法。

語法格式1:循環(huán)固定的次數(shù)。

<c:forEach

[var="varName"]

[varStatus="varStatusName"]begin="begin"

end="end"

[step="step"]>

標(biāo)簽主體的內(nèi)容

</c:forEach>

語法格式2:在Collection/Array上進(jìn)行循環(huán)。

<c:forEach[var="varName"]

items="collection"

[varStatus="varStatusName"]

[begin="begin"]

[end="end"]

[step="step"]>

標(biāo)簽主體的內(nèi)容

</c:forEach>

其中,方括號中的內(nèi)容是可選的。<c:forEach>的屬性描述于表12.3中。

表12.3<c:forEach>的屬性下面通過一個(gè)例子來說明<c:forEach>標(biāo)簽的使用。這個(gè)例子由兩個(gè)程序組成:一個(gè)是名為TestBean.java的Java文件;另一個(gè)是使用<c:forEach>標(biāo)簽的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">學(xué)號</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>

這個(gè)例子的運(yùn)行結(jié)果見圖12.24。

圖12.24使用<c:forEach>標(biāo)簽的程序的運(yùn)行結(jié)果12.4.3SQL類標(biāo)簽應(yīng)用

SQL標(biāo)簽庫有六個(gè)標(biāo)簽:<sql:setDataSource>、<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>、<sql:transaction>,提供設(shè)置數(shù)據(jù)源、查詢數(shù)據(jù)庫、更新數(shù)據(jù)庫和事務(wù)處理等功能。這里我們拋磚引玉地介紹<sql:setDataSource>、<sql:query>和<sql:update>三個(gè)標(biāo)簽的使用方法。

1.<sql:setDataSource>標(biāo)簽

<sql:setDataSource>標(biāo)簽是設(shè)置數(shù)據(jù)源的標(biāo)簽。對于沒有默認(rèn)數(shù)據(jù)庫的JSP頁面,<sql:setDataSource>標(biāo)簽?zāi)軌驕?zhǔn)備一個(gè)數(shù)據(jù)庫以供使用。<sql:setDataSource>標(biāo)簽的語法格式如下。

<sql:setDataSource{dataSource="dataSource"|url="jdbcUrl"

[driver="driverClassName"][user="username"][password="password"]}

[var="varName"]scope="scope"/>

<sql:setDataSource>標(biāo)簽的屬性如表12.4所示。

表12.4<sql:setDataSource>標(biāo)簽的屬性例如,下面的語句使用<sql:setDataSource>標(biāo)簽創(chuàng)建了一個(gè)數(shù)據(jù)源:

<sql:setDataSourcevar="jstl_sql"driver="sun.jdbc.odbc.JdbcOdbcDriver"url="jdbc:odbc:TestDB"scope="session"/>

在這個(gè)數(shù)據(jù)源中,代表數(shù)據(jù)庫的變量名(var)是jstl_sql;數(shù)據(jù)庫名是TestDB;由于JDBC驅(qū)動程序類的名稱是sun.jdbc.odbc.JdbcOdbcDriver,故數(shù)據(jù)庫類型是MSAccess。jstl_sql的作用范圍是session。

2.?<sql:query>標(biāo)簽

<sql:query>標(biāo)簽是SQL查詢標(biāo)簽,使用該標(biāo)簽可以從數(shù)據(jù)庫的表中讀取數(shù)據(jù)。該標(biāo)簽有如下三種用法。

語法格式1:沒有Body時(shí)。

<sql:querysql="sqlQuery"var="varName"[dataSource="dataSource"]

[scope="scope"][maxRows="maxRows"][startRow="startRow"]/>

語法格式2:有一個(gè)Body,并且在Body中指定了查詢的參數(shù)。

<sql:querysql="sqlQuery"var="varName"[dataSource="dataSource"]

[scope="scope"][maxRows="maxRows"][startRow="startRow"]>

<sql:param>actions

</sql:query>

語法格式3:有Body并且指定可選的查詢參數(shù)時(shí)。

<sql:queryvar="varName"[dataSource="dataSource"]

[scope="scope"][maxRows="maxRows"][startRow="startRow"]>

SQLquery

optional<sql:param>actions

</sql:query>

<sql:query>標(biāo)簽的屬性如表12.5所示。

表12.5<sql:query>標(biāo)簽的屬性3.用于更新的<sql:update>標(biāo)簽

<sql:update>標(biāo)簽用于更新數(shù)據(jù)庫。它的語法中除了查詢語句是SQL更新語句外,其它一些屬性選項(xiàng)與<sql:query>標(biāo)簽是相同的。

4.SQL標(biāo)簽應(yīng)用程序示例

下面是一個(gè)使用SQL類的標(biāo)簽設(shè)置數(shù)據(jù)源,查詢數(shù)據(jù)庫表中數(shù)據(jù)的sql_query.jsp程序?qū)嵗?。該例將JSP與MSAccess數(shù)據(jù)庫TestDB.mdb連接,使用兩種查詢語句從student表中查詢輸出所有記錄和某一條記錄。student表的結(jié)構(gòu)和內(nèi)容見表12.6。

表12.6student表的結(jié)構(gòu)和內(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>

<%--將得到表的結(jié)果集賦給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>

查詢名字為李莉的同學(xué):<hr>

<sql:queryvar="query1"dataSource="${jstl_sql}">

SELECT*FROMstudentwherename=?

<sql:paramvalue="李莉"/>

</sql:query>

<tableborder="1">

<tr><td>學(xué)號</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>該程序的運(yùn)行結(jié)果如圖12.25所示。這個(gè)程序中的<sql:queryvar="queryResults"dataSource="${jstl_sql}">SELECT*FROMstudent</sql:query>語句指出從變量名jstl_sql所指的數(shù)據(jù)庫中查詢student表,將查詢的結(jié)果賦給queryResults對象保存(queryResults對象是javax.servlet.jsp.jstl.sql.Result類的實(shí)例)。然后通過<c:forEach>到</c:forEach>標(biāo)簽循環(huán)地取得結(jié)果集中的數(shù)據(jù),再通過<c:out>標(biāo)簽進(jìn)行輸出。其中第一組<c:forEach>標(biāo)簽用于循環(huán)地取得表中的字段名;第二組<c:forEach>標(biāo)簽用于循環(huán)地取得表中的每一條記錄。

JSTL的SQL標(biāo)簽提供了JSP頁面與數(shù)據(jù)庫進(jìn)行交互的功能,訪問數(shù)據(jù)庫比較方便。然而它卻是違反MVC模型規(guī)范的。因?yàn)榕c數(shù)據(jù)庫交互的工作本身就屬于業(yè)務(wù)邏輯層的工作,所以不應(yīng)該在JSP頁面中出現(xiàn),而應(yīng)該在模型層中進(jìn)行。但是,SQL標(biāo)簽的存在對于早期純JSP開發(fā)的應(yīng)用以及小型的開發(fā)有重要的意義。另外,對于那些不熟悉或不適應(yīng)Java語言的JSP頁面作者提供了方便。

圖12.25sql_query.jsp的運(yùn)行結(jié)果12.4.4XML核心動作應(yīng)用

在企業(yè)級應(yīng)用越來越依賴XML的今天,XML格式的數(shù)據(jù)被作為信息交換的優(yōu)先選擇。JSTL標(biāo)簽庫中的XML標(biāo)簽為程序設(shè)計(jì)者提供了對XML格式文件的基本操作。在該標(biāo)簽庫中共有10個(gè)標(biāo)簽,被分為三類,分別是:XML核心動作、XML流程控制動作和XML轉(zhuǎn)換動作。本節(jié)通過兩個(gè)例子簡要地說明XML核心動作和XML流程控制動作標(biāo)簽。注意,若要在本章第3節(jié)介紹的Eclipse+Myeclipse

+Tomcat的運(yùn)行環(huán)境中使用JSTL的XML標(biāo)簽,還需要下載xalan.jar和serializer.jar兩個(gè)支持包。讀者可以從/dist/xml/xalan-j/下載xalan-j_2_7_0-bin-2jars.zip文件,解壓后將其中的xalan.jar和serializer.jar兩個(gè)包復(fù)制到Tomcat的lib目錄中。

XML核心動作有<x:parse>、<x:out>和<x:set>三個(gè)標(biāo)簽。其中:<x:parse>用于解析XML文檔;<x:out>用于計(jì)算Xpath表達(dá)式,并把計(jì)算結(jié)果返回給JspWriter對象進(jìn)行輸出;<x:set>也用于計(jì)算Xpath表達(dá)式,但它把計(jì)算結(jié)果保存到某個(gè)范圍的變量中。它們的語法格式分別如下所示。表12.7列出了這些標(biāo)簽中的屬性。

<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é)介紹的方法新建一個(gè)名為ch12_xml的Web項(xiàng)目,在這個(gè)項(xiàng)目中新建一個(gè)名為xml_tag.jsp的JSP文件,在這個(gè)文件中輸入下述代碼:

<%@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應(yīng)用開發(fā)技術(shù):JSP</name>

<author>Author:崔尚森張白一</author>

<publisher>publisher:西安電子科技大學(xué)出版社</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ā)布運(yùn)行xml_tag.jsp程序,可看到如圖12.26所示的結(jié)果。

圖12.26xml_tag.jsp的運(yùn)行結(jié)果12.4.5XML流程控制動作應(yīng)用

XML流程控制動作標(biāo)簽有<x:if>、<x:choose>、<x:when>、<x:otherwise>和<x:forEach>五個(gè),它們提供了基于XPath表達(dá)式的流程控制。它與core流程控制動作標(biāo)簽<c:if>、<c:choose>和<c:forEach>等非常類似,不同的是XML流程控制動作標(biāo)簽應(yīng)用了XPath表達(dá)式。例如:

<x:forEachselect="$do

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論