Struts2 標籤庫 [Tablib] (轉)

Struts2 標籤庫 [Tablib] (轉)
Struts2 Taglib 抽象了不一樣表示技術,如今Struts2主要支持三種表示技術:JSP,FreeMarkerVelocity。但部分的Tag在三種表示技術下均可以使用,可是也有部分只能在某一種狀況下使用。
 
Tab 能夠分爲兩類:通用標籤和UI標籤。
 
4.1 節 通用標籤
通用標籤用來在頁面表示的時候控制代碼執行的過程,這些標籤也容許從Action或者值堆棧中取得數據。例如地域,JavaBeansURLs,和action
 
控制標籤控制程序執行,例如:ifelse,iterator
數據標籤管理數據的取得和建立,例如:beanpush,i18n
 
控制標籤
 
if 標籤
描述
  If 標籤用來控制基本的條件處理流程,一般和else標籤或者elseif標籤連用。
 
參數
名字
是否必須
默認值
能否使用表達式
類型
描述
id
 
String
用來表示該元素,對於UIForm標籤來講直接轉變爲HTML id屬性
test
 
Boolean
用來決定是否顯示標籤內部內容的表達式
 
例子
<s:if test="%{false}">
    <div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
    <div>Will Be Executed</div>
</s:elseif>
<s:else>
    <div>Will Not Be Executed</div>
</s:else>
 
elseIf 標籤
參考if標籤
 
else 標籤
參考if標籤
 
append 標籤
描述
用來作iterator標籤的輔助,將不一樣iterator中的內容合在一個iterator中。
 
參數
名字
是否必須
默認值
能否使用表達式
類型
描述
id
 
String
用來保存結果iterator的對象在value context中的名字。
 
例子
Action
public class AppendIteratorTagAction extends ActionSupport {
 
 private List myList1;
 private List myList2;
 private List myList3;
 
 
 public String execute() throws Exception {
 
     myList1 = new ArrayList();
     myList1.add("1");
     myList1.add("2");
     myList1.add("3");
 
     myList2 = new ArrayList();
     myList2.add("a");
     myList2.add("b");
     myList2.add("c");
 
     myList3 = new ArrayList();
     myList3.add("A");
     myList3.add("B");
     myList3.add("C");
 
     return "done";
 }
 
 public List getMyList1() { return myList1; }
 public List getMyList2() { return myList2; }
 public List getMyList3() { return myList3; }
 
標籤使用
<s:append id="myAppendIterator">
     <s:param value="%{myList1}" />
     <s:param value="%{myList2}" />
     <s:param value="%{myList3}" />
</s:append>
<s:iterator value="%{#myAppendIterator}">
     <s:property />
</s:iterator>
 
generator 標籤(JSP Tag
描述
val屬性生成一個iterator
 
參數
例子
1:
生成一個簡單的iterator,而且使用iterator標籤打印出內容。
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}">
 <s:iterator>
     <s:property /><br/>
 </s:iterator>
</s:generator>
 
2:
生成一個iterator,使用count屬性。由於count屬性值爲3,因此只有前三個內容(aaa,bbb,ccc)在生成的iterator中。
Generate an iterator with count attribute
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3">
 <s:iterator>
     <s:property /><br/>
 </s:iterator>
</s:generator>
 
 
3:
生成iterator,使用了id屬性,以後生成的對象放在pageContext中,能夠經過指定的id來訪問。
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="4" separator="," id="myAtt" />
<%
 Iterator i = (Iterator) pageContext.getAttribute("myAtt");
 while(i.hasNext()) {
     String s = (String) i.next();
%>
     <%= s %> <br/>
<%
} 
%>
 
4:
生成iterator,使用converter屬性,這裏的convertor僅僅將每個對象添加了一個"converter-"前綴。
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" converter="%{myConverter}">
 <s:iterator>
     <s:property /><br/>
 </s:iterator>
</s:generator>
 
 
public class GeneratorTagAction extends ActionSupport {
 
  ....
 
