Struts2的模板和主題介紹

document_w 13年前發布 | 1K 次閱讀
Struts2的模板和主題介紹
    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文件中確定。
上面介紹的幾種指定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包)。
用戶也可以創建自己的主題
創建自定義的主題有如下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 sqpan@163.com
* @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事件模型。
5,Struts2的表單標簽
所有的表單標簽可以分為兩種:form標簽本身和單個表單元素的標簽。Struts2的表單元素標簽都包含了非常多的屬性。但有很多屬性完全是通用的。
表單標簽的通用屬性
所有表單標簽處理類都繼承了UIBean類,UIBean包含了一些通用屬性,這些通用屬性分成3種:
1,模板相關屬性;2,javascript相關屬性;3,通用屬性。
除了這些屬性之外,所有的表單元素標簽都存在一個特殊的屬性:form,這個屬性引用表單元素所在的表單,通過該form屬性,可以實現表單元素和表單之間的交互。例如,我們可以通過${parameters.form.id}來取得表單元素所在表單的ID。表單標簽的通用屬性有以下幾類:
1,模板相關的通用屬性:可以指定該表單標簽所用的模板和主題。
2,javascript相關的通用屬性:指定在鼠標在該標簽上操作時的javascript函數。
3,設置表單元素的提示:當鼠標在這引動元素上時,系統將出現提示。Struts2將這種特性稱為Tooltip。
4,設置表單元素的CSS樣式。
表單標簽的name和value屬性
name屬性會映射到Action中的屬性名稱,value屬性則代表此屬性的值。例子如下:
<!-- 將下面文本框的值綁定到Action的person屬性的firstName屬性 -->
<s:textfield name="person.firstName" />
<!-- 使用表達式生成表單元素的值 -->
<s:textfield name="person.firstName" value="${person.firstName}" />
實際上Struts2已經自動處理了屬性內容的賦值工作,因此我們只需要使用第一種方式就可以了。
checkboxlist標簽
checkboxlist標簽可以一次創建多個復選框,用于一次生成多個HTML標簽中的<input type="checkbox">,它根據list屬性指定的集合來生成多個復選框。因此使用該標簽要指定一個list屬性。其它都是通過屬性,但是有兩個常用屬性:
1,listKey:該屬性指定集合元素中的某個屬性作為復選框的key
2,listValue:該屬性指定集合元素中的某個屬性作為復選框的value
下面是一個JSP頁面的例子:
<%@ 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>使用s:checkboxlist生成多個復選框</title>
<s:head/>
</head>
<body>
<h3>使用s:checkboxlist生成多個復選框</h3>
<s:form>
<!-- 使用簡單集合來生成多個復選框 -->
<s:checkboxlist name="a" label="請選擇您喜歡的圖書" labelposition="top"
list="{''Spring2.0'' , ''J2EE'' , ''Ajax''}"/>
<!-- 使用簡單Map對象來生成多個復選框 -->
<s:checkboxlist name="b" label="請選擇您想選擇出版日期" labelposition="top"
list="#{''Spring2.0'':''2006年10月'' , ''J2EE'':''2007月4月'' , ''Ajax'':''2007年6月''}"
listKey="key"
listValue="value"/>
<s:bean name="lee.BookService" id="bs"/>
<!-- 使用集合里放多個JavaBean實例來生成多個復選框 -->
<s:checkboxlist name="b" label="請選擇您喜歡的圖書" labelposition="top"
list="#bs.books"
listKey="name"
listValue="author"/>
</s:form>
</body>
</html>
JavaBean和JavaBean的訪問類代碼如下:
package lee;
public class Book
{
private String name;
private String author;
public Book()
{
}
public Book(String name , String author)
{
   this.name = name;
   this.author = author;
}
public void setName(String name)
{
   this.name = name;
}
public String getName()
{
   return this.name;
}
public void setAuthor(String author)
{
   this.author = author;
}
public String getAuthor()
{
   return this.author;
}
}
package lee;
public class BookService
{
public Book[] getBooks()
{
   return new Book[]
   {
    new Book("Spring2.0","李"),
    new Book("J2EE","李"),
    new Book("Ajax","李")
   };
}
}
combobox標簽
combobox標簽生成一個單行文本框和下拉列表框的結合,但兩個表單元素只對應一個請求參數,只有單行文本框里的值才包含請求參數,而下拉列表框則只是用于輔助輸入,并沒有name屬性,也就不會產生請求參數。使用該標簽時,需要指定一個list屬性,該list屬性指定的集合將用于生成列表框。例子如下:

