java學習

          java學習

           

          struts2標簽

          Struts2 Taglib抽象了不同表示技術,現在Struts2主要支持三種表示技術:JSP,FreeMarker和Velocity。但部分的Tag在三種表示技術下都可以使用,但是也有部分只能在某一種情況下使用。

          Tab可以分為兩類:通用標簽和UI標簽。

          4.1節 通用標簽

          通用標簽用來在頁面表示的時候控制代碼執行的過程,這些標簽也允許從Action或者值堆棧中取得數據。例如地域,JavaBeans,URLs,和action。

          控制標簽控制程序執行,例如:if,else,iterator

          數據標簽管理數據的取得和創建,例如:bean,push,i18n

          控制標簽

          if標簽

          描述

            If標簽用來控制基本的條件處理流程,通常和else標簽或者elseif標簽連用。

          參數

          名字

          是否必須

          默認值

          可否使用表達式

          類型

          描述

          id

          String

          用來表示該元素,對于UI和Form標簽來說直接轉變為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標簽都有著共通的祖先UIBean,UIBean提供了這些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

          這個輸入字段對應的屬性,用來自動設置name,label和value

          通用屬性:

          屬性

          主題

          數據類型

          說明

          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字段的值

          對于name和value的說明:

          name用來說明Form字段的名字,和Action類的屬性對應。

          value用來記錄Form字段的值,和Action類中屬性的值對應。

          所以在修改一個字段的內容的時候應該使用如下的標簽:

          <s:form action="updateAddress">

              <s:textfield label="Postal Code" name="postalCode" value="%{postalCode}"/>

              ...

          </s:form>

          但是,由于name和value的關系,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):一小段代碼,在JSP,Velocity或者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.ftl(xxx表示模板名字)文件內容:

          <#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自己內容(Div,Autocompleter)重新裝載或者執行一個Action(Anchor,Submit)

          String

          notifyTopic

          使用逗號分割的一組主題列表,向這個列表中的主題發布一些信息,例如:’data’,’type’,’request’,參看每個標簽的詳細說明

          String

          showErrorTransportText

          設置是否顯示錯誤消息(默認顯示)

          Boolean

          indicator

          請求過程中顯示的對象,通常位ProgressBar等

          String

          Indicator

          <img style="display:none"

          src="${pageContext.request.contextPath}/images/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觸發內容更新一次,但是首次畫面加載完成之后3秒div出發內容更新。

          @todo 其他標簽

          4.5節 OGNL

          OGNL是Object Graph Navigation Language的簡稱,詳細相關的信息可以參考:http://www.ognl.org。這里我們只涉及Struts2框架中對OGNL的基本支持。

          OGNL是一個對象,屬性的查詢語言。在OGNL中有一個類型為Map的Context(稱為上下文),在這個上下文中有一個根元素(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與Collection(Lists,Maps,Sets)

          生成List的語法為: {e1,e2,e3}.

          <s:select label="label" name="name"

          list="{'name1','name2','name3'}" value="%{'name2'}" />

          上面的代碼生成了一個HTML Select對象,可選的內容為: name1,name2,name3,默認值為:name2。

          生成Map的語法為:#{key1:value1,key2:value2}.

          <s:select label="label" name="name"

          list="#{'foo':'foovalue', 'bar':'barvalue'}" />

          上面的代碼生成了一個HTML Select對象,foo名字表示的內容為:foovalue,bar名字表示的內容為: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.1的EL特性,這需要修改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對象,可以適用Freemarker,Velocity,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'}" />

          一個簡單

          posted on 2013-01-18 13:38 楊軍威 閱讀(791) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 弋阳县| 怀来县| 上栗县| 井陉县| 义乌市| 南安市| 咸宁市| 伊春市| 鄂温| 沅陵县| 鸡东县| 荆门市| 海原县| 通辽市| 德兴市| 邯郸县| 宿迁市| 郓城县| 咸宁市| 南川市| 普宁市| 汶川县| 邓州市| 贵溪市| 肥东县| 呼图壁县| 徐汇区| 巨鹿县| 房山区| 凤山县| 高安市| 山西省| 福贡县| 博爱县| 闵行区| 进贤县| 吴堡县| 宣武区| 隆回县| 大关县| 伊吾县|