  public Converter getMyConverter() {
     return new Converter() {
         public Object convert(String value) throws Exception {
             return "converter-"+value;
         }
     };
  }
 
  ...
 
}
 
iterator 標籤
描述
迭代處理一個java.util.Connection或者java.util.Iterator對象
 
參數
名字
是否必須
默認值
能否使用表達式
類型
描述
id
 
String
Id
status
Boolean
若是指定,在循環的過程當中會保留一個IteratorStatus類型的變量,該變量用來查詢當前迭代的狀態
value
 
String
被迭代的對象
 
 
例子
1
<s:iterator value="days">
  <p>day is: <s:property/></p>
</s:iterator>
 
2
<s:bean name="org.apache.struts2.example.IteratorExample" id="it">
  <s:param name="day" value="'foo'"/>
  <s:param name="day" value="'bar'"/>
</s:bean>
<p/>
<table border="0" cellspacing="0" cellpadding="1">
<tr>
  <th>Days of the week</th>
</tr>
<p/>
<s:iterator value="#it.days" status="rowstatus">
  <tr>
    <s:if test="#rowstatus.odd == true">
      <td style="background: grey"><s:property/></td>
    </s:if>
    <s:else>
      <td><s:property/></td>
    </s:else>
  </tr>
</s:iterator>
</table>
 
3
<s:iterator value="groupDao.groups" status="groupStatus">
     <tr
class="<s:if test="#groupStatus.odd == true ">odd</s:if><s:else>even</s:else>">
         <td><s:property value="name" /></td>
         <td><s:property value="description" /></td>
         <td>
             <s:iterator value="users" status="userStatus">
                 <s:property value="fullName" />
<s:if test="!#userStatus.last">,</s:if>
             </s:iterator>
         </td>
     </tr>
 </s:iterator>
 
merge 標籤(append
描述
參數
例子
 
sort 標籤(JSP-Tag
描述
對一個能夠迭代的對象進行排序操做。
 
參數
 
名字
是否必須
默認值
能否使用表達式
類型
描述
Comparator
 
java.util.Comparator
排序用的比較器
Source
 
String
排序對象
 
例子
1:
<s:sort comparator="myComparator" source="myList">
     <s:iterator>
     <!-- do something with each sorted elements -->
     <s:property value="..." />
     </s:iterator>
</s:sort>
 
2:
<s:sort id="mySortedList" comparator="myComparator" source="myList" />
<%
   Iterator sortedIterator = (Iterator) pageContext.getAttribute("mySortedList");
   for (Iterator i = sortedIterator; i.hasNext(); ) {
     // do something with each of the sorted elements
   }
%>
 
subset
描述
遞歸iterator的一部分
 
參數
名字
是否必須
默認值
能否使用表達式
類型
描述
count
False
 
Integer
Iterator 中被遞歸的一部分的item的數量
Decider
 
org.apache.struts2.util.
SubsetIteratorFilter.Decider
用來判斷iterator中的item是否包含在最終的subset內部
Source
 
String
Iterator 的對象
Start
 
Integer
開始位置
 
例子
Java
 
public class MySubsetTagAction extends ActionSupport {
     public String execute() throws Exception {
        l = new ArrayList();
        l.add(new Integer(1));
        l.add(new Integer(2));
        l.add(new Integer(3));
        l.add(new Integer(4));
        l.add(new Integer(5));
        return "done";
     }
 
 
     public Integer[] getMyArray() {
        return a;
     }
 
     public List getMyList() {
        return l;
      }
 
     public Decider getMyDecider() {
     return new Decider() {
         public boolean decide(Object element) throws Exception {
             int i = ((Integer)element).intValue();
             return (((i % 2) == 0)?true:false);
         }
     };
     }
 }
<!-- s: List basic -->
   <s:subset source="myList">
      <s:iterator>
         <s:property />
      </s:iterator>
   </s:subset>
<!-- B: List with count -->
   <s:subset source="myList" count="3">
      <s:iterator>
          <s:property />
      </s:iterator>
    </s:subset>
<!--  C: List with start -->
     <s:subset source="myList" count="13" start="3">
        <s:iterator>
          <s:property />
        </s:iterator>
     </s:subset>
<!--  D: List with id -->
     <s:subset id="mySubset" source="myList" count="13" start="3" />
     <%
         Iterator i = (Iterator) pageContext.getAttribute("mySubset");
         while(i.hasNext()) {
     %>
     <%=i.next() %>
     <%  } %>
<!--  D: List with Decider -->
    <s:subset source="myList" decider="myDecider">
           <s:iterator>
                <s:property />
           </s:iterator>
    </s:subset>
 
數據標籤
@TODO 完成以下數據標籤
數據標籤包括
a
action
bean
date
debug
i18n
include
param
push
set
text
url
property
 
4.2 UI標籤
UI 標籤主要是指Form相關的標籤,UI標籤又分爲兩部分:form標籤和構成form內部字段的其餘標籤。
每個UI標籤都是基於模板的,即:每個標籤都有一個對應的模板用來生成UI標籤的樣式,詳細內容參看模板節。
 
全部的UI標籤都有着共通的祖先UIBeanUIBean提供了這些UI標籤的一系列共通的屬性,這些屬性能夠分爲三類:模版相關的屬性,JavaScript相關的屬性和其餘通用屬性。
 
模版相關屬性:
屬性
主題
數據類型
說明
templateDir
n/a
String
定義模版目錄
theme
n/a
String
定義主題的名字
template
n/a
String
定義模版名字
 
JavaScript 相關屬性:
屬性
主題
數據類型
說明
onclick
simple
String
html javascript onclick 屬性
ondbclick
simple
String
html javascript ondbclick 屬性
onmousedown
simple
String
html javascript onmousedown 屬性
onmouseup
simple
String
html javascript onmouseup 屬性
onmouseover
simple
String
html javascript onmouseover 屬性
onmouseout
simple
String
html javascript onmouseout 屬性
onfocus
simple
String
html javascript onfocus 屬性
onblur
simple
String
html javascript onblur 屬性
onkeypress
simple
String
html javascript onkeypress 屬性
onkeyup
simple
String
html javascript onkeyup 屬性
onkeydown
simple
String
html javascript onkeydown 屬性
onselect
simple
String
html javascript onselect 屬性
onchange
simple
String
html javascript onchange 屬性
 
Tooltip 相關屬性:
屬性
數據類型
默認值
說明
tooltip
String
none
爲指定的組件設置Tooltip
jsTooltipEnabled
String
false
使用js表示tooltip
tooltipIcon
String
/struts/static/tooltip/tooltip.gif
指向tooltip圖表的URL
tooltipDelay
String
500
多長時間後顯示Tooltip
key
simple
String
這個輸入字段對應的屬性,用來自動設置namelabelvalue
 
通用屬性:
屬性
主題
數據類型
說明
cssClass
simple
String
定義html class 屬性
cssStyle
simple
String
定義html style屬性
title
simple
String
定義html title屬性
disabled
simple
String
定義html disabled屬性
label
xhtml
String
定義form字段的標籤
labelPosition
xhtml
String
定義標籤在Form中的位置,從左從上計算
requiredPosition
xhtml
String
定義必須的標籤在Form中的位置,從左從上計算
name
simple
String
定義form字段的name映射
required
xhtml
Boolean
label上添加一個*
tabIndex
simple
String
定義 html tabIndex屬性
value
simple
Object
定義form字段的值
 
對於namevalue的說明:
name 用來講明Form字段的名字,和Action類的屬性對應。
value 用來記錄Form字段的值,和Action類中屬性的值對應。
因此在修改一個字段的內容的時候應該使用以下的標籤:
<s:form action="updateAddress">
    <s:textfield label="Postal Code" name="postalCode" value="%{postalCode}"/>
    ...
</s:form>
可是,因爲namevalue的關係,struts2標準標籤能夠自動對應,因此也可使用以下標籤:
<s:form action="updateAddress">
    <s:textfield label="Postal Code" name="postalCode" />
    ...
</s:form>
 
UI 標籤說明:
Form 部分
autocompleter
checkbox
checkboxlist
combobox
datetimepicker
doubleselect
head
file
form
hidden
label
optiontransferselect
optgroup
password
radio
reset
select
submit
textarea
textfield
token
updownselect
 
Form部分:
actionerror
actionmessage
component
div
fielderror
table
tabbedPanel
tree
treenode
 
4.3 節 主題和模板
概念說明:
標籤(tag):一小段代碼,在JSPVelocity或者FreeMarker中執行。程序開發的最小單位,用來生成HTML對應的元素。
模板(template):一些代碼,一般使用FreeMarker寫成,能夠被某些Tag表示出來(一般是UI Tag)。
主題(theme):一組模板打包在一塊兒,提供通用功能的模版
 
主題和模板主要針對可視化的標籤(Tag)而言,使用如下例子來講明三者之間的關係。
假如咱們要開發以下的一個畫面:
咱們使用以下的代碼:
 
< s:url action = "login"  id = "loginUrl" ></ s:url >
< s:form action = "%{loginUrl}" >
    < s:textfield label = "Name" name = "name" />
    < s:password label = "Password" name = "password" />
    < s:submit ></ s:submit >
    < s:reset ></ s:reset >
</ s:form >
 
這裏 < s:form > < s:textfield > < s:password > < s:submit > < s:reset > 每個都是一個標籤( tag )。
 
咱們在看看這些標籤在一塊兒生成的 HTML 源代碼:
< form id = "login" onsubmit = "return true;"
    action = "/login/login/login.action" method = "post" >
< table class = "wwFormTable" >
    < tr >
       < td class = "tdLabel" >
< label for = "login_name" class = "label" >
Name:
</ label >
</ td >
       < td >
< input type = "text" name = "name"
value = "" id = "login_name" />
       </ td >
    </ tr >
 
    < tr >
       < td class = "tdLabel" >
< label for = "login_password" class = "label" >
Password:
</ label ></ td >
       < td >
< input type = "password"
name = "password" id = "login_password" />
       </ td >
    </ tr >
 
    < tr >
       < td colspan = "2" >
       < div align = "right" >< input type = "submit" id = "login_0"
           value = "Submit" /></ div >
       </ td >
    </ tr >
 
    < tr >
       < td colspan = "2" >
       < div align = "right" >< input type = "reset"
value = "Reset" /></ div >
       </ td >
    </ tr >
 
</ table >
</ form >
 


在由標籤生成HTML代碼的時候,例如:
< s:textfield label = "Name" name = "name" />
生成的代碼爲:
< tr >
< td class = "tdLabel" >
< label for = "login_name" class = "label" >
Name:
</ label >
</ td >
< td >
< input type = "text" name = "name" value = "" id = "login_name" />
</ td >
</ tr >
咱們能夠看到, < s:textfield > 標籤提供的有效信息只有 Name name ,而其他的部分,例如 <tr> <td> <label> 等代碼都根據一個固定的模板文件生成,這個模板文件爲:
 
 
 
標籤使咱們開發JSP畫面的時候使用的最小組件單元,咱們根據客戶的須要組合各類Tag達到客戶的需求。模板是生成這些Tag時候使用的,使用模板能夠定義Tag的基本形式,在使用tag的時候,咱們只須要指定該Tag的不一樣屬性,便可根據Tag指定的特殊屬性,結合模板的基本屬性生成可視化的HTML元素。主題是不一樣tag結合在一塊兒而造成的。
<input type="text"<#rt/>
 name="${parameters.name?default("")?html}"<#rt/>
<#if parameters.get("size")?exists>
 size="${parameters.get("size")?html}"<#rt/>
</#if>
<#if parameters.maxlength?exists>
 maxlength="${parameters.maxlength?html}"<#rt/>
</#if>
<#if parameters.nameValue?exists>
 value="<@s.property value="parameters.nameValue"/>"<#rt/>
</#if>
<#if parameters.disabled?default(false)>
 disabled="disabled"<#rt/>
</#if>
<#if parameters.readonly?default(false)>
 readonly="readonly"<#rt/>
</#if>
<#if parameters.tabindex?exists>
 tabindex="${parameters.tabindex?html}"<#rt/>
</#if>
<#if parameters.id?exists>
 id="${parameters.id?html}"<#rt/>
</#if>
<#if parameters.cssClass?exists>
 class="${parameters.cssClass?html}"<#rt/>
</#if>
<#if parameters.cssStyle?exists>
 style="${parameters.cssStyle?html}"<#rt/>
</#if>
<#if parameters.title?exists>
 title="${parameters.title?html}"<#rt/>
</#if>
<#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
<#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
/>
 
咱們考慮標籤(Tag)使用模板(Template)生成HTML的過程,根據不一樣的模板,坑頂能夠生成不一樣的HTML畫面,這樣咱們能夠把不一樣tag的,視覺效果一致的模板放在一塊兒:
例如:
< s:form >         TemplateForm_A,       TemplateForm_B
< s:textfield >   TemplateTextField_A, TemplateTextField_B
< s:password >    TemplatePassword_A,  TemplatePassword_B
< s:submit >     TemplateSubmit_A,    TemplateSubmit_B
< s:reset >        TemplateReset_A,      TemplateReset_B
 
這樣將_A的模板放在一塊兒叫作A主題(Theme),將_B的模板放在一塊兒叫B主題。這樣咱們在分別使用A主題,B主題的時候能夠獲得同一個Tag的不一樣的視覺效果。
 
模版和主題的概念處在Struts Tag的核心位置。
 
Struts2 默認提供了四種主題:
Simple    主題:最簡單的主題
XHTML     主題:默認主題,使用經常使用的HTML技巧
CSS XHTML 主題: 使用CSS實現的XHTML主題
AJAX       主題:基於XHTML主題,可是同工了AJAX功能
 
相關配置:
struts.properties文件中有以下項目:
struts.ui.theme= xhtml
struts.ui.templateDir= template
struts.ui.templateSuffix= ftl
 
struts.ui.theme 的值表示的是使用哪一個主題,可選項位: xhtml,simple,css_html,ajax 其中 xhtml 爲默認值。
struts.ui.templateDir 的值表示模板的存放目錄。
struts.ui.templateSuffix 的值表示模板文件明的後綴,由於 Struts2 默認使用 FreeMarker 來編寫模板,因此這裏咱們基本使用 ftl 另外也可使用 vm Velocity )和 jsp Java Server Page ),可是全部的 Template Theme 要咱們本身開發。
 
關於模板文件的存放目錄咱們須要詳細說明,如上述說明,模板文件的存放位置位 template ,那麼系統在那裏尋找 template 目錄呢,
首先,在 web 應用程序中查找,若是應用程序中存在一個叫作 template 的目錄(跟 WEB-INF 目錄平級),那麼全部的文件從這個目錄中取得,具體的路徑還要加上主題的名字。
而後,若是在 web 應用程序中沒有找到 template 目錄,那麼 struts2 會在 classpath 中尋找,因爲 struts2-core-2.0.9.jar 文件中存在 template 目錄,其中內置了四種主題,因此會使用這裏變的模板。
例如:
若是咱們使用了 ajax 主題,那麼會在以下位置超找 <s:textfield> 的主題
應用程序
/template/ajax/textfield.ftl
classpath
/template/ajax/textfield.ftl
 
 
修改或者擴展模板:
有些時候Struts提供的模板不必定可以知足咱們的需求,這時候咱們須要修改或者擴展示有模板。從新作新的模板是不明智的,若是是在須要全新的模板,能夠考慮基於simple擴展。
 
修改:
根據模板的裝載機制,能夠考慮將模板從struts2-core-2.0.9.jar文件中解壓縮到web項目目錄,以後修改對應的文件。
 
包裝:
XHTML 提供了一個很好的例子,simple主題提供了基本的功能,XHTML將它包括起來,例如:
如下是template/xhtml/xxx.ftlxxx表示模板名字)文件內容:
<#include "/${parameters.templateDir}/xhtml/controlheader.ftl" />
<#include "/${parameters.templateDir}/simple/xxx.ftl" />
<#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" />
 