<%@ 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>使用s:combobox生成下拉輸入框</title>
<s:head/>
</head>
<body>
<h3>使用s:combobox生成下拉輸入框</h3>
<s:form>
<s:combobox label="請選擇您喜歡的圖書" theme="css_xhtml" labelposition="top"
list="{''Spring2.0'' , ''J2EE'' , ''Ajax''}"
size="20" maxlength="20" name="book"/>
</s:form>
</body>
</html>
通過訪問上面的JSP頁面,我們可以看到上面的文本框,用戶可以自行輸入,可也以選擇下面的checkbox中的內容來進行輸入。需要注意的是,此時的下拉列表僅僅是用于輔助輸入的,并沒有任何實際意義,因此不能指定它的listKey和listValue屬性。
datetimepicker標簽
datetimepicker標簽生成一個日期,時間下拉選擇框,當我們使用該日期,時間選擇框選擇某個日期,時間時,系統會自動將選中的日期,時間輸入指定的文本框。系統將指定日期,時間輸入指定文本框時,必須轉換成日期,時間字符串,為了設置該字符串的格式,必須使用日期,時間的格式符。datetimepicker使用例子如下:
<%@ 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>使用s:datetimepicker生成日期選擇框</title>
<s:head/>
</head>
<body>
<h3>使用使用s:datetimepicker生成日期選擇框</h3>
<s:form theme="simple">
日期選擇部件,指定toggleType屬性,且指定value="today"<br>
    <s:datetimepicker name="order.date" label="購買日期" toggleType="explode" value="today"/><hr>
日期選擇部件,指定了format屬性<br>
    <s:datetimepicker name="order.date" label="購買日期" displayFormat="dddd年MM月dd日"/><hr>
日期選擇部件,指定了weekStartsOn屬性<br>
    <s:datetimepicker name="order.date" label="購買日期" displayFormat="dddd年MM月dd日" weekStartsOn="2"/><hr>
時間選擇部件<br>
<s:datetimepicker label="選擇出發時間''" name="start" type="time" value="13:00"/><hr>
</s:form>
</body>
</html>
doubleselect標簽
doubleselect標簽會生成一個級聯列表框(兩個下拉列表框),當選擇第一個下拉列表框時,第二個下拉列表框中的內容會隨之改變。使用例子如下:
<%@ 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>使用s:doubleselect生成級聯下拉列表框</title>
<s:head/>
</head>
<body>
<h3>使用s:doubleselect生成級聯下拉列表框</h3>
<s:form action="x">
    <s:doubleselect
            label="請選擇您喜歡的圖書"
            name="author" list="{''李'', ''David''}"
            doubleList="top == ''李'' ? {''Spring2.0'', ''J2EE'' , ''Ajax''} : {''JavaScript: The Definitive Guide''}"
            doubleName="book"/>
</s:form>
</body>
</html>
默認情況下,第一個下拉列表框只支持兩項,如果超過兩項則不能這樣處理。
我們可以先定義一個Map對象,該Map對象的value都是集合,這樣就能以Map對象的多個key創建一個下拉列表框的列表項,而每個key對應的集合則用于創建第二個下拉列表框的列表項。例子如下:
<%@ 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>使用s:doubleselect生成級聯下拉列表框</title>
<s:head/>
</head>
<body>
<h3>使用s:doubleselect生成級聯下拉列表框</h3>
<s:set name="bs"
value="#{''李'': {''Spring2.0'', ''J2EE'',''Ajax''},
''David'': {''JavaScript: The Definitive Guide''},
''Johnson'': {''Expert One-on-One J2EE Design and Development''}}" />
<s:form action="x">
    <s:doubleselect
            label="請選擇您喜歡的圖書"
    size="3"
            name="author" list="#bs.keySet()"
            doubleList="#bs[top]"
    doubleSize="3"
            doubleName="book"/>
