Struts2提供了三種主題,ajax, simple, css_xhtml,xhtml,它默認的是xhtml主題,開發時我們一般都選simple。
因爲Struts2所有的UI標籤都是基於主題和模板的,主題和模板是Struts2所有UI標籤的核心。模板是一個UI標籤的外在表示形式,例如:當我們使用<s:select ... ... />標籤時,Struts2就會根據對應select模板來生成一個有模板特色的下拉列表框。如果爲所有的UI標籤都提供了對應的模板,那麼這系列的模板就形成了一個主題。
對於一個JSP頁面裏包含的UI標籤而言,即可以直接設置該UI標籤需要使用的模板,也可以設置該UI標籤使用的主題。實際上對開發者而言,並不推薦直接設置模板屬性,而是應該選擇特定主題。設置主題的方法有以下幾種:
1,通過設定特定UI標籤上的theme屬性來指定主題。
2,通過設定特定UI標籤外圍的Form標籤的theme屬性來指定主題。
3,通過取得page會話範圍內以theme爲名稱的屬性來確定主題。
4,通過取得request會話範圍內以theme爲名稱的屬性來確定主題。
5,通過取得session會話範圍內以theme爲名稱的屬性來確定主題。
6,通過取得application會話範圍內以theme爲名稱的屬性來確定主題。
7,通過取得名爲struts.ui.theme的常量(默認值是xhtml)來確定主題,該常量可以在struts.properties文件或者struts.xml文件中確定。如:
<constantname="struts.ui.theme" value="simple" />
上面介紹的幾種指定UI標籤主題的方式,它們的優先級也是按照上面的順序來的。
Struts2的模板目錄是通過struts.ui.templateDir常量來指定的,該常量的默認值是template,即意味着Struts2會從Web應用的template目錄,CLASSPATH(包括Web應用的WEB-INF\classes路徑和WEB-INF\lib路徑)的template目錄來依次加載特定模板文件。如果我們只使用一個select標籤,且指定主題爲xhtml,則加載模板文件的順序爲:
1,搜索Web應用裏/template/xhtml/select.ftl文件
2,搜索CLASSPATH路徑下的template/xhtml/select.ftl文件
Struts2的模板文件是.ftl文件,它是FreeMarker的模板文件。用戶也可以通過修改struts.ui.templateSuffix常量的值來改變Struts2默認的模板技術,該常量接受如下幾個值:
ftl:基於FreeMarker的模板技術
vm:基於Velocity的模板技術
jsp:基於JSP的模板技術
雖然Struts2允許使用自己的模板技術,但如果用戶選擇了使用Velicoty或JSP作爲模板技術,就要實現所有的模板和主題,這個是工作量很大的事情。
Struts2默認提供了4個主題:simple,xhtml,css_xhtml和ajax,這4個主題的模板文件放在Struts2的核心類庫裏(struts2-core.jar包)。
n?用戶也可以創建自己的主題
創建自定義的主題有如下3種方式:
1,開發者完全實現一個全新的主題,這種方式要求開發者爲每個UI標籤都提供自定義的模板文件,不推薦
2,包裝一個現有的主題,這種方式要求開發者爲每個UI組件都提供自定義主題的模板文件,即使自定義主題裏某個UI組件與原來主題裏UI組件的行爲完全一樣。也不推薦。
3,擴展一個現有的主題,這種方式開發者只需要提供自定義的模板文件,例子如下:
用戶自定義的主題是以xhtml主題爲基礎的,並且只想改變select UI標籤的行爲,則可以提供一個自己的select.ftl文件,並將該文件放在對應的主題目錄下。
select.ftl文件代碼如下:
<!--?加入自己的文字部分 -->
<h3>作者李:</h3>
<!--?包含xhtml主題下的controlheader.ftl模板 -->
<#include"/${parameters.templateDir}/xhtml/controlheader.ftl" />
<!--?包含simple主題下的select.ftl模板 -->
<#include"/${parameters.templateDir}/simple/select.ftl" />
<!--?包含xhtml主題下的controlfooter.ftl模板 -->
<#include"/${parameters.templateDir}/xhtml/controlfooter.ftl" />
將該文件放在Web應用的WEB-INF\classes\template\lee路徑下,這表明創建了一個自定義模板,該模板名爲lee。
除此之外,還必須在主題目錄下增加一個theme.properties文件,該文件指定自定義模板是以哪個模板爲基礎進行擴展的,文件內容爲:
parent=xhtml
#指定該主題以xhtml主題爲基礎進行擴展
該文件也放在WEB-INF\classes\template\lee路徑下,然後在JSP頁面中使用如下代碼就可調用此模板了:
<%--
* @author yeeku.H.lee [email protected]
* @version 1.0
* <br>Copyright (C), 2005-2008, yeeku.H.Lee
* <br>This program is protected by copyright laws.
* <br>Program Name:
* <br>Date:?
--%>
<%@ page contentType="text/html; charset=GBK"language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=GBK"/>
<title>使用自定義模板來生成下拉列表</title>
</head>
<body>
<s:select name="aa" theme="lee"?
list="{'Spring2.0' , 'J2EE' , 'Ajax'}" size="3"/>
</body>
</html>
Struts2提供的ajax主題就是以xhtml主題爲基礎進行擴展的。
Struts2的內建主題
Struts2內建了4個主題,分別是simple,xhtml,css_xhtml和ajax。
simple主題是最簡單的主題,它是最底層的結構,主要用於構建附加的功能或者行爲(例如在此主題基礎上進行擴展),使用simple主題時,每個UI標籤只生成一個簡單的HTML元素,不會生成其他額外的內容。
Struts2的xhtml, css_xhtml主題都是對simple主題的包裝和擴展。
xhtml主題是Struts2的默認主題,它對simple主題進行擴展,在該主題的基礎上增加了如下附加的特性:
1,針對HTML標籤(如textfield和select標籤)使用標準的兩列表格佈局。
2,每個HTML標籤的Label,即可以出現在HTML元素的左邊,也可以出現在上邊,這取決於labelposition屬性的設置。
3,自動輸出校驗錯誤信息。
4,輸出JavaScript的客戶端校驗。
css_xhtml主題則對原有的xhtml主題進行了擴展,在xhtml主題基礎上加入了CSS樣式控制。
ajax主題目對xhtml主題目進行了擴展,在xhtml主題上爲每個標籤提供了額外的Ajax支持。ajax主題的Ajax支持是以Dojo和DWR爲基礎的。ajax主題在xhtml主題基礎上增加了如下特性:
1,支持Ajax方式的客戶端校驗。
2,支持遠程表單的異步提交(最好和submit標籤一起使用)。
3,提供高級的div標籤,允許實現局部更新部分HTML的功能。
4,提供高級的a標籤,允許動態加載並執行遠端的javaScript代碼。
5,提供支持ajax的tabbedPanel。
6,提供"富客戶端"模型的pub-sub事件模型。