Results / View Technologies
目前為止的所有例子,都是假定JSP為渲染視圖的技術(shù).盡管它可能是最普通的,但它決不是渲染結(jié)果的唯一方法.
結(jié)果類型和視圖技術(shù)的使用緊密相聯(lián).在前面的章節(jié),我們看到如果"type"屬性無(wú)值或是值為"dispatcher",就會(huì)將使用JSPs來(lái)渲染.在Struts2應(yīng)用中,還有三種其他的技術(shù)可以替換JSPs:
- Velocity Templates
- Freemarker Templates
- XSLT Transformations
記住,你同樣可以從現(xiàn)有的視圖技術(shù)實(shí)現(xiàn)一種新的結(jié)果類型.那時(shí)你將獲得額外的可用結(jié)果.
除了個(gè)別的語(yǔ)法不同,Freemarker和Velocity都與JSP非常相似.所有的action的屬性(通過(guò)getter方法)在模版中都是可用的,以及JSP標(biāo)簽庫(kù)和在標(biāo)簽庫(kù)內(nèi)使用OGNL.在actions配置中可以很容易的將JSP模版的名稱替換成Velocity或是Freemarker模版中的任何一個(gè).這里演示了如果配置Freemarker結(jié)果來(lái)替代JSP被返回:
1
<action name="my" class="com.fdar.infoq.MyAction" >
2
<result type="freemarker">view.ftl</result>
3
</action>
XSLT結(jié)果稍有不同.不僅是使用stylesheet名稱替換掉模版名稱,還有額外的參數(shù)將被用到."stylesheetLocation"參數(shù)提供了渲染XML所使用的stylesheet的名稱.如果沒(méi)有這個(gè)參數(shù),將返回給用戶沒(méi)有轉(zhuǎn)換的XML.exposedValue屬性提供action的屬性或是一個(gè)OGNL表達(dá)式暴露給XML.如果這個(gè)參數(shù)沒(méi)有指定,這個(gè)action本身將暴露給XML.
1
<result type="xslt">
2
<param name="stylesheetLocation">render.xslt</param>
3
<param name="exposedValue">model.address</param>
4
</result>
使用XSLT做為結(jié)果,"struts.properties"配置屬性同樣可用.名字為"struts.xslt.nocache"的屬性,決定stylesheet是否被緩存.在開(kāi)發(fā)期間,考慮到更快的開(kāi)發(fā)周期,你可能將想要移除一些緩存,然而,當(dāng)應(yīng)用發(fā)布到應(yīng)用環(huán)境,緩存stylesheet將提高渲染的性能.
Tag Libraries
標(biāo)簽庫(kù)通常用來(lái)定義為JSP一種專用的特征,來(lái)提供可復(fù)用性.Freemarker和Velocity有不同的概念;反之,他們?yōu)殇秩疽嫣峁┝艘环N模型或上下文,和開(kāi)始渲染的模版所能訪問(wèn)到的所有的那些對(duì)象.當(dāng)我們?cè)赟truts2中講到標(biāo)簽庫(kù),我們討論的是提供與JSP標(biāo)答庫(kù)提供相同功能的對(duì)象,它們與所有的視圖技術(shù)相似-JSP,Velocity和Freemarker.
在定義標(biāo)簽庫(kù)方面還有很多的形式,但最基本的功能是一樣的--提供對(duì)對(duì)象方法的訪問(wèn).邏輯的壓縮改善了可維護(hù)性,并且減少了復(fù)制和粘貼代碼的誘惑.
JSP標(biāo)簽庫(kù)還有另外一個(gè)特征,在今天的WEB開(kāi)發(fā)環(huán)境中看起來(lái)已經(jīng)是過(guò)時(shí)的了-直接在標(biāo)簽庫(kù)本身的Java代碼里寫(xiě)顯示的文本.Strust2轉(zhuǎn)變了思想,為標(biāo)簽創(chuàng)建一個(gè)專有的MVC模式.邏輯在Java類內(nèi)提供,但被放到Freemarker模版中渲染(這是默認(rèn)的).整體的結(jié)構(gòu)如下:
結(jié)構(gòu)的核心是對(duì)組件對(duì)句的設(shè)置.這個(gè)組件提供了每個(gè)標(biāo)簽最基本的表現(xiàn)形式,并提供一些必要的邏輯,以及管理的渲染的模版.每個(gè)不同的結(jié)果/視圖技術(shù),都提供了對(duì)組件的包裝.包裝器提供了對(duì)
當(dāng)同F(xiàn)reemarker模版一起使用標(biāo)簽庫(kù)渲染的時(shí)候,還有一個(gè)額外的配置是必須的.一個(gè)額外的Servlet需要配置在"web.xml"文件中,這樣Freemarker可以在渲染時(shí)獲得它所需要的信息:
1
<servlet>
2
<servlet-name>jspSupportServlet</serlet-name>
3
<servlet-class>
4
….action2.views.JspSupportServlet.JspSupportServlet
5
</servlet-class>
6
<load-on-startup>10</load-on-startup>
7
</servlet>
每個(gè)組件同樣有模版與之關(guān)聯(lián).如果原始標(biāo)簽包含其他標(biāo)簽(例如form標(biāo)簽),將有一個(gè)開(kāi)始模版和一個(gè)關(guān)閉模版.如果原始標(biāo)簽只包含它自己(如checkbox標(biāo)簽),將只有一個(gè)關(guān)閉模版.并提供了在文本和UI結(jié)果中的邏輯的分離,為標(biāo)簽使用模版還提供了另外一個(gè)好處-它允許開(kāi)發(fā)者對(duì)相同的標(biāo)簽混合和匹配不同的模版,利用稱為"主題"的特性.
這里有三種常用的主題:"simple", "xhtml"和"css_xhtml"."simple"主題提供不使用任何格式化的標(biāo)簽."xhtml"主題將進(jìn)行進(jìn)一步的格式化;對(duì)于HTML的form標(biāo)簽,這個(gè)主題使用HTML表格提供兩列的格式化.對(duì)于CSS的純化論者,有一種"css_xhtml"主題.與"xhtml"主題相似,這種主題同樣提供了格式化;不過(guò)是使用CSS DIV替換了HTML表格.附加的格式化提供給開(kāi)發(fā)者,對(duì)HTML沒(méi)有增加額外的混亂.
"xhtml"和"css_xhtml"主題是非常好的例子,程序員可以自己實(shí)現(xiàn)個(gè)主題,為HTML提供特定的格式化.主題可以被混合或匹配到相同的頁(yè)面,并且當(dāng)前標(biāo)簽的主題使用"theme"屬性定義.如果你一直使用一個(gè)主題,它可以通過(guò)"struts.properties"配置文件的"struts.ui.theme"屬性配置默認(rèn)使用.
主題提供為所有的標(biāo)簽種類(控制標(biāo)簽,數(shù)據(jù)標(biāo)簽,Form標(biāo)簽和非Form的UI標(biāo)簽);然而,創(chuàng)建新的主題只能作用于可視的Form標(biāo)簽.
上一章:Starting Struts2--Core Components(3)
下一章:Starting Struts2--Architectural Goals
PS:第三章終于結(jié)束了......