天天看點

struts2學習筆記--struts标簽的theme

http://hi.baidu.com/zhouwei9960/blog/item/6f9dec674123b62cab184cc4.html 處轉載

struts2中theme屬性包括xhtml,html,simple,ajax 。預設是xhtml

theme:設定struts2标簽的主題,預設為xhtml。 theme=xhtml時:會預設額外生成tr,td。 theme=simple時:就生成标簽所對應的html标簽形式。

在預設情況下,表單元素是分布在不同行的。如下代碼:

<s:form action="login2">     <s:textfield label="使用者名" name="username"/>     <s:password label="密碼" name="password"/>     <s:submit label="送出"/> </s:form>

我們看着以上的代碼跟HTML的差不了多少,但是因為struts2表單預設将表單内的每一個元素都分在單獨的一行,label屬性就如同我們在HTML 中在<input type="text"/>前面的文字标簽一樣。如果我們不想讓它自動換行,那就應該寫成如下格式:

<s:form action="login2" theme="simple">     <s:textfield label="使用者名" name="username"/>     <s:password label="密碼" name="password"/>     <s:submit label="送出"/> </s:form>

但在設定theme="simple"後,表單元素的label屬性将失效,這時我們就得在表單元素前面加入想用label顯示的文字。如:

<s:form action="login2" theme="simple">       使用者名:<s:textfield label="使用者名" name="username"/>       密碼:<s:password label="密碼" name="password"/>     <s:submit label="送出"/> </s:form>

此時顯示的為将不在是label中的值,而是顯示文本框前面的文字,按鈕則顯示它原來的預設值:sbumit。

以下為擴充知識: 1. 模闆目錄->主題目錄->主題(模闆檔案) 這是模闆/主題的目錄組織方式。以實際為例,打開 struts2-core-2.x.x.jar 可以看到裡面有一個 template,在 template 下有5個目錄 ajax、css_xhtml、simple、xhtml 和 archive,其中前四個分别是 ajax、css_xhtml、simple、xhtml 主題的目錄,每個主題目錄中有各自的模闆檔案,主要是 ftl 檔案,還有 css 和 js 檔案。最後一個 archive 是歸檔的主題目錄,其下又有 ajax、simple、xhtml、模闆檔案是 .vm 檔案。由此可知 Struts2 大力推薦的模闆語言是 FreeMarker,而不是 Velocity,以後要好好看看 FreeMarker,隻知道 FreeMarkder 更 XML 化。

2. 上面看到模闆目錄名是 template,是 struts2-core-2.x.x.jar 中,其實目錄名是由 struts.ui.templateDir 常量來指定的,隻是預設值是 template。意味着 Struts 2 從 Web 應用的 template 目錄或 CLASSPATH 的 template 目錄(包) 中依次加載特定的模闆檔案。

3. 比如我們使用一個 select 标簽,且指定主題為 xhtml,則加載模闆檔案的順序為 (1) Web 應用/template/xhmlt/select.flt    (2) CLASSPATH/template/xhtml/select.ftl。Struts2 預設是用的 FreeMarkder 模闆技術,可設定常量 struts.ui.templateSuffix 來改變預設的模闆技術,可選值有 ftl、vm、jsp。但是對于 vm 和 jsp 要自己提供完整的實作,Struts2 可沒幫你做這些。

4. 有時候我們想要自定義主題,如你希望輸入框前的标簽顯示紅顔色,你不想要校驗錯誤提示在輸入框正上方而是右邊。當然你可以修改 struts2-core-2.x.x.jar 中 template 下某個主題的模闆檔案,或拷一份到 Web 應用目錄的 template 目錄修改要定制的模闆,這樣做總有些不爽。Struts2 還支援兩種更靈活的主題定制方式。包裝和繼承現有主題,可以同時使用。 最簡單的主題定制方式是利用主題模闆的加載優先級,把自定義的模闆檔案放在優先級高的目錄,比如放一個 text.ftl 在 WEB-INF/classes/template/xhtml/ 目錄下,它将覆寫掉 struts2-core-2.x.x.jar 裡的 template/xhtml/text.ftl 的定義。

5. 先看一個包裝的例子,在 xhtml 下的 combobox.ftl 的内容如下: <#include "/${parameters.templateDir}/${parameters.theme}/controlheader.ftl" />

<#include "/${parameters.templateDir}/simple/combobox.ftl" />     <#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" /><#nt/> 它就是對 simple/combobox.ftl 的基礎上包裝上一個 controlheader.ftl 和一個 controlfooter.ftl,包裝的局限性是你仍然是要為每一個 UI 元件提供單獨模闆檔案,即全套的。 和設計模式中的包裝(裝飾)模式如出一轍,如 BufferedInputStream 包裝了 InputStream,但在 BufferedInputStream 提供了全套的和 InputStream 一樣的操作方法。

6. 再說繼承來自定義主題,如果簡單改變個别 UI 的風格,繼承就是最為高效的了。此繼承與 Java 的繼承(即extends) 也是一馬事。要改變或要新加的用自己定義的,其他的延用父主題的。舉個例子,自定義一個名為 custom 的主題繼承自 xhtml,隻改變 select 标簽的風格,你要做的就是編輯自己的一個 select.ftl 放在 WEB-INF/classes/template/custom 下,并在此目錄下放一檔案 theme.properties,内容是: #指定該主題以 xhtml 為基礎進行擴充 parent=xhml

