posts - 297,  comments - 1618,  trackbacks - 0
           說(shuō)明:本文大部分內(nèi)容翻譯自struts-2.0.8-all\struts-2.0.8\docs\docs\using-tags.html,并將struts2的標(biāo)簽作為附錄補(bǔ)充,標(biāo)簽尚有部分未補(bǔ)充完。

           在上篇(Hello World篇)中,我們呈現(xiàn)了一個(gè)簡(jiǎn)單的歡迎界面。在本篇中,我們將創(chuàng)建鏈接到應(yīng)用其他Action的鏈接。

           Web應(yīng)用程序與傳統(tǒng)的Web站點(diǎn)有所不同,在Web應(yīng)用程序中我們可以創(chuàng)建動(dòng)態(tài)的返回。為了更容易的在頁(yè)面上獲得動(dòng)態(tài)數(shù)據(jù),本框架提供了一些標(biāo)簽集。其中有些標(biāo)簽?zāi)M了標(biāo)準(zhǔn)的HTML標(biāo)簽,但是提供了一些額外功能。還有一些框架提供了非標(biāo)準(zhǔn)的、但非常有用的控制功能。

           Struts標(biāo)簽的一個(gè)使用是創(chuàng)建一個(gè)到另外的Web資源的訪(fǎng)問(wèn)鏈接,特別是到本地的其他資源的鏈接。

          說(shuō)明:雖然HTML為創(chuàng)建超鏈接提供了簡(jiǎn)單的標(biāo)簽,HTML標(biāo)簽常常需要我們包括一些冗余的信息。并且HTML標(biāo)簽不能很容易的得到本框架的動(dòng)態(tài)數(shù)據(jù)。

          一.             鏈接標(biāo)簽

           Web應(yīng)用程序中的一個(gè)常用的功能是鏈接到其他頁(yè)面,現(xiàn)在讓我們?yōu)榍懊嬲鹿?jié)的歡迎界面添加到其他Action的鏈接。

          二.             代碼

            

          顯示注冊(cè)與登錄的jsp的代碼如下:

          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html>
          <head>
              <title>Welcome</title>
              <link href="<s:url value="/css/tutorial.css"/>" rel="stylesheet"
                    type="text/css"/>
          </head>
          <body>
          <h3>Commands</h3>
          <ul>
              <li><a href="<s:url action="Register"/>">Register</a></li>
              <li><a href="<s:url action="Logon"/>">Sign On</a></li>
          </ul>
          </body>
          </html>

           運(yùn)行效果如下:

           

           另一個(gè)常用的功能是使用鏈接來(lái)改變語(yǔ)言,在前章的HelloWorld頁(yè)面中,讓我們改變用戶(hù)的語(yǔ)言,并根據(jù)對(duì)應(yīng)的應(yīng)用程序資源來(lái)呈現(xiàn)信息。代碼如下:

          <body>
          <h2><s:property value="message"/></h2>
          <h3>Languages</h3>
          <ul>
              <li>
                  <s:url id="url" action="HelloWorld">
                      <s:param name="request_locale">en</s:param>
                  </s:url>
                  <s:a href="%{url}">English</s:a>
              </li>
              <li>
                  <s:url id="url" action="HelloWorld">
                      <s:param name="request_locale">es</s:param>
                  </s:url>
                  <s:a href="%{url}">Espanol</s:a>
              </li>
          </ul>
          </body>

           運(yùn)行效果如下:

           

          一.             代碼是如何工作的?

           上述例子中的“%{url}”將會(huì)被s:url標(biāo)簽來(lái)求得對(duì)應(yīng)的值。在WelcomeHelloWorld頁(yè)中,我們使用了兩種不同的鏈接標(biāo)簽。我們可以創(chuàng)建如下標(biāo)簽:

          l         資源鏈接

          l         直接的鏈接

          l         帶參數(shù)的鏈接

           下面讓我們分別看一下它們的使用:

          1.       資源鏈接

          首先在jspHEAD元素中,我們使用url標(biāo)簽來(lái)將資源引入到頁(yè)面中,代碼如下:

          <link href="<s:url value="/css/tutorial.css"/>" 
            rel="stylesheet" type="text/css"/>

          注意:引用時(shí)絕對(duì)的。我們可以移動(dòng)該頁(yè)面到其他路經(jīng)而不用擔(dān)心相對(duì)路徑。

          2.直接鏈接

           我們可以使用鏈接標(biāo)簽來(lái)定向到Action,實(shí)例代碼如下:

          <li><a href="<s:url action="Register"/>">Register</a></li>

           當(dāng)鏈接運(yùn)作的時(shí)候,鏈接標(biāo)簽?zāi)軌蜃詣?dòng)追加正確的擴(kuò)展,因此我們不需要在應(yīng)用程序中嵌入。這個(gè)標(biāo)簽也將會(huì)用會(huì)話(huà)id來(lái)編碼鏈接的URL,因此Java的會(huì)話(huà)在請(qǐng)求之間能夠保持。

          3.帶有參數(shù)的鏈接

           在上述的有關(guān)改變語(yǔ)言的HelloWorld頁(yè)中,我們可以使用帶有參數(shù)信息的url標(biāo)簽來(lái)創(chuàng)建帶有參數(shù)的鏈接,該段代碼如下:

           <s:url id="url" action="Welcome">
           <s:param name="request_locale">en</s:param>
          </s:url>
          <s:a href="%{url}">English</s:a>

           param標(biāo)簽將會(huì)在WelcomeActionurl后增加信息:“?request_locale=en”。這個(gè)標(biāo)簽接著將“url”引用注入到超鏈接中。

           說(shuō)明:通過(guò)增加param標(biāo)簽?zāi)軌蛟黾尤我鈹?shù)量的標(biāo)簽。

          二.             通配符映射

           在上述例子的Welcome頁(yè)面中,除了鏈接之外尚未添加任何內(nèi)容,我們不需要添加Action類(lèi)。但是,我們?nèi)匀恍枰砑右粋€(gè)映射,以便我們可以使用action URI(如果我們向映射到action,而不是頁(yè)面,我們?cè)诤竺嬉部梢院苋菀椎奶砑?/span>Action類(lèi)),映射代碼如下:

          <action name="Welcome" >
           <result>/tutorial/Welcome.jsp</result>
          </action>

           當(dāng)我們創(chuàng)建應(yīng)用程序的時(shí)候,我們常常需要直接鏈接到頁(yè)頁(yè)面,為了使原型更加容易,我們可以將Welcome的進(jìn)入改為通配符,修改后的映射如下:

           <action name="*" >
           <result>/tutorial/{1}.jsp</result>
          </action>

           這是代碼是如何工作的呢?

           如果找不到映射,本框架將會(huì)做如下工作:

          l         將“Welcome”映射為星號(hào)

          l         將“Welcome”代替result中對(duì)應(yīng)的“{1}

           同樣的,如果在映射文件中找不到“Login”的映射,將會(huì)映射到“/tutorial /Login.jsp”頁(yè)面。

           說(shuō)明:通配符映射能夠使得你能夠創(chuàng)建你自己的規(guī)約,以便你能夠避免冗余的配置。

          三.             數(shù)據(jù)輸入表單

           大多數(shù)應(yīng)用程序都使用一些數(shù)據(jù)進(jìn)入表單。Struts標(biāo)簽使得輸入表單更加容易,代碼如下:

          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html>
          <head>
           <title>Login</title>
          </head>
          <body>
          <s:form action="Logon"> 
            <s:textfield label="User Name" name="username"/>
           <s:password label="Password" name="password" />
           <s:submit/>
          </s:form>
          </body>
          </html>

           執(zhí)行效果如下:

           

           代碼是如何工作的呢?

          l         JSP標(biāo)簽在頁(yè)面頂部引入了Struts的標(biāo)簽庫(kù)

          l         Struts標(biāo)簽:textfieldpasswordsubmit,每一個(gè)都寫(xiě)出了正確的Lable和控制類(lèi)型

          四.             需要記住的東西

           編寫(xiě)web應(yīng)用程序的最難的一部分是編寫(xiě)頁(yè)面。本框架通過(guò)提供一系列的Struts標(biāo)簽使得編寫(xiě)頁(yè)面更加容易。Struts標(biāo)簽?zāi)軌颢@得框架提供的動(dòng)態(tài)數(shù)據(jù)。標(biāo)簽減少了用來(lái)創(chuàng)建頁(yè)面所需做的工作。

                                                                                                         附錄一

          ——標(biāo)簽使用指南

          一.             通用標(biāo)簽

           通用標(biāo)簽被用來(lái)在頁(yè)面執(zhí)行的時(shí)候,來(lái)控制執(zhí)行流。這些標(biāo)簽同樣允許數(shù)據(jù)不是從Action或者值棧中提取,例如本地化、JavaBeans、包括額外的URLaction執(zhí)行。

          l         控制類(lèi)標(biāo)簽提供了控制流,例如ifelseiterator

          l         數(shù)據(jù)類(lèi)標(biāo)簽允許數(shù)據(jù)操作或創(chuàng)建,例如beanpushi18n

           控制類(lèi)標(biāo)簽有ifelseIf elseappendgeneratoriteratormergesortsubset

           數(shù)據(jù)類(lèi)標(biāo)簽有aactionbeandatedebugi18nincludeparampushsettexturlproperty

           分別介紹如下:

          1.       控制類(lèi)標(biāo)簽

          1ifelseifelse

          描述:執(zhí)行基本的控制流,if能單獨(dú)使用,也可與elseelseif標(biāo)簽搭配使用。

          參數(shù):

          名稱(chēng)

          必選

          默認(rèn)值

          求值

          類(lèi)型

          描述

          id

           

          String

          id用來(lái)引用元素。對(duì)于UI或者form標(biāo)簽,它的意義等同于HTMLid屬性

          test

           

          Boolean

          用來(lái)決定標(biāo)簽體師是否顯示的表達(dá)式

          使用舉例:

          <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>

          2append

          該標(biāo)簽的工作是追加迭代器來(lái),

          例如,如果有三個(gè)迭代器(每個(gè)迭代器有三個(gè)元素)需要追加,下面展示了這個(gè)追加迭代器是如何排列的。

             首先是進(jìn)入第一個(gè)迭代器的第一個(gè)元素;

             第二步是進(jìn)入第一個(gè)迭代器的第二個(gè)元素;

             第三步是進(jìn)入第一個(gè)迭代器的第三個(gè)元素;

             第四步是進(jìn)入第二個(gè)迭代器的第一個(gè)元素;

             第五步是進(jìn)入第二個(gè)迭代器的第二個(gè)元素;

             第六步是進(jìn)入第二個(gè)迭代器的第三個(gè)元素;

             第七步是進(jìn)入第三個(gè)迭代器的第一個(gè)元素;

             第八步是進(jìn)入第三個(gè)迭代器的第二個(gè)元素;

             第九步是進(jìn)入第三個(gè)迭代器的第三個(gè)元素。

          參數(shù):

          名稱(chēng)

          必選

          默認(rèn)值

          求值

          類(lèi)型

          描述

          id

           

          String

          如果提供了該id的值,將會(huì)具有追加迭代器存儲(chǔ)到堆棧上下文中的合成結(jié)果

          使用舉例:

          Action類(lèi)的代碼:


          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; }

           jsp頁(yè)面的代碼:

           <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>

           3generator

           描述:創(chuàng)建一個(gè)基于提供的值的迭代器。

             注意:產(chǎn)生的迭代器將常常被推入堆棧頂部,而在標(biāo)簽結(jié)束的時(shí)候被推出。

           參數(shù):

          名稱(chēng)

          必選

          默認(rèn)值

          求值

          類(lèi)型

          描述

          converter

           

          org.apache.struts2.util.IteratorGenerator.Converter

          將從值中分析的字符串轉(zhuǎn)換為一個(gè)對(duì)象的轉(zhuǎn)換器

          count

           

          Integer

          在迭代器中的最大值

          id

           

          String

          如果提供了id,它將會(huì)用來(lái)存儲(chǔ)產(chǎn)生的迭代器到頁(yè)面上下文

          separator

           

          String

          分隔符用來(lái)將迭代器中的值分開(kāi)

          val

           

          String

          用來(lái)解析成迭代器的源

           舉例:

           1:
          <pre>
          例一:
          產(chǎn)生一個(gè)簡(jiǎn)單的迭代器
          <s:generator val="%{'aaa,bbb,ccc,ddd,eee'}">
           <s:iterator>
               <s:property /><br/>
           </s:iterator>
          </s:generator>
          </pre>
          這里產(chǎn)生了一個(gè)迭代器,并且使用iterator標(biāo)簽將它打印出來(lái)
          例二:
          <pre>
          產(chǎn)生一個(gè)帶有count屬性的迭代器
          <s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3">
           <s:iterator>
               <s:property /><br/>
           </s:iterator>
          </s:generator>
          </pre>
          這里產(chǎn)生了一個(gè)迭代器,但是只有其中的三個(gè)元素是可用的,這三個(gè)分別是aaabbbccc
          例三:
          <pre>
          產(chǎn)生一個(gè)帶有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/>
          <%    }
          %>
          </pre>
          產(chǎn)生了一個(gè)迭代器,并且將它存入頁(yè)面上下文的指定的idmyAtt)屬性中。
          例四:
          <pre>
          帶有converter屬性的generator標(biāo)簽
          <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;
                   }
               };
           }
           ...
          }
          </pre>
          產(chǎn)生的這個(gè)迭代器,它的每個(gè)元素由提供的轉(zhuǎn)換器獲得。在這個(gè)轉(zhuǎn)換器中,只是為每個(gè)元素增加了“converter-”。
          this converter, it simply add "converter-" to each entries.

           4iterator

           描述:迭代器將會(huì)迭代值。一個(gè)可迭代的值可以是java.util.Collection,也可以是java.util.Iterator

           參數(shù):

          名稱(chēng)

          必選

          默認(rèn)值

          求值

          類(lèi)型

          描述

          id

           

          String

          id用來(lái)引用元素。對(duì)于UI和表單標(biāo)簽,它與HTMLid標(biāo)簽相當(dāng)

          status

          Boolean

          如果該值被指定,一個(gè)迭代狀態(tài)的實(shí)例將會(huì)在每一個(gè)迭代中被推入堆棧中

          value

           

          String

          用來(lái)進(jìn)行迭代的迭代源,否則對(duì)象本身將會(huì)被放入新的產(chǎn)生的列表中

           舉例:

           下面的例子取回在值棧中的當(dāng)前對(duì)象的getDays()所返回的值,<s:property/>標(biāo)簽打印出當(dāng)前迭代器的值,代碼如下:

          <s:iterator value="days">

           <p>day is: <s:property/></p>

          </s:iterator>

             在下面的例子中使用Bean標(biāo)簽并且將它存入ActionContext中。iterator標(biāo)簽將會(huì)從ActionContext中取回對(duì)象而后調(diào)用它的getDays()方法。狀態(tài)屬性常常用來(lái)創(chuàng)建IteratorStatus對(duì)象,在這個(gè)例子中,它的odd()方法用來(lái)改變行的顏色。

          <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>

           下個(gè)例子將進(jìn)一步展示status屬性的使用,使用通過(guò)OGNLaction類(lèi)取得的DAO,成員的迭代以及它們的使用(在安全的上下文中),last()方法中指明了當(dāng)當(dāng)前的對(duì)象是迭代器的最后一個(gè)可用的對(duì)象,如果不是,我們需要使用逗號(hào)來(lái)分隔用戶(hù),代碼如下:

          <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>

           下一個(gè)例子在一個(gè)action collection上迭代,并且將每一個(gè)迭代的值傳給另一個(gè)action。這里的訣竅在于使用”[0]”。它獲得當(dāng)前的值并且將值傳入edit action。使用”[0]”與使用<s:property/>具有相同的效果(但是,后者,在param標(biāo)簽內(nèi)部不起作用)。代碼如下所示:

          <s:action name="entries" id="entries"/>
               <s:iterator value="#entries.entries" >
                   <s:property value="name" />
                   <s:property />
                   <s:push value="...">
                       <s:action name="edit" id="edit" >
                           <s:param name="entry" value="[0]" />
                       </s:action>
                   </push>
               </s:iterator>

            下例使用iterator標(biāo)簽來(lái)模擬一個(gè)簡(jiǎn)單的循環(huán),循環(huán)了5次,代碼如下:

          <s:iterator status="stat" value="{1,2,3,4,5}" >
             <!—獲得當(dāng)前的index(從0開(kāi)始) -->
             <s:property value="#stat.index" />
           
             <!— 獲得當(dāng)前堆棧的值 -->
             <!—當(dāng)前的迭代值(0, 1, ... 5) -->
             <s:property value="top" />
          </s:iterator>

          5merge

            描述:它是MergeIterator標(biāo)簽的組件,它的工作是合并迭代器和對(duì)合并后的迭代器的后續(xù)調(diào)用,它將使得每一個(gè)合并的迭代器有機(jī)會(huì)展示它的元素,接著下一個(gè)調(diào)用將會(huì)允許下一個(gè)迭代器來(lái)展示它的元素。一旦最后一個(gè)迭代器已展示完它的所有元素,第一個(gè)迭代器又能夠開(kāi)始展示它的元素(除非元素已經(jīng)用盡)。

           從內(nèi)部來(lái)說(shuō),任務(wù)將委托給MergeIteratorFilter去做。

           下面展示了3個(gè)列表的合并,其中每個(gè)列表有3個(gè)元素,步驟如下:

          1. 展示第一個(gè)列表的第一個(gè)元素;

          2. 展示第二個(gè)列表的第一個(gè)元素;

          3. 展示第三個(gè)列表的第一個(gè)元素;

          4. 展示第一個(gè)列表的第二個(gè)元素;

          5. 展示第二個(gè)列表的第二個(gè)元素;

          6. 展示第三個(gè)列表的第二個(gè)元素;

          7. 展示第一個(gè)列表的第三個(gè)元素;

          8. 展示第二個(gè)列表的第三個(gè)元素;

          9. 展示第三個(gè)列表的第三個(gè)元素;

           參數(shù):

          名稱(chēng)

          必選

          默認(rèn)值

          求值

          類(lèi)型

          描述

          id

           

          String

          合并后的迭代器的值將會(huì)存儲(chǔ)在堆棧上下文的id

           舉例:

           Action類(lèi)代碼:

          public class MergeIteratorTagAction extends ActionSupport {
           
           private List myList1;
           private List myList2;
           private List myList3;
           
           public List getMyList1() {
               return myList1;
           }
           
           public List getMyList2() {
               return myList2;
           }
           
           public List getMyList3() {
               return 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";
           }
          }

           jsp頁(yè)代碼:

          <s:merge id="myMergedIterator1">
               <s:param value="%{myList1}" />
               <s:param value="%{myList2}" />
               <s:param value="%{myList3}" />
          </s:merge>
          <s:iterator value="%{#myMergedIterator1}">
               <s:property />
          </s:iterator>

           

          二.             UI標(biāo)簽

           

          三.             主題與模板標(biāo)簽

           

          四.             標(biāo)簽引用

           

          五.             Ajax標(biāo)簽

           

          六.             標(biāo)簽語(yǔ)法

            標(biāo)簽被設(shè)計(jì)用來(lái)顯示動(dòng)態(tài)的數(shù)據(jù)。為了創(chuàng)建輸入域來(lái)顯示屬性“postalCode”,我們需要將“postalCode”傳給textfield標(biāo)簽。

            下面創(chuàng)建了一個(gè)動(dòng)態(tài)的輸入域:

           <s:textfield name="postalCode"/>

             如果在值棧中存在“postalCode”屬性,它的值將會(huì)被放入該輸入域中。當(dāng)輸入被提交到框架之后,它的值將會(huì)被放置到“postalCode”屬性中。

             有時(shí)候,我們想要傳動(dòng)態(tài)的數(shù)據(jù)到標(biāo)簽中。例如,我們可能需要用輸入域來(lái)顯示一個(gè)label,我們可能想要從應(yīng)用程序的message資源中。相應(yīng)地,框架將會(huì)解析在標(biāo)簽屬性中的表達(dá)式。因此在運(yùn)行時(shí)我們能夠合并動(dòng)態(tài)的數(shù)據(jù)到標(biāo)簽的屬性中。表達(dá)式是像“%{…}”這樣的。任何一個(gè)在其中嵌入的文本被作為表達(dá)式來(lái)計(jì)算。

             使用一個(gè)表達(dá)式來(lái)設(shè)置label的例子:

          <s:textfield key="postalCode.label" name="postalCode"/>

             表達(dá)式語(yǔ)言(OGNL)使得我們能夠調(diào)用方法和計(jì)算屬性。getText()方法由ActionSupport(大多數(shù)Action的基類(lèi))提供。我們可以調(diào)用任何一個(gè)表達(dá)式提供的方法,包括getText方法。

           String型的屬性

             HTTP協(xié)議是基于文本的,但是有一些標(biāo)簽時(shí)非String類(lèi)型的,例如boolint。為了能夠直接使用非String型的屬性,本框架將所有的非String類(lèi)型的屬性作為一個(gè)表達(dá)式處理,在這種情況下,你不需要使用任何轉(zhuǎn)義符(但是,如果你使用了轉(zhuǎn)義符,框架也會(huì)將其跳過(guò))。

             計(jì)算boolean型的例子:

          <s:select key="state.label" name="state" multiple="true"/>

             一旦multiple屬性跟一個(gè)boolean屬性對(duì)應(yīng)起來(lái),框架不會(huì)將它作為一個(gè)String來(lái)解釋?zhuān)@個(gè)值將會(huì)被作為一個(gè)表達(dá)式來(lái)計(jì)算并且自動(dòng)地將其轉(zhuǎn)換為boolean值。

             因?yàn)楹苋菀淄浤膫€(gè)屬性是String,哪個(gè)屬性是非String型的,你仍然可以使用轉(zhuǎn)義符。

             計(jì)算boolean值(帶有轉(zhuǎn)義符的):

           <s:select key="state.label" name="state" multiple="%{true}"/>

            帶有屬性的:

           <s:select key="state.label" name="state" multiple="allowMultiple"/>

           既帶有轉(zhuǎn)義符又帶有屬性的:

           <s:select key="state.label" name="state" multiple="%{allowMultiple}"/>

           

            值是一個(gè)對(duì)象

             更通常的情況是,屬性值是自動(dòng)放入的,因?yàn)?/span>name屬性通常告訴框架哪個(gè)屬性來(lái)調(diào)用方法來(lái)set值。但是,如果需要直接設(shè)置值,建議那個(gè)值是Object型而不是String型。

             注意:因?yàn)橹凳欠?/span>String型的,無(wú)論傳入什么,都是將他作為表達(dá)式來(lái)處理——而不是一個(gè)字面的String

             可能導(dǎo)致錯(cuò)誤的例子:

           <s:textfield key="state.label" name="state" value="CA"/>

             如果textfield被傳入 CA”,本框架將會(huì)名字為getCa的屬性。通常情況下,這不是我們的本意,我們想要做的是傳送一個(gè)字符串。在表達(dá)式語(yǔ)言中,文字需要被置為單引號(hào)之間。

             以正確的方式傳入一個(gè)文字值:

          <s:textfield key="state.label" name="state" value="%{'CA'}" />

             另一種方法是使用value=”’CA’”,但是在這種情況下,推薦使用表達(dá)式符號(hào)。

             標(biāo)簽屬性使用如下三種規(guī)則計(jì)算:

            1.    所有的String屬性都被解析成“%{…}”符號(hào);

            2.    所有的非String屬性沒(méi)有被解析,而是直接按照表達(dá)式來(lái)算;

            3.    規(guī)則2的異常情況是非String型的屬性使用轉(zhuǎn)義符號(hào)“{%{}”,符號(hào)被作為多余的符號(hào)被忽略,而只是計(jì)算內(nèi)容。

          表示式語(yǔ)言符號(hào)

            1.在FreemarkerVelocity或者JSTL的表達(dá)式語(yǔ)言的JavaBean對(duì)象的標(biāo)準(zhǔn)文本

           <p>Username: ${user.username}</p>

            2.在值棧中的一個(gè)username屬性

           <s:textfield name="username"/>

            3. 引用值棧中的屬性的另一種方式

           <s:url id="es" action="Hello">
           <s:param name="request_locale">
              es
           </s:param>
          </s:url>
          <s:a href="%{es}">Espanol</s:a>

            4. Session Context中獲得user對(duì)象的userName屬性

           <s:property name="#session.user.username" />

            5. 在一個(gè)靜態(tài)map中,像("username","trillian")一樣

            <s:select label="FooBar" name="foo" list="#{'username':'trillian', 'username':'zaphod'}" />

            下一篇:編寫(xiě)Action

          上一篇:HelloWorld

          posted on 2007-07-29 10:10 阿蜜果 閱讀(16489) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): Struts2


          FeedBack:
          # re: Struts2學(xué)習(xí)進(jìn)階(三)——使用Struts2的標(biāo)簽
          2007-07-29 10:57 | paul
          寫(xiě)的不錯(cuò),最近正在看s2,還是有點(diǎn)不明白,在讀取值時(shí) 什么時(shí)候該用
          %,什么時(shí)候用#,
          例如文章中的這一句;<s:iterator value="%{#myAppendIterator}">
          <s:property />
          value中該如何寫(xiě)?現(xiàn)在還不清楚,請(qǐng)賜教

          qq:157184362
          msn:e3002@163.com

            回復(fù)  更多評(píng)論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(三)——使用Struts2的標(biāo)簽[未登錄](méi)
          2007-07-29 22:44 | lf
          還有其他的標(biāo)簽什么時(shí)候講?  回復(fù)  更多評(píng)論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(三)——使用Struts2的標(biāo)簽[未登錄](méi)
          2007-07-30 10:59 | 阿蜜果
          @lf
          其他標(biāo)簽這周之內(nèi)會(huì)補(bǔ)充完的
          多謝關(guān)注  回復(fù)  更多評(píng)論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(基礎(chǔ)篇三)——使用Struts2的標(biāo)簽
          2007-08-05 23:42 | yangxiang
          關(guān)于通配符那看原版的沒(méi)弄明白,看了這篇文章終于搞懂了,多謝!  回復(fù)  更多評(píng)論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(基礎(chǔ)篇三)——使用Struts2的標(biāo)簽[未登錄](méi)
          2009-08-19 17:43 | aaa
          暈,為什么不能另存為??  回復(fù)  更多評(píng)論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(基礎(chǔ)篇三)——使用Struts2的標(biāo)簽[未登錄](méi)
          2010-11-29 16:25 | 123
          如何用struts2標(biāo)簽在jsp頁(yè)面中取得list的第一個(gè)元素?  回復(fù)  更多評(píng)論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(基礎(chǔ)篇三)——使用Struts2的標(biāo)簽
          2011-06-24 11:38 | 11
          一個(gè)讀取堆里邊的值 一個(gè)讀取棧里邊的值  回復(fù)  更多評(píng)論
            
          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來(lái)如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          相冊(cè)

          關(guān)注blog

          積分與排名

          • 積分 - 2296376
          • 排名 - 3

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 台湾省| 荆州市| 布拖县| 改则县| 洱源县| 新龙县| 宁城县| 广昌县| 台南市| 饶河县| 通辽市| 襄垣县| 乳源| 黄龙县| 阜新| 迭部县| 威远县| 广水市| 托克托县| 将乐县| 育儿| 宜都市| 庆阳市| 江津市| 苏州市| 荆州市| 察雅县| 城市| 绥棱县| 河源市| 泸水县| 玉门市| 鸡东县| 海林市| 十堰市| 荔浦县| 普宁市| 襄樊市| 确山县| 余江县| 任丘市|