擴展(extend):
使用棉線對象的特性能夠擴展一個主題,擴展一個主題的時候不須要實現全部的模板,只須要實現須要變化的標籤。
擴展須要在目錄中新建一個叫作theme.properties的文件,這個文件只有一行,代表了繼承而來的主題的名字,例如:
/template/ajax/theme.properties 文件內容爲:
parent = xhtml
 
 
4.4 AJAX標籤(試驗階段)
Struts2 內置了Dojo 0.4 來提供對Ajax的支持。
想要使用AJAX標籤須要作到兩點:
1 使用Ajax主題
2 JSP畫面中使用了head標籤配置Ajax屬性
 
AJAX 標籤主要有:
<s:div> 
<s:submit>
<s:a>
<s:tabbedPanel>
<s:autocompleter>
 
AJAX 標籤的一些通用屬性:
屬性
說明
類型
href
請求使用的URL
String
listenTopic
使用逗號分割的一組主題列表,這個列表中的主題會致使這個Tag本身內容(DivAutocompleter)從新裝載或者執行一個ActionAnchorSubmit
String
notifyTopic
使用逗號分割的一組主題列表,向這個列表中的主題發佈一些信息,例如:’data’,’type’,’request’,參看每一個標籤的詳細說明
String
showErrorTransportText
設置是否顯示錯誤消息(默認顯示)
Boolean
indicator
請求過程當中顯示的對象,一般位ProgressBar
String
 
