欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
集成JSP/JSF和XML/XSLT
作者:Erik Bru… 文章來(lái)源:gceclub 點(diǎn)擊數:193 更新時(shí)間:2006-6-4
【字體:
如果您有任何疑問(wèn),請到開(kāi)發(fā)論壇上提問(wèn)。
簡(jiǎn)介
大家期待已久的JavaServer FacesTM(JSF)版本1.0和JavaServer PagesTM(JSP)版本2.0終于發(fā)布,它們承諾要改變J2EE開(kāi)發(fā)人員構建Web應用程序的方式。與此同時(shí),可擴展樣式表語(yǔ)言轉換(Extensible Stylesheet Language Transformation,XSLT)版本2.0已經(jīng)處于規范制定的最后階段,而許多開(kāi)發(fā)人員正在認真地考慮基于XML的表示層,尤其是當應用程序以多種設備為目標,或者要求外觀(guān)定制時(shí)。
本文說(shuō)明了一點(diǎn),即JSF 1.0和JSP 2.0是邏輯演變的結果,而這種演變早在servlet編程的早期就開(kāi)始了。借助諸如JSP 1.1、Struts 1.0和JSLT 1.0這些里程碑式的技術(shù),Java技術(shù)已經(jīng)逐漸集成了來(lái)自實(shí)際開(kāi)發(fā)領(lǐng)域的多種成功技術(shù)。接著(zhù),本文介紹了Model 2X,它結合了JSP技術(shù)和XML處理,是上述演變的延續,并且增強了表示層的靈活性。
為了更好地理解本文中討論的概念,您應該具有JSP、XML和Web應用程序架構方面的基本知識。與JSF概念的某些相似性將會(huì )大有幫助。
注意:書(shū)寫(xiě)本文過(guò)程中所使用的JSF規范的版本是JavaServer Faces 1.0 Specification Early Access Draft,版本日期為2002年9月6日。該規范將在未來(lái)不斷完善。所使用的JSF實(shí)現是Sun Reference implementation v1.0,Early Access 2(EA2)。
本文涉及到的所有源代碼都可以從下面的網(wǎng)址下載得到:
http://www.orbeon.com/model2x/tss
對于Java開(kāi)發(fā)人員來(lái)說(shuō),下面列舉的都是激動(dòng)人心的時(shí)刻。在撰寫(xiě)本文的時(shí)候(2003年2月):
JavaServer Pages 2.0和Java ServletTM 2.4規范計劃定稿。 自從2002年6月以來(lái),JavaServer Pages Standard Tag LibraryTM規范已經(jīng)定稿。 獲得期望最高的JavaServer Faces 1.0正處于開(kāi)發(fā)階段且進(jìn)展順利。
即便您能夠做到與時(shí)俱進(jìn),規范和首字母縮寫(xiě)詞的豐富程度還是令人望而卻步。好消息是,所有這些技術(shù)都彼此相關(guān),且設計為彼此互補。
Java Servlet是Java Web技術(shù)的基礎。Java Servlet規范解決了如何打包和部署應用程序的問(wèn)題,并描述了用于生成動(dòng)態(tài)內容的服務(wù)器端組件(即servlet)。 JavaServer Pages(JSP)構建在servlet技術(shù)之上,為生成諸如HTML這樣的文本內容提供了一種頁(yè)面模板方法。 JavaServer Pages Standard Tag Library(JSTL)是一個(gè)標準JSP動(dòng)作(也稱(chēng)為標簽)的集合,它簡(jiǎn)化了JSP頁(yè)面的開(kāi)發(fā)工作。頁(yè)面作者可以使用JSTL構建高級頁(yè)面邏輯,而不用了解Java或其他腳本語(yǔ)言。 JavaServer Faces(JSF)提供了一個(gè)可擴展的、基于組件的、工具友好的服務(wù)器端UI框架,該框架可以與JSP及JSTL很好地集成。
下圖說(shuō)明了各種技術(shù)之間的相關(guān)性:
圖1:技術(shù)堆棧
從前…
在開(kāi)始實(shí)現JSP之前,服務(wù)器端的Java應用程序通過(guò)在Java代碼中嵌入字符串來(lái)生成HTML。例1說(shuō)明了從servlet生成簡(jiǎn)單的HTML表的過(guò)程。
代碼如下:
MyTableData tableData = MyDAO.queryData(); PrintWriter writer = response.getWriter(); writer.println("<table border=\"1\">"); for (int i = 0; i < tableData.getData().length; i++) { writer.println("<tr>"); writer.println("<td>"); writer.println(tableData.getData()[i]); writer.println("</td>"); writer.println("</tr>"); } writer.println("</table>");
生成的結果如下所示:
Item 0
Item 1
Item 2
Item 3
例1:一個(gè)從Servlet生成的HTML表
這個(gè)模型存在以下問(wèn)題:
在Java代碼中包含HTML字符串,不僅工作繁重,而且難于閱讀。 每次靜態(tài)字符串改變時(shí),需要重新編譯、打包和部署Java代碼。
許多頁(yè)面包含大量的靜態(tài)的、非生成的文本(需要是可編輯的),以及相對較少的動(dòng)態(tài)生成的內容。為此,在現實(shí)世界中,針對這個(gè)問(wèn)題的解決方案大都基于頁(yè)面模板的機制。模板系統使得固定文本和動(dòng)態(tài)動(dòng)作的交叉變得更加自然。在Java世界中,當前使用的最受歡迎的模板是JSP。
JSP的早期
借助JSP,HTML和Java代碼可以同時(shí)出現在一個(gè)JSP文件中。JSP文件也稱(chēng)為JSP頁(yè)面。JSP引擎動(dòng)態(tài)裝載并編譯JSP頁(yè)面。這使得開(kāi)發(fā)流程變得更加簡(jiǎn)易。另外,不要求Java代碼生成靜態(tài)的模板文本。只有動(dòng)態(tài)的動(dòng)作才要求使用Java。
例1可以被重寫(xiě)為下面的JSP 1.1代碼片斷:
<% MyTableData tableData = MyDAO.queryData(); %> <table border="1"> <% for (int i = 0; i < tableData.getData().length; i++) { %> <tr> <td> <%= tableData.getData()[i] %> </td> </tr> <% }%> </table>
例2:使用JSP顯示一個(gè)表
HTML代碼被書(shū)寫(xiě)為模板文本。Java代碼被封裝在稱(chēng)為scirptlet的結構體中。語(yǔ)言的混合晦澀難懂,大部分非Java開(kāi)發(fā)人員對此都力不能及。這使得在開(kāi)發(fā)過(guò)程中劃分任務(wù)和角色變得困難。
在例2中,業(yè)務(wù)邏輯是直接從JSP頁(yè)面被調用的。通常,開(kāi)發(fā)人員在JSP頁(yè)面中實(shí)現一些或甚至全部的業(yè)務(wù)邏輯。這并沒(méi)有指定頁(yè)面與業(yè)務(wù)邏輯的交互,因此強制程度降低了很多。對于大型的項目來(lái)說(shuō),除非開(kāi)發(fā)人員的技術(shù)素養非同一般,否則這種行為將導致代碼變得非模塊化,而且難于維護。
例2說(shuō)明了以下問(wèn)題必須得到解決:
JSP頁(yè)面本身的易讀性。 缺乏分離業(yè)務(wù)邏輯和表示邏輯的模型。
JSP 1.1規范于1999年11月定稿。自從JSP 1.1以來(lái),JSP最佳實(shí)踐已經(jīng)取得了顯著(zhù)的進(jìn)展,雖然它們當時(shí)實(shí)際上還不存在,但是這種樣式的JSP頁(yè)面仍然普及開(kāi)來(lái)。要解決JSP 1.1的問(wèn)題,必須在JSP技術(shù)上構建框架。
Struts和MVC
Struts是實(shí)現了解決這些問(wèn)題的架構而且基于JSP的第一批框架之一:
提供有助于執行條件、迭代和數據選擇的標簽庫,增強JSP的易讀性。bean 和logic標簽庫用于完成上述任務(wù)。 使用MVC(模型/視圖/控制器)架構。借助MVC,業(yè)務(wù)邏輯和表示邏輯得以分離開(kāi)來(lái)。
在Struts中,MVC架構是以頁(yè)面為基礎工作的。它是通過(guò)叫做Model 2的混合架構來(lái)實(shí)現的,涉及到servlet與JSP文件的協(xié)作。
下圖說(shuō)明了在Struts中,MVC的不同部分(模型、視圖和控制器)之間的關(guān)系。Struts提供了控制器servlet。模型是在一個(gè)實(shí)現或調用業(yè)務(wù)邏輯的動(dòng)作類(lèi)中實(shí)現的,而視圖是在一個(gè)JSP頁(yè)面中實(shí)現的。您仍然能夠在JSP頁(yè)面中實(shí)現業(yè)務(wù)邏輯,但實(shí)際上不鼓勵這種做法。
圖2:Struts、MVC和Model 2
MVC架構相當重要,因為它將使代碼自然而然地模塊化,不論是開(kāi)發(fā)小組還是單個(gè)開(kāi)發(fā)人員,都可以從中獲益匪淺。當幾個(gè)開(kāi)發(fā)人員一起工作時(shí),較容易劃分角色:一個(gè)開(kāi)發(fā)人員專(zhuān)門(mén)處理業(yè)務(wù)邏輯,同時(shí)其他人負責構建實(shí)際的Web頁(yè)面。想要了解有關(guān)MVC的更多信息,請參見(jiàn)本文結尾的參考資料。
例3顯示了使用Struts重寫(xiě)例2中JSP代碼片斷的結果:
<table border="1"> <logic:iterate id="data" name="tableData" property="data"> <tr> <td> <bean:write name="data"/> </td> </tr> </logic:iterate> </table>
例3:使用 Struts顯示一個(gè)表
現在,調用業(yè)務(wù)邏輯的代碼實(shí)現在一個(gè)單獨的動(dòng)作類(lèi)(沒(méi)有給出)中,這個(gè)動(dòng)作類(lèi)傳遞一個(gè)名為tableData的JavaBean給JSP頁(yè)面。例4顯示了上述bean的樣子:
public class TableData { private String[] data; public String[] getData() { return data; } ... }
例4:簡(jiǎn)單的 JavaBean
logic:iterate標簽的name和property屬性指定了bean的data屬性元素上的一次迭代。property屬性還支持嵌套的和索引的引用,它們構成了JSP 2.0中使用的表達式語(yǔ)言(Expression Language,EL)和JSTL的實(shí)際先驅。例3說(shuō)明,通過(guò)實(shí)現MVC并提供足夠的標簽庫,您可以在JSP文件中完全不使用Java代碼。
步入JSTL和JSP 2.0
Struts標簽庫和表達式語(yǔ)言存在限制??紤]下面例子中的代碼,它的功能是使用另外一列和交替的行顏色構造一個(gè)HTML表:
代碼如下:
<% MyTableData tableData = MyDAO.queryData(); %> <table border="1"> <% for (int i = 0; i < tableData.size(); i++) { String cellColor = (i % 2 == 0) ? "gray" : "white"; %> <tr> <td bgcolor="<%= cellColor %>"> <%= i %> </td> <td bgcolor="<%= cellColor %>"> <%= tableData.get(i) %> </td> </tr> <% }%> </table>
生成了如下所示的結果:
0 Item 0
1 Item 1
2 Item 2
3 Item 3
例5:使用Scriptlet的復雜例子
在例5中,不能使用Struts標簽替換所有的scriptlet,因為迭代包括一個(gè)數據元素、一個(gè)位置索引和一次Struts標簽庫不能處理的計算。
針對這些限制的解決方案是引入JSTL和JSP 2.0。JSLT實(shí)質(zhì)上是Struts標簽庫的一個(gè)經(jīng)過(guò)深思熟慮的更好的版本。標簽的集合更加一致而完備。JSTL引入了表達式語(yǔ)言(EL),這種語(yǔ)言松散地基于JavaScript和XPath。JSP 2.0天生就支持這種EL。
除了對EL的天生支持,JSP 2.0還具有以下新特性:
特 性 描 述
表達式語(yǔ)言API 標簽庫實(shí)現者能夠輕易地利用JSP 2.0的 EL實(shí)現。
實(shí)現定制JSP動(dòng)作的新工具 簡(jiǎn)化的Java API使得在Java中書(shū)寫(xiě)定制標簽更加容易。 開(kāi)發(fā)人員能夠在標簽文件中書(shū)寫(xiě)定制的JSP動(dòng)作,而不用書(shū)寫(xiě)、編譯和打包Java應用程序。
增強的可配置性 在單個(gè)頁(yè)面或在整個(gè)應用程序中,顯式地禁止使用scriptlets 很容易做到。
另外還有一些與使用JSTL和EL相關(guān)的優(yōu)點(diǎn):
優(yōu) 點(diǎn) 描 述
XML 和 HTML的一致性 JSTL/EL聯(lián)合起來(lái)可以產(chǎn)生酷似XML文檔的JSP頁(yè)面。結果不僅更易于閱讀,而且更易于被開(kāi)發(fā)工具處理。例如,圖形工具能夠檢測或插入迭代器標簽,而如果使用Java書(shū)寫(xiě)迭代,迭代器標簽便越發(fā)復雜得多。
Language constraints EL將自身的作用范圍限制在表達式上。標簽庫提供一個(gè)定義良好的動(dòng)作集合。這很有益處,因為Java誘使Web頁(yè)面作者在頁(yè)面中書(shū)寫(xiě)業(yè)務(wù)邏輯,從而打破了MVC模型。
例5可以使用JSTL標簽庫和JSP 2.0全部重寫(xiě),如例6所示:
<table border="1"> <c:forEach items="${tableData.data}" var="currentData" varStatus="status"> <c:set var="cellColor"> <c:choose> <c:when test="${status.index % 2 == 0}">gray</c:when> <c:otherwise>white</c:otherwise> </c:choose> </c:set> <tr> <td bgcolor="${cellColor}"> ${status.index} </td> <td bgcolor="${cellColor}"> ${currentData} </td> </tr> </c:forEach> </table>
例6:使用 JSTL和 JSP 2.0書(shū)寫(xiě)的例子
最新的規范明確支持書(shū)寫(xiě)腳本更少的頁(yè)面,這標志著(zhù)JSP開(kāi)發(fā)的一個(gè)轉折點(diǎn)。從純化論者認為的HTML"tag soup"與Java scriptlet的無(wú)形混合,到幾乎純粹的命名空間感知的XML文件,JSP頁(yè)面在最佳實(shí)踐方面發(fā)生了重大變化。結果是語(yǔ)法更加一致,頁(yè)面作者的工作負擔減輕,與工具的集成更加容易,以及可以更好地控制業(yè)務(wù)邏輯與表示邏輯的分離。
JSP的前景
對于與用戶(hù)的交互有限而且簡(jiǎn)單的動(dòng)態(tài)Web頁(yè)面來(lái)說(shuō),JSP 2.0、JSTL和MVC就能提供您所需要的全部功能。但是如果要開(kāi)發(fā)復雜的、基于Web的用戶(hù)界面,您不得不做大量的工作,以便提取請求參數、驗證并處理它們、將它們呈現回為HTML控件,等等。整個(gè)過(guò)程冗長(cháng)乏味,而且極易出現錯誤。
長(cháng)期以來(lái),桌面應用程序已經(jīng)使用了基于組件的層次MVC框架,比如降低構建用戶(hù)界面的難度的Swing。此類(lèi)框架將用戶(hù)界面的各個(gè)元素公開(kāi)為以Container/Containee關(guān)系組織的組件。這種方法為自身提供了使用圖形工具構建用戶(hù)界面的能力。它還允許組件重用,以及在開(kāi)發(fā)過(guò)程中進(jìn)行更好的角色分離。
圖3:包含控件的窗體
通常,Web應用程序具有簡(jiǎn)化的控件集合和有限的交互性,但在其他方面與桌面應用程序區別不大。我們很自然地想到,要試著(zhù)將在桌面上使用的模型應用程序到服務(wù)器端的世界中去。這也是JSF專(zhuān)家組選出的解決方案。服務(wù)器端的應用程序與桌面應用程序相去甚遠,所以JSF需要一個(gè)新的處理模型及API,從而代替Swing中模型和API的使用。
像Struts一樣,JSF符合MVC架構。它提供一個(gè)控制器servlet,并且允許使用呈現程序的視圖和使用組件類(lèi)及基于事件的機制的模型分離開(kāi)來(lái)。借助JSF,MVC可以工作在單獨組件的層次上。
開(kāi)發(fā)人員能夠在JSP文件中使用XML標記來(lái)描述組件之間的相互關(guān)系,而不用書(shū)寫(xiě)Java代碼來(lái)組裝JSF組件,而后者正是Swing的做法。聯(lián)合使用JSF與JSP是可選的,但這是眾望所歸的首選技術(shù)。例如,JSF附帶有一組標準的用戶(hù)界面組件,可以在JSP中通過(guò)Standard JSF Tag Library來(lái)使用它們。這允許不擅長(cháng)Java的web頁(yè)面作者也能從事開(kāi)發(fā)復雜用戶(hù)界面的任務(wù)。它還使得實(shí)現圖形工具更加容易。本文稍后將討論這樣的一個(gè)例子。
當與JSP一起使用時(shí),因為同時(shí)使用了控制器servlet和JSP頁(yè)面,JSF可以被看作是一個(gè)Model 2架構。
JSF的承諾包括重用、角色分離和易于使用的工具,從而降低了實(shí)現服務(wù)器端用戶(hù)界面的門(mén)檻,并縮短了其所需的時(shí)間。
本文的余下部分專(zhuān)門(mén)講述JSF特殊的呈現方面。想要了解JSF架構的更多信息,包括它的API和處理模型,請參見(jiàn)本文結尾部分的參考資料。
JSF呈現
用戶(hù)界面的呈現在于生成信息以使其對用戶(hù)可見(jiàn)。在服務(wù)器端編程領(lǐng)域中,信息通常包括HTML、CSS和JavaScript。呈現涉及到發(fā)送字符流給Web瀏覽器。
呈現JSF層次是一個(gè)遞歸過(guò)程,在此過(guò)程中,每個(gè)使用Java書(shū)寫(xiě)的組件都有機會(huì )呈現自身。JSF提供了兩個(gè)選擇:
直接從組件呈現。這種做法不能修改組件本身的代碼,所以也就不能修改呈現的樣式。 委派給聚集在稱(chēng)為RenderKit的實(shí)體中的單獨呈現程序類(lèi)。組件的代碼不需要修改,但是改變樣式仍然需要修改RenderKit中的Java代碼。
這兩個(gè)選擇都不是基于模板的,而且就像在剛開(kāi)始使用servlet的時(shí)候,它們還要求非標準的解決方案或者從Java代碼生成HTML。早期訪(fǎng)問(wèn)版本的JSF附帶的呈現程序便是以這種方式實(shí)現的。無(wú)論何時(shí)呈現需要改變,組件開(kāi)發(fā)人員都不得不卷入到其中。與JSP日益提倡的角色分離相比,這是一種嚴重的,而且幾乎是不能理解的倒退。
HTML有一種伴生語(yǔ)言,稱(chēng)為CSS,特別為樣式而設計。假如在JSF的HTML RrnderKit for the Standard User Interface Component中,能夠使用CSS支持,那么CSS便能夠解除JSF呈現的限制。例如,可以使用支持CSS的瀏覽器中的style屬性來(lái)選擇按鈕的背景顏色:
<input type="button" value="Button 1" style="color: red"/> <input type="button" value="Button 2" style="color: blue"/>
例7:使用 CSS選擇樣式
通過(guò)允許保持組件的呈現代碼不變,即便是在另外的呈現方面改變時(shí)也是如此,CSS的使用部分地解決了樣式問(wèn)題。這種方法具有以下限制:
您不能控制使用CSS的樣式的每個(gè)方面。 并非每個(gè)被部署的Web瀏覽器都支持所有的CSS規范。
為了說(shuō)明第一點(diǎn),考慮一下,您可能想要應用程序中的每個(gè)表都交替顯示行的顏色,就像例5和6那樣。CSS不支持描述這種行為。
對于不支持最新版本CSS的Web瀏覽器來(lái)說(shuō),一個(gè)流行的不使用CSS的HTML技巧便是通過(guò)嵌入表來(lái)創(chuàng )建表邊界。
下面的代碼:
<table cellpadding="0" cellspacing="0" border="0" bgcolor="red"> <tr> <td> <!-- Original table --> <table width="100%"> <tr> <td bgcolor="white">1.1</td> <td bgcolor="white">1.2</td> </tr> <tr> <td bgcolor="white">2.1</td> <td bgcolor="white">2.2</td> </tr> </table> </td> </tr> </table>
生成的結果如下所示:
1.1 1.2
2.1 2.2
例8:嵌入表
要處理這種使用JSTL的情況,代碼不得不在應用程序的每個(gè)JSP頁(yè)面中被重復。如果在開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)人員不得不在不同的樣式之間來(lái)回切換好幾次,例如要處理變化的需求時(shí),修改必須在整個(gè)應用程序中重復進(jìn)行。借助JSF,可以構建一個(gè)定制的組件,但是這意味著(zhù),您必須書(shū)寫(xiě)復雜的Java代碼。如果要實(shí)現這種類(lèi)型的樣式技術(shù),兩種技術(shù)都幫不上什么忙。
至少有兩種解決方案是可用的:
在類(lèi)似于JSP 2.0標簽文件的模板文件中實(shí)現JSF呈現程序。不論是JSF還是JSP,都不支持這樣的模型,而且在JSF 1.0的最終版本發(fā)行之前,JSF呈現不可能有顯著(zhù)的改變。 使用XML處理。這種解決方案又稱(chēng)為Model 2X,將在下一節中討論。
Model 2X
架構
Model 2X最重要的方面是XML轉換語(yǔ)言的使用,比如XSL轉換(XSL Transformation,XSLT),連同servlet和JSP。下圖說(shuō)明了Model 2X的基本架構:
圖4:Model 2X架構
servlet或JSP的輸出通常被直接發(fā)送給Web瀏覽器。有了Model 2X之后,在到達Web瀏覽器之前,輸出先要經(jīng)由一個(gè)XML轉換的階段。為了理解這一點(diǎn),考慮JSP和XML兩個(gè)世界之間的關(guān)系相當重要。
JSP和XML
設計JSP的目的是為了能夠產(chǎn)生任意的文本格式,比如HTML、逗號分隔值(Comma-Separated Value,CSV)以及層疊樣式表(Cascading Style Sheet,CSS)。出于這個(gè)理由,您可以使用JSP生成XML文檔。要注意的地方是,JSP不能強制生成格式良好的XML輸出。為了生成格式良好的XML,您不得不采取以下預防措施:
JSP中直接呈現的任何模板文本標記必須是格式良好的。 標簽庫必須生成格式良好的XML。
考慮下面這個(gè)例子,即包含有效HTML標簽的JSP代碼片斷:
<body> <hr> </body>
有一種方法可以確保模板文本是格式良好的XML,即書(shū)寫(xiě)Sun所號稱(chēng)的JSP文檔,而不是常規的JSP頁(yè)面。JSP文檔不過(guò)就是JSP頁(yè)面的XML版本而已。JSP結構體,比如<% %>和<%@ %>,不符合XML規范。在JSP文檔中,它們被相應的XML標簽所代替,比如<jsp:directive.include>和<jsp:scriptlet>標簽。書(shū)寫(xiě)JSP文檔并不是從JSP生成格式良好的XML的要求,但是因為JSP引擎要確保文檔符合XML規范,它在前面顯示了許多錯誤。
標簽庫經(jīng)常生成HTML。Struts的html標簽庫和標準JSF標簽庫便是如此。使用這種標簽庫時(shí),必須修改它們,以便生成XML,而不是HTML。借助JSF可以輕松完成這項工作,具體方法是書(shū)寫(xiě)一個(gè)XML呈現程序,并用它來(lái)代替現有的HTML呈現程序。本文稍后將詳細討論這個(gè)問(wèn)題。
執行JSP頁(yè)面的結果仍然會(huì )得到字符流,即便該頁(yè)面符合XML規范也是如此。不能確保輸出是有效的,或者甚至是格式良好的XML。如果工具需要將JSP輸出處理為XML,如Model 2X中所示,這時(shí)便需要一個(gè)解析的步驟。
XSLT
XML被JSP頁(yè)面生成之后,它就可以被其他工具消費。XSLT便是一個(gè)這樣的工具,一種被設計用來(lái)執行XML文檔轉換的功能語(yǔ)言。
一個(gè)簡(jiǎn)單的XSLT轉換可以通過(guò)下面這種方式來(lái)表示:
圖5:簡(jiǎn)單的XSLT轉換
XSLT轉換的結果可能是XML、HTML或者其他任意的文本格式。
XSLT的1.0版本發(fā)布于1999年11月。從那之后,為了將它發(fā)展為XSLT 2.0規范,許多人付出了大量的勞動(dòng)。XSLT 2.0基于XPath 2.0,是一種新版本的XML表達式語(yǔ)言,具有更好的一致性,而且包含1.0版本中所沒(méi)有的一些特性,比如分組和用戶(hù)定義的XPath函數。
一個(gè)XSLT程序被稱(chēng)為一個(gè)樣式表。這個(gè)術(shù)語(yǔ)在XSLT 2.0規范草案中有著(zhù)清晰的表述:
"術(shù)語(yǔ)樣式表反映了這樣一個(gè)事實(shí),即XSLT的重要角色之一便是為XML源文檔添加樣式信息,具體方法是將它轉換為由XSL格式化對象(參見(jiàn)[XSL格式化對象])組成的文檔,或者轉換為另一種面向表示的格式,比如HTML、XHTML或SVG。"
因此,XSLT這種語(yǔ)言的設計目的相當明確,就是為了解決上述的樣式問(wèn)題。
JSF和Model 2X
現在,您已經(jīng)能夠理解在Model 2X中,XML和XSLT技術(shù)是如何與JSP和JSF進(jìn)行交互的。下面的JSP代碼片斷使用了JSF,這段代碼來(lái)自當前JSF引用實(shí)現中的"guessNumber"例子。它包含了HTML模板代碼和構建簡(jiǎn)單窗體的JSF標簽:
<%@ taglib uri="http://java.sun.com/j2ee/html_basic/" prefix="faces"%> <html> <head><title>Hello</title></head> <body> <h1>Hello</h1> <faces:usefaces> <faces:form id="helloForm" formName="helloForm"> <table> <tr> <td> <faces:textentry_input id="userNo" modelReference="UserNumberBean.userNumber"/> </td> <td> <faces:command_button id="submit" commandName="submit"/><p> </td> </tr> </table> <faces:validation_message componentId="userNo"/> </faces:form> </faces:usefaces> </body> </html>
例9:JSF 例子
執行使用XML呈現程序的代碼片斷,可能會(huì )輸出以下格式良好的XML文檔:
<html> <head><title>Hello</title></head> <body> <h1>Hello</h1> <form method="post" action="/guessNumber/faces/greeting.jsp"> <table> <tr> <td> <input type="text" name="/helloForm/userNo"/> </td> <td> <input type="submit" name="submit" value="submit"/> </td> </tr> </table> </form> </body> </html>
例10:JSF例子的輸出
當JSP輸出被解析并被反饋到XSLT轉換器時(shí),您可以輕松地應用程序樣式。下圖說(shuō)明了處理模型,同時(shí)也是Model 2X的一個(gè)特殊例子:
圖6:JSF和XSLT呈現模型
例如,要將應用程序中的每個(gè)按鈕呈現為紅色,使用下面的XSLT模板即可達到目的:
<!-- Find all input elements with a "submit" type attribute --> <xsl:template match="input[@type = ‘submit‘]"> <!-- Copy the element found --> <input> <!-- Copy all existing attributes --> <xsl:copy-of select="@*"/> <!-- Add a "style" attribute --> <xsl:attribute name="style">color: red</xsl:attribute> </input> </xsl:template>
例10:使用一個(gè)XSLT 模板添加樣式
XSLT模板并不限于在由JSF呈現程序生成的標記上使用。例如,它可以使用同樣的技術(shù)生成頁(yè)面布局。例11說(shuō)明了如何插入一個(gè)表,該表包含一個(gè)標題行以及包含原始文檔主體的第二行:
<!-- Match the body element --> <xsl:template match="body"> <!-- Copy the element found and set a background color --> <body bgcolor="white"> <table border="0"> <!-- Create a header row --> <tr> <td>Header</td> </tr> <tr> <td> <!-- Copy the actual body --> <xsl:apply-templates/> </td> </tr> </table> </body> </xsl:template>
例11:創(chuàng )建一個(gè)頁(yè)面布局
Model 2X的優(yōu)點(diǎn)包括:
優(yōu) 點(diǎn) 描 述
更好的模塊化和靈活性 樣式可以被集中化。書(shū)寫(xiě)一個(gè)樣式表就可以處理一個(gè)應用程序的所有外觀(guān)。外觀(guān)可以在整個(gè)應用程序中被重用。運行時(shí),同一應用程序中的不同外觀(guān)可以按照需要進(jìn)行切換。
快速轉向 無(wú)須對Java代碼做任何修改。JSF 呈現程序只要書(shū)寫(xiě)一次,就可以被所有頁(yè)面使用。當應用程序正在運行時(shí),XSLT樣式表可以被重新裝載,而且變化幾乎是瞬時(shí)的。
強大的表現功能 XSLT是一種特別適合于操作XML的語(yǔ)言,也因此適合操作XHTML。操作的可能性是無(wú)窮的。XPath是一種表達式語(yǔ)言,它比JSP 2.0的EL以及JSTL要更加先進(jìn)。
標準的一致性 XSLT是一個(gè)W3C標準,被廣泛采用。這意味著(zhù)多個(gè)廠(chǎng)商針對它開(kāi)發(fā)出了大量可用的文檔和工具,包括幾種針對Java的優(yōu)秀的XSLT轉換工具。Java API for XML Processing (JAXP)支持XSLT轉換。Xalan是一款流行的XSLT轉換工具,它與J2SE 1.4捆綁在一起,而且所有一流的應用程序服務(wù)器都支持XSLT。
管道技術(shù) XSLT 適合以管道的方式進(jìn)行處理。下面將詳細討論XML管道。
Familiarity 在特定的條件和迭代器中,幾個(gè)JSTL結構體看起來(lái)很像XSLT結構體。這使得熟悉JSTL的人學(xué)習XSLT會(huì )更加輕松,反之亦然。
Model 2X的以下限制應該引起注意:
限 制 描 述
輔助處理 Model 2X在表示邏輯的執行過(guò)程中引入了輔助步驟。大多數時(shí)候,性能提升十分有限,而靈活的貿易性能才是主要的方面。
學(xué)習曲線(xiàn) 必須學(xué)習XSLT。對于大多數用途來(lái)說(shuō),學(xué)習XSLT是如此容易,以至于這根本就不成為問(wèn)題。
要求 因為JSP并不強制輸出格式良好的XML,所以這個(gè)任務(wù)便落到了開(kāi)發(fā)人員的肩上。
XML 管道
Model 2X的使用為JSP處理模型引入了一個(gè)新的維度,因為它涉及到幾個(gè)順序執行的步驟:
處理整個(gè)JSP頁(yè)面。根據常規的JSP處理模型,模板文本和標簽庫產(chǎn)生輸出。 輸出被解析為XML。 執行XML處理。
實(shí)際上構建的是一個(gè)兩段式管道??梢詾槊總€(gè)階段分配定義良好的角色:
管道的概念使Web應用程序的表示層變得模塊化。不用修改JSP頁(yè)面,管道就可以被擴展為包含具有不同角色的另外階段,例如:
角 色 描 述
本地化 在單獨的管道階段中執行本地化允許本地化JSP標簽庫的輸出,以及修改頁(yè)面布局的高級本地化。阿拉伯語(yǔ)的Web頁(yè)面可能在右側呈現其導航欄,而不是左側。
多種瀏覽器支持 對于支持諸如最新版本的CSS這樣的高級呈現功能的Web瀏覽器來(lái)說(shuō),一個(gè)樣式表可以為其生成輸出,而另一個(gè)樣式表可以為老式瀏覽器生成輸出。
多種設備支持 一個(gè)單獨的管道能夠以完全不同的設備作為目標,比如PDA或手機。
包含 在一個(gè)管道階段中,可以從其他JSP頁(yè)面構建出一個(gè)頁(yè)面,包括頭、腳和主頁(yè)主體。
管道的一個(gè)完整例子如圖7所示:
圖7:管道的例子
實(shí)現Model 2X
使用JSF實(shí)現Model 2X要求:
為JSF Standard User Interface Component創(chuàng )建一個(gè)XML RenderKit。 連接一個(gè)XML解析器,以及一個(gè)XSLT轉換器(簡(jiǎn)單實(shí)現)或XML管道(高級實(shí)現)。
下面的代碼說(shuō)明了對第一步的需要。JSF faces:textentry_input標簽不能生成格式良好的XML輸出:
<INPUT TYPE="text" NAME="name" VALUE="value">
生成XML的JSF RenderKit必須生成格式良好的XML元素和屬性。另外,它應該遵照以小寫(xiě)形式創(chuàng )建元素的XHTML慣例:
<input type="text" name="name" value="value"/>
JSF的當前引用實(shí)現沒(méi)有附帶一個(gè)XML RenderKit,但是對于熟悉JSF的開(kāi)發(fā)人員來(lái)說(shuō),書(shū)寫(xiě)這樣一個(gè)呈現程序不是什么難事。本文中包含了一個(gè)簡(jiǎn)單的RenderKit。
使用以下方法可以完成與XML解析器和XSLT轉換器的連接:
Servlet過(guò)濾器。除了生成格式良好的XML之外,JSP頁(yè)面不需要別的任何特殊關(guān)照。標簽庫。一個(gè)封裝了整個(gè)頁(yè)面的標簽必須被插入到每一個(gè)JSP頁(yè)面中。您可以使用JSP 2.0的抬頭與結尾機制來(lái)避免代碼重復。 您可以基于DOM或SAX來(lái)構建XML管道邏輯。您可以創(chuàng )建定制的代碼,或者使用現有的解決方案,比如OXF或Cocoon。
想要了解更多細節,請參見(jiàn)本文中使用的示例源代碼。
結束語(yǔ)
這些年來(lái),JSP技術(shù)已經(jīng)趨于成熟。最佳實(shí)踐已經(jīng)表現為在真實(shí)應用程序中使用JSP的結果,這導致JSP技術(shù)的核心得到了很大的增強,并使諸如JSTL這樣的新規范得到發(fā)展。JSF引入了一個(gè)期待已久的用戶(hù)界面組件模型,但是JSF也表現出其在呈現架構中受到限制的地方。眾多開(kāi)發(fā)人員可能認為這些限制是一個(gè)概念上的倒退。
Java開(kāi)發(fā)人員相當熟悉XML技術(shù),但他們沒(méi)有必要了解XML是如何被用于增強Web應用程序的表示層的。Model 2X是一個(gè)簡(jiǎn)單的架構,它構建在JSP、JSF和XML技術(shù)的基礎之上,減少了JSF呈現模型的限制,并為J2EE應用程序提供了一個(gè)靈活的表示層。
盡管JSP有逐漸與XML同化的趨勢,JSP 2.0還是沒(méi)有與XML標準完全集成。將來(lái),通過(guò)將Model 2X添加到JSP引擎的核心中,JSP應該完成這種演變。
參考資料
JavaServer Pages (JSP)
http://java.sun.com/products/jsp/
Servlet 技術(shù)
http://java.sun.com/products/servlet/
JSTL 規范
http://jcp.org/aboutJava/communityprocess/final/jsr052/
JavaServer Faces (JSF)
http://java.sun.com/j2ee/javaserverfaces/
Struts和XSLT方面的JavaWorld文章
http://www.javaworld.com/javaworld/jw-02-2002/jw-0201-strutsxslt.html
初識 JavaServer Faces(第1部分)
http://www.javaworld.com/javaworld/jw-11-2002/jw-1129-jsf.html
XSLT 1.0和XSLT 2.0 (草案)
http://www.w3.org/TR/xslt, http://www.w3.org/TR/xslt20/
OXF
http://www.orbeon.com/oxf/
Model 2X
http://www.orbeon.com/model2x
使用XML管道構建Pet Store
http://www.flashline.com/content/orbeon/pet_store.jsp
XML管道簡(jiǎn)介
http://www.orbeon.com/oxf/whitepaper
Struts
http://jakarta.apache.org/struts/
The Model-View-Controller (‘MVC‘) 設計模式
http://jakarta.apache.org/struts/userGuide/introduction.html#mvc
Apache Xalan for Java
http://xml.apache.org/xalan-j/index.html
Saxon - The XSLT 處理器
http://saxon.sourceforge.net/
Cocoon
http://xml.apache.org/cocoon/
關(guān)于作者
Erik Bruchez專(zhuān)門(mén)研究Web應用程序架構。他是OXF的聯(lián)合架構師。OXF是由Orbeon, Inc開(kāi)發(fā)的一個(gè)基于XML的應用程序框架。Orbeon, Inc是一家J2EE和XML咨詢(xún)公司,創(chuàng )立于1999年,Erik正是這家公司的聯(lián)合創(chuàng )始人之一。Erik曾領(lǐng)導過(guò)幾個(gè)軟件平臺和應用程序的設計與實(shí)現,其中包括視頻機頂盒(set-top box)和供應鏈管理應用程序方面的中間件。在Orbeon之前,Erik曾為Symantec Corp.工作,并為VisualCafe產(chǎn)品線(xiàn)做出了貢獻。Erik從位于瑞士洛桑的瑞士技術(shù)學(xué)院(EPFL)獲得了計算機科學(xué)碩士學(xué)位。
Omar Tazi曾在位于Silicon Valley心臟地帶的幾家高科技公司中擔任過(guò)高級管理職位,包括Symantec、Oracle和WebGain。Omar是Java Community Process Executive Committee的成員,還是眾多JSRs(Java Specification Requests)的活躍成員,并且成為了其中Expert Group的成員。他還經(jīng)常在BEA eWorld和JavaOne這樣的軟件年會(huì )上發(fā)言。他的主要興趣在于Java 2 Platform Enterprise Edition(J2EE)、XML和Web service等方面。在橫跨大西洋之前,Omar曾在位于洛桑的瑞士聯(lián)邦技術(shù)學(xué)院中擔任幾個(gè)研究和教學(xué)職位,專(zhuān)攻人工智能算法和面向對象的編程。他擁有計算機科學(xué)和電子工程的碩士學(xué)位。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
入門(mén)教程:JSP標準模板庫
JSP標準模板庫(下)
概述 - Velocity空間 - BlogJava
MyEclipse下開(kāi)發(fā)JSF(2)
Geronimo 叛逆者: 直面 JSF
faces portlet開(kāi)發(fā)框架初體驗
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久