</s:form>
</body>
</html>
從訪問看到的效果來看,結果并不理想。還可以直接用javascript代碼來實現以上效果,這里就不給出代碼了。自己去思考一下。
head標簽
head標簽主要用于成生HTML主要頁面的HEAD部分。國為有些主題需要包含特定的CSS和javascript代碼,而該標簽則用于生成對這此CSS和javaScript代碼的引用。
例如,如果需要在頁面中使用ajax組件,則使用一個帶theme="ajax"屬性的head標簽,就可以將標準Ajax的頭信息包含在頁面中。
使用Ajax主題時,可以通過設置head標簽的debug參數為true,從而打開調試標志。
一般使用Struts2的UI標簽,javascript客戶端校驗等需要javascript庫和CSS支持功能時,都應該先使用head標簽。這個標簽沒有其它特別的用法,前面也已經使用過了。不再寫例子。
optiontransferselect標簽
optiontransferselect標簽會創建兩個選項用來轉移下拉列表項,該標簽會生成兩個<select>標簽,并且會生成系列的按鈕,這系列的按鈕可以控制選項在兩個下拉列表之間移動,升降,當提交該表單時,兩個<select>標簽的請求參數都會被提交。例子代碼如下:
<%@ 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>使用s:optiontransferselect來生成可移動列表項的下拉列表框</title>
<s:head/>
</head>
<body>
<h3>使用s:optiontransferselect來生成可移動列表項的下拉列表框</h3>
<s:form>
<!-- 使用簡單集合對象來生成可移動的下拉列表框 -->
<s:optiontransferselect
label="請選擇你喜歡的圖書"
name="cnbook"
leftTitle="中文圖書:"
rightTitle="外文圖書"
list="{''Spring2.0'',''J2EE'',''Ajax''}"
multiple="true"
addToLeftLabel="向左移動"
selectAllLabel="全部選擇"
addAllToRightLabel="全部右移"
headerKey="cnKey"
headerValue="--- 選擇中文圖書 ---"
emptyOption="true"
doubleList="{''Expert One-on-One J2EE Design and Development'', ''JavaScript: The Definitive Guide''}"
doubleName="enBook"
doubleHeaderKey="enKey"
doubleHeaderValue="--- 選擇外文圖書 ---"
doubleEmptyOption="true"
doubleMultiple="true"
/>
</s:form>
</body>
</html>
select標簽
select標簽用于生成一個下拉列表框,通過為該元素指定list屬性,系統會使用list屬性指定的集合來生成下拉列表框的選項。這個list屬性指定的集合,即可以是普通集合,也可以是Map對象,還可以是集合中的對象的實例。例子如下:
<%@ 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>使用s:select生成下拉選擇框</title>
<s:head/>
</head>
<body>
<h3>使用s:select生成下拉選擇框</h3>
<s:form>
<!-- 使用簡單集合來生成下拉選擇框 -->
<s:select name="a" label="請選擇您喜歡的圖書" labelposition="top" multiple="true"
list="{''Spring2.0'' , ''J2EE'' , ''JavaScript: The Definitive Guide''}"/>
<!-- 使用簡單Map對象來生成下拉選擇框 -->
<s:select name="b" label="請選擇您想選擇出版日期" labelposition="top"
list="#{''Spring2.0'':''2006年10月'' , ''J2EE'':''2007月4月'' , ''Ajax'':''2007年6月''}"
listKey="key"
listValue="value"/>
<s:bean name="lee.BookService" id="bs"/>
<!-- 使用集合里放多個JavaBean實例來生成下拉選擇框 -->
<s:select name="b" label="請選擇您喜歡的圖書" labelposition="top" multiple="true"
list="#bs.books"
listKey="author"
listValue="name"/>
</s:form>
</body>
</html>
radio標簽
radio標簽的用法與checkboxlist的用法幾乎完全相同,一樣可以指定label, list, listKey, listValue等屬性。例子代碼如下:
<%@ 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>使用s:radio生成多個單選框</title>
<s:head/>
</head>
<body>
<h3>使用s:radio生成多個單選框</h3>
<s:form>
<!-- 使用簡單集合來生成多個單選框 -->
<s:radio name="a" label="請選擇您喜歡的圖書" labelposition="top"
list="{''Spring2.0'' , ''Spring In Action'' , ''JavaScript: The Definitive Guide''}"/>
<!-- 使用簡單Map對象來生成多個單選框 -->
<s:radio name="b" label="請選擇您想選擇出版日期" labelposition="top"
list="#{''Spring2.0'':''2006年10月'' , ''J2EE'':''2007月4月'' , ''Ajax'':''2007年6月''}"
listKey="key"
listValue="value"/>
<s:bean name="lee.BookService" id="bs"/>
<!-- 使用集合里放多個JavaBean實例來生成多個單選框 -->
<s:radio name="c" label="請選擇您喜歡的圖書" labelposition="top"
list="#bs.books"
listKey="author"
listValue="name"/>
</s:form>
</body>
</html>
optgroup標簽
optgroup標簽用于生成一個下拉列表框的選項組,因此,該標簽必須放在<s:select>標簽中使用,一個下拉列表框中可以包含多個選項組,因此可以在一個<s:select>標簽中使用多個<s:optgroup>標簽。例子代碼如下:
<%@ 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>使用s:optgroup生成下拉選擇框的選項組</title>
<s:head/>
</head>
<body>
<h3>使用s:optgroup生成下拉選擇框的選項組</h3>
<s:form>
<!-- 使用Map對象來生成下拉選擇框的選項組 -->
<s:select label="選擇您喜歡的圖書"
           name="book"
           list="#{''Spring2.0'':''李剛'',''J2EE'':''李'',''Ajax寶典'':''李''}"
     listKey="value"
     listValue="key">
   <s:optgroup label="Rod Johnson"
           list="#{''Expert One-on-One J2EE Design and Development'':''Johnson''}"
     listKey="value"
     listValue="key"/>
   <s:optgroup label="David Flanagan"
           list="#{''JavaScript: The Definitive Guide'':''David''}"
     listKey="value"
     listValue="key"/>