Indicator
<img style="display:none"
src="${pageContext.request.contextPath}/p_w_picpaths/indicator.gif"
alt="Loading..."/>
 
Topic
監聽一個Topic
dojo.event.topic.subscribe("/refresh", function(param1, param2) {
  //this function will be called everytime "/refresh" is published
});
向一個Topic發佈內容:
dojo.event.topic.publish("/refresh", "foo", "bar");
 
URL
Href 屬性對應的URL必須使用URL標籤訂義,例如:
<s:url id="ajaxTest" value="/AjaxTest.action" />
<s:div theme="ajax" href="%{ajaxTest}">
  Initial Content
</s:div>
 
DIV 標籤:
Div 主要用來異步的顯示數據, PageLoad會出發Div中數據的顯示,除非把AutoStart設置爲False
另外,Div的數據顯示可使用Topic來觸發。使用listenTopic來定義觸發器。
 
例如:
<s:url id="ajaxTest" value="/AjaxTest.action" />
<s:div theme="ajax" href="%{ajaxTest}" listenTopics="/refresh0,/refresh1"/>
每次想/refresh0,/refresh1發佈內容的時候,上面代碼定義的div都會刷新。
 
使用updateFreq可讓Div週期性的觸發,在autoStart設置位true的狀況下,可使用delay來延遲首次畫面加載的出發時間,例如:
<s:url id="ajaxTest" value="/AjaxTest.action" />
<s:div theme="ajax" href="%{ajaxTest}" updateFreq="2000" delay="3000"/>
上述代碼說明,每隔2秒該div觸發內容更新一次,可是首次畫面加載完成以後3div出發內容更新。
 