使用可指定給 UI 标簽,例如 <s:form name="aa" theme="custom" ...,效果就會是 form 下的 select 使用了在 custom 目錄下自定義的 select.ftl,其他的直接使用父主題 xhtml 中的模闆檔案。Struts2 提供的 ajax 主題就是繼承自 xhtml 主題的。

7. 簡單說一下 Struts2 的内建主題,包括 simple、xhtml、css_xhtml 和 ajax。simple 主題不用多說,比Struts1 的 html 标簽還弱些,隻對應簡單的 html 元素,不生成額外内容。xhtml 是預設主題,是對 simple 主題的包裝和擴充(也就是繼承),該主題下有一個 head.ftl 用來導入 javascript 類庫(如 dojo)。xhtml 在 simple 的基礎上增加了以下特性:     1) 針對 HTML 标簽(如 textfield和select标簽) 使用标準的兩清單格布局     2) 每個 HTML 标簽有 label 屬性,預設左邊顯示,可通過 labelposition 屬性設定位置     3) 自動輸出背景校驗錯誤或 javascript 前端校驗錯誤

8. 繼續 Struts2 的内建主題的話題。css_xhtml 主題是對 xhtml 的擴充,顯示是加入了 css 樣式控制特性。ajax 主題是對 xhtml 主題的擴充,在 xhtml 主題的每個标簽增加了 ajax 的支援(以 Djoj 和 DWR 為基礎)。所增 Ajax 特性有:     1) Ajax 方式的用戶端校驗     2) 遠端表單的異步送出     3) 進階 div 标簽,允許局部更新     4) 進階 a 标簽,允許動态加載并執行遠端的 javascript 代碼。     5) 提供支援 ajax 的 tabbedPanel     6) 提供“富用戶端” 模型的 pub-sub 事件模型

9. 先前有網友問過我,他用了 Struts2 的校驗,但是錯誤輸出是在輸入框的上方,但希望錯誤資訊是顯示在輸入框的右方,該如何做。當時我隻告訴了他要修改模闆檔案,也隻是大概告訴了他是在某個 template 目錄下的一個 ftl 檔案,因那時具體操作自己也不太清楚。現在知道了線索,但實際修改還是很麻煩的。     輸入框 <s:textfield .../> 預設是用的 xhtml/text.flt 模闆,text.ftl 包裝了 smple/text.ftl,錯誤資訊可以追溯發現是在 controlheader-core.ftl 中定義顯示的,是以你可以把 xthml/text.ftl 和 controlheader-core.ftl 拷到 WEB-INF/classes/template/xhtml 目錄中進行修改,WEB-INF/classes/template/xhtml 中的模闆檔案是優先于 struts2-core-2.x.x.jar 裡的 template/xhtml 目錄中的模闆檔案加載。

10. 看有些地方隻籠統介紹說:所有表單元素都存在一個特殊的屬性:form,這個屬性引用元素所在表單,通過該屬性實作表單元素與表單間的互動,例如可通過 ${parameters.form.id} 通路表單的 ID。對這句話我隻是感到一頭霧水,檢視像 <s:textfield .../> 等标簽并無 form 屬性,用 <s:textfield value="${parameters.form.id}" name="aa"/> 也看不到輸出所在表單的 ID。去網上找找,才知道前面那句話有出入,其實說的是在主題模闆檔案裡的用法,打開一些主題模闆檔案,如 combobox.ftl 或 controlheader-core.ftl 檔案,你就能看到許多的 parameters 的表示法-- parameters.required、parameters.id。想見一下 parameters 屬性才是根本,它代表了表單元素的屬性集,parameters 說來還有點像 this,this.id、this.form.id、this.required 等等...

    在用struts2開發項目的時候發現它總是會添加一些html标簽在最終生成的html代碼中,比如說使用<s:form></s:form>标簽,此時生成的html代碼如下: 

<form ...><table class="wwFormTable"></table></form> 

   其中藍色高亮部分是struts自動産生的,對于這些自動産生的東西有時候有用,但是對于有些項目确是不合适的,比如說我們的頁面全部不允許加入table标簽,或者需要用别的樣式單等等,此時我們就希望不要産生這些多餘的标簽。 

    那麼怎樣才能讓struts2不要生成這些标簽呢? 其實在struts-core-2.06.jar的包中包含了一些預設的模版檔案,它們位于$ {struts-core-2.06.jar}/template下,其中有ajax,simple,xhtml等。  

       檢視一下struts.properties,如果沒有可以檢視$ {struts-core-2.06.jar}/org/apache/struts2/default.properties檔案,其中有如下配置: struts.ui.theme=xhtml struts.ui.templateDir=template struts.ui.templateSuffix=ftl 

   這一段就是關于struts2模版的配置資訊,我們可以修改struts.properties檔案,将其改成 struts.ui.theme=simple struts.ui.templateDir=template struts.ui.templateSuffix=ftl 

如果沒有struts.properties檔案,可以修改struts.xml檔案,在其中加入如下行 

<constant name="struts.ui.theme" value="simple" /> <constant name="struts.ui.templateDir" value="template" /> <constant name="struts.ui.templateSuffix" value="ftl" /> 此時<s:form></s:form>标簽生成的html代碼将會是<form ...></form>。

繼續閱讀