</s:select>
</s:form>
</body>
</html>
通過瀏覽以上頁面,我們可以看到:直接通過select標簽的list屬性生成的選項,是單獨的選項,但通過optgroup標簽的list屬性生成的選項,則形成一個選項組,對于選項組的組名,是無法選擇的。
 
 

token標簽
token標簽是用于防止多次提交的標簽。避免了刷新頁面時多次提交,如果需要該標簽起作用,則應該在Struts2的配置文件中啟用TokenInterceptor攔截器或TokenSessionStoreInterceptor攔截器。
token標簽的實現原理是在表單中拉架一個隱藏域,每次加載該頁面時,該隱藏域的值都不相同。而TokenInterceptor攔截器則攔截所有用戶請求,如果兩次請求時該隱藏域的值相同,則阻止表單提交。
使用該標簽很簡單,如下代碼:
<h3>使用s:token防止重復提交</h3>
<s:form>
<s:token/>
</s:form>
從訪問后產生的HTML頁面的源代碼可以看到如下HTML代碼:
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="NUM1WVZQO3QTGKNZAKD7OA7C2YKWULVJ"/>
updownselect標簽
updownselect標簽的用法非常類似于select標簽的用法,區別是該標簽生成的列表框可以支持選項的上下移動。例子代碼如下:
<%@ 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>使用s:updownselect生成可上下移動選項的下拉選擇框</title>
<s:head/>
</head>
<body>
<h3>使用s:updownselect生成可上下移動選項的下拉選擇框</h3>
<s:form>
<!-- 使用簡單集合來生成可上下移動選項的下拉選擇框 -->
<s:updownselect name="a" label="請選擇您喜歡的圖書" labelposition="top"
moveUpLabel="向上移動"
list="{''Spring2.0'' , ''J2EE'' , ''JavaScript: The Definitive Guide''}"/>
<!-- 使用簡單Map對象來生成可上下移動選項的下拉選擇框
且使用emptyOption="true"增加一個空選項-->
<s:updownselect name="b" label="請選擇您想選擇出版日期" labelposition="top"
moveDownLabel="向下移動"
list="#{''Spring2.0'':''2006年10月'' , ''J2EE'':''2007月4月'' , ''Ajax'':''2007年6月''}"
listKey="key"
emptyOption="true"
listValue="value"/>
<s:bean name="lee.BookService" id="bs"/>
<!-- 使用集合里放多個JavaBean實例來可上下移動選項的生成下拉選擇框 -->
<s:updownselect name="c" label="請選擇您喜歡的圖書的作者" labelposition="top"
selectAllLabel="全部選擇" multiple="true"
list="#bs.books"
listKey="author"
listValue="name"/>
</s:form>
</body>
</html>
6,Struts2的非表單UI標簽
非表單標簽主要用于在頁面中生成一引動非表單的可視化元素,例如Tab頁面,輸出HTML頁面的樹形結構等,當然,非表單標簽也包含在頁面顯示Action里封裝的信息。非表單標簽主要有如下幾個:
1,a:生成一個超鏈接
2,actionerror:如果Action實例的getActionErrors()方法返回不為null,則該標簽負責輸出該方法返回的系列錯誤。
3,actionmessage:如果Action實例的getActionMessages()方法返回不為null,則該標簽負責輸出該方法返回的系列消息。
4,component:使用此標簽可以生成一個自定義組件。
5,div:此標簽負責生成一個div片段
6,fielderror:如果Action實例存在表單域的類型轉換錯誤,校驗錯誤,該標簽則負責輸出這些錯誤提示。
7,tabbedPanel:生成HTML頁面的Tab頁。
8,tree:生成一個樹形結構。
9,treenode:生成樹形結構的節點。
actionError和actionMessage標簽
這兩個標簽負責輸出錯誤或提示信息到客戶端,例子如下:
Action代碼如下:
package lee;
import com.opensymphony.xwork2.ActionSupport;
public class DemoAction extends ActionSupport
{
@Override
public String execute()
{
   addActionError("第一條錯誤消息!");
   addActionError("第二條錯誤消息!");
   addActionMessage("第一條普通消息!");
   addActionMessage("第二條普通消息!");
   return SUCCESS;
}
}
JSP頁面代碼如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
</head>
<body>
<s:actionerror/>
<s:actionmessage />
</body>
</html>
component標簽
conponent標簽用于使用自定義標簽,因為使用自定義組件還是基于主題,模板管理的,因此在使用component標簽,常常需要指定如下3個屬性:
theme:自定義組件所使用的主題,默認使用xhtml主題。
templateDir:指定自定義組件的主題目錄,默認使用系統的主題目錄,即template目錄。
template:指定自定義組件所使用的模板。
此外,還可以component標簽中使用param標簽來注入參數的值。例子如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>使用s:component標簽</title>
</head>
<body>
<h3>使用s:component標簽</h3>
使用自定義主題,自定義主題目錄<br>
從Web應用根路徑下加載模板,使用ftl模板。
<s:component
        theme="customTheme"
        templateDir="customTemplateDir"
        template="ftlCustomTemplate">