@todo 其餘標籤
 
 
 
4.5 OGNL
OGNL Object Graph Navigation Language的簡稱,詳細相關的信息能夠參考:[url]http://www.ognl.org[/url]。這裏咱們只涉及Struts2框架中對OGNL的基本支持。
 
OGNL 是一個對象,屬性的查詢語言。在OGNL中有一個類型爲MapContext(稱爲上下文),在這個上下文中有一個根元素(root),對根元素的屬性的訪問能夠直接使用屬性名字,可是對於其餘非根元素屬性的訪問必須加上特殊符號#
 
Struts2中上下文爲ActionContext,根元素位Value Stack(值堆棧,值堆棧表明了一族對象而不是一個對象,其中Action類的實例也屬於值堆棧的一個)。ActionContext中的內容以下圖:
              |
              |--application
              |
              |--session
context map---|
              |--value stack(root)
              |
              |--request
              |
              |--parameters
              |
              |--attr (searches page, request, session, then application scopes)
              |
由於Action實例被放在Value Stack中,而Value Stack又是根元素(root)中的一個,因此對Action中的屬性的訪問能夠不使用標記#,而對其餘的訪問都必須使用#標記。
 
引用Action的屬性
<s:property value="postalCode"/>
ActionContext 中的其餘非根(root)元素的屬性能夠按照以下的方式訪問:
<s:property value="#session.mySessionPropKey"/> or
<s:property value="#session["mySessionPropKey"]"/> or
<s:property value="#request["mySessionPropKey"]/>
 