<s:param name="list" value="{''Spring2.0'' , ''J2EE'' , ''Ajax''}" />
</s:component>
<hr/>   
使用自定義主題,自定義主題目錄<br>
從Web應用根路徑下加載模板,使用JSP模板。    
<s:component
        theme="customTheme"
        templateDir="customTemplateDir"
        template="jspCustomTemplate.jsp">
<s:param name="list" value="{''Spring2.0'' , ''J2EE'' , ''Ajax''}" />
</s:component>     
<hr/>
使用默認主題(xhtml),默認主題目錄(template)<br>
從Web應用中加載模板,使用JSP模板。   
<s:component template="mytemplate.jsp">
<s:param name="list" value="{''Spring2.0'' , ''J2EE'' , ''Ajax''}" />
</s:component>
<hr/>
使用自定義主題,自定義主題目錄<br>
從/WEB-INF/classes路徑下加載模板,使用ftl模板。   
<s:component
theme="myTheme"
templateDir="myTemplateDir"
template="myAnotherTemplate">
<s:param name="list" value="{''Spring2.0'' , ''J2EE'' , ''Ajax''}" />
</s:component>
</body>
</html>
上面使用了FreeMarker和JSP模板,FreeMarker模板的ftlCustomTemplate.ftl代碼如下:
<div style="background-color:#bbbbbb;">
FreeMarker自定義模板<br>
請選擇您喜歡的圖書<br>
<@s.select list="parameters.list"/>
</div>
JSP模板jspCustomTemplate.jsp的代碼如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<div style="background-color:#eeeeee;">
<b>JSP自定義模板<br>
請選擇您喜歡的圖書<br></b>
<s:select list="parameters.list"/>
</div>
 
 

tree和treenode標簽
tree和treenode標簽可以在頁面生成一個樹形結構,其中tree生成一個樹形結構,treenode生成一個樹節點。例子如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>使用s:tree和s:treenode標簽生成靜態樹</title>
<s:head theme="ajax" debug="true"/>
</head>
<body>
<h3>使用s:tree和s:treenode標簽生成靜態樹</h3>
<s:tree label="圖書" id="book" theme="ajax"
showRootGrid="true" showGrid="true" treeSelectedTopic="treeSelected">
    <s:treenode theme="ajax" label="李" id="yeeku">
        <s:treenode theme="ajax" label="Spring2.0" id="spring"/>
        <s:treenode theme="ajax" label="J2EE" id="lightweight"/>
        <s:treenode theme="ajax" label="Ajax" id="ajax"/>
    </s:treenode>
    <s:treenode theme="ajax" label="David" id="David">
        <s:treenode theme="ajax" label="JavaScript: The Definitive Guide" id="javascript"/>
    </s:treenode>
    <s:treenode theme="ajax" label="Johnson" id="Johnson">
        <s:treenode theme="ajax" label="Expert One-on-One J2EE Design and Development" id="j2ee"/>
    </s:treenode>
</s:tree>
</body>
</html>
至此Struts2的標簽都已經講完了。
 本文由用戶 document_w 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!