Action 類可使用ActionContext中的靜態方法來訪問ActionContext
ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);
 
OGNL CollectionListsMapsSets
 
生成List的語法爲: {e1,e2,e3}.
<s:select label="label" name="name"
list="{'name1','name2','name3'}" value="%{'name2'}" />
上面的代碼生成了一個HTML Select對象,可選的內容爲: name1name2name3,默認值爲:name2
 
生成Map的語法爲:#{key1:value1,key2:value2}.
<s:select label="label" name="name"
list="#{'foo':'foovalue', 'bar':'barvalue'}" />
上面的代碼生成了一個HTML Select對象,foo名字表示的內容爲:foovaluebar名字表示的內容爲:barvalue
 
判斷一個對象是否在List內存在:
<s:if test="'foo' in {'foo','bar'}">
   muhahaha
</s:if>
<s:else>
   boo
</s:else>
 
<s:if test="'foo' not in {'foo','bar'}">
   muhahaha
</s:if>
<s:else>
   boo
</s:else>
 
取得一個List的一部分:
?    全部知足選擇邏輯的對象
^  -    第一個知足選擇邏輯的對象
$  -    最後一個知足選擇邏輯的對象
例如:
person.relatives.{? #this.gender == 'male'}
上述代碼取得這我的(person)全部的男性(this.gender==male)的親戚(relatives)
 
 
Lambda 表達式
 
OGNL 支持簡單的Lambda表達式語法,使用這些語法能夠創建簡單的lambda函數。
 
例如:
Fibonacci:
if n==0 return 0;
elseif n==1 return 1;
else return fib(n-2)+fib(n-1);
fib(0) = 0
fib(1) = 1
fib(11) = 89
 
OGNL Lambda表達式如何工做呢?
Lambda 表達式必須放在方括號內部,#this表示表達式的參數。例如:
<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
 
#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)] 定義了一個Lambda表達式,
#fib(11) 調用了這個表達式。
 
因此上述代碼的輸出爲:89
 
JSP2.1#被用做了JSP EL(表達式語言)的特殊記好,因此對OGNL的使用可能致使問題,
一個簡單的方法是禁用JSP2.1EL特性,這須要修改web.xml文件:
<jsp-config>
    <jsp-property-group>
      <url-pattern>*.jsp</url-pattern>
      <el-ignored>true</el-ignored>
    </jsp-property-group>
</jsp-config>
 
 
4.6 Tag 語法
代碼示例:
表達式
含義
<p>Username: ${user.username}</p>
一個在標準上下文中的JavaBean對象,能夠適用FreemarkerVelocity,JSTL EL等(不是OGNL)。
<s:textfield name="username"/>
Value Stack中的一個username屬性。
<s:url id="es" action="Hello">
  <s:param name="request_locale">
    es
  </s:param>
</s:url>
<s:a href="%{es}">Espanol</s:a>
引用Value Stack中屬性的另一種方法。
<s:property
  name="#session.user.username" />
Session 中的user對象的username屬性。
<s:select
  label="FooBar" name="foo"
  list="#{'username':'trillian',
    'username':'zaphod'}" />
一個簡單的靜態Map,和put("username","trillian")同樣
相關文章
相關標籤/搜索