無線&移動互聯網技術研發

          換位思考·····
          posts - 19, comments - 53, trackbacks - 0, articles - 283
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Struts2 要點筆記(六)

          Posted on 2010-05-19 01:24 Gavin.lee 閱讀(841) 評論(0)  編輯  收藏 所屬分類: SSH2 --Struts2

          二十三、OGNL表達式-Object Graphic Navigation Language(對象圖導航語言)

          Struts2框架默認的表達式語言其實我們可以不掌握OGNL表達式,JSTL/EL來代替

          相對EL表達式,它提供了平時我們需要的一些功能,如:

          1. 支持對象方法調用。如xxx.sayHello()

          2. 支持類靜態方法調用和值訪問,表達式的格式為@[類全名(包括包路徑)]@[方法名|值名],例如:@java.lang.String@format(‘foo%s’, ‘bar’)或者

          @cn.itcast.Constant@APP_NAME

          1.     操作類對象

          ognl有一個上下文(Context)概念,說白了上下文就是一個MAP結構,它實現了java.utils.Map接口,在Struts2中上下文(Context)的實現為ActionContext,下面是上下文(Context)的結構示意圖

          Struts2中的OGNL實現者為AcionContext

          Struts2接收一個請求時,會迅速創建ActionContextValueStackaction,然后把action存放進ValueStack,所以action的實例變量可以被OGNL訪問

          訪問上下文(Context)中的對象徐傲使用#符號標注命名空間,如#application#session

          另外OGNL會設定一個根對象(root對象),在Struts2中根對象就是ValueStack(值棧),如果要訪問根對象(即ValueStack)中對象的屬性,則可以省略#命名空間,直接訪問該對象的屬性即可。

          Struts2中,根對象ValueStack的實現為OgnlValueStack,該對象不是我們想象的只存放單個值,而是存放一組對象。在OgnlValueStack類里有一個List類型的root變量就是使用他存放一組對象。

          root變量中處于第一位的對象叫棧頂對象,通常我們在OGNL表達式里直接寫上屬性的名稱即可訪問root變量里對象的屬性,搜索順序是從棧頂對象開始尋找,如果棧頂對象不存在該屬性,就會從第二個對象尋找,如果沒有找到就到第三個對象尋找,依次往下訪問,知道找到為止。

          注意:Struts中,OGNL表達式是需要配合Struts標簽才能使用,如:<s:property value=”name”/>

          由于ValueStack(值棧)是Struts2OGNL的根對象,如果用戶需要訪問值棧中的對象,在JSP頁面可以直接通過下面的EL表達式訪問ValueStack(值棧)中對象的屬性:

          ${foo} //獲得值棧中某個對象的foo屬性

          如果訪問其他Context中的對象,由于他們不是根對象,所以在訪問時,需要添加#前綴

          application對象:用于訪問ServletContext,例如#application.userName或者#application[‘userName’],相當于調用ServletContextgetAttribute(“username”)

          session對象:用來訪問HttpSession。例如#session.userName或者#session[‘userName’],相當于調用session.getAttribue(“userName”)

          request對象:用來訪問HttpServletRequest屬性(attribute)的Map,例如#request.userName或者#request[‘userName’],相當于調用request.getAttribute(“username”)

          parameters對象:用于訪問HTTP的請求參數,例如#parameters.userName或者

          #parameters[‘userName’]

          相當于調用request.getParameter(“username”)

          attr對象:用于按page->request->session->application順序訪問其屬性

          為什么EL表達式能夠訪問valueStack中對象的屬性?

          因為Struts2HttpServletRequest做了進一步的封裝

          采用OGNL,不能訪問四大作用域中的變量,只能訪問ValueStack中的變量

          采用OGNL表達式創建一個List/Map集合對象

          如果需要一個集合元素的時候(例如List對象或者Map對象),可以使用OGNL中同集合相關的表達式。

          例如使用如下代碼直接生成一個List對象:

          <s:set name=”list” value=”{‘zhangming’,’xiaoli’,’liming’}”/>

          <s:iterator value=”#list”>

              <s:property /><br/>

          </s:iterator>

          set標簽用于將某個值放入指定范圍

          scope:指定變量被放置的范圍,該屬性可以接受applicationsessionrequestpage或者action。如果沒有設置該屬性,則默認放置在OGNL Context

          value:賦給變量的值,如果沒有設置該屬性,則將valueStack棧頂的值賦給變量

          生成一個Map對象

          <s:set name=”foobar” value=”#{‘foo1’:’bar1’,’foo2’:’bar2’}” />

          <s:iterator value=”#foobar” >

              <s:property value=”key”>=<s:property value=”value”/>

          </s:iterator>

          采用OGNL表達式判斷對象是否存在于集合中:

          對于集合類型,OGNL表達式可以使用innot in兩個元素符號,其中,in表達式用來判斷某個元素是否在指定的集合對象中,not in判斷某個元素是否不在指定的集合對象中,如下所示。

          in表達式:

          <s:if test=”’foo’ in {‘foo’,’bar’}>

              zai

          </s:if>

          <s:else>

              bu zai

          </s:else>

          not in 表達式:

          <s:if test”’foo’ not in {‘foo’,’bar’}>

              bu zai

          </s:if>

          <s:else>

              zai

          </s:else>

          OGNL表達式的投影功能---一般不適用,我們一般會在業務層把滿足條件的對象歸結出來

          除了innot in之外,OGNL還允許使用某個規則獲得集合對象的子集,場用的有以下3個相關操作符。

          ?:獲得所有符合邏輯的元素

          ^:獲得符合邏輯的第一個元素

          $:獲得符合邏輯的最后一個元素

          例如代碼:

          <s:iterator value=”books.{?#this.price > 35}”>

              <s:property value=”title”/>-$<s:property value=”price” /><br/>

          </s:iterator>

          在上面的代碼中,直接在集合后緊跟.{}運算符取出該集合的子集,{}內的表達式用于獲取符合條件的元素,this指的是為了從大集合books篩選數據到小集合,需要對大集合books進行迭代,this代表當前迭代的元素。本例的表達式用于獲取集合中價格大于35的書集合

          books.{?#this.price > 35}

          books.{……} 要從大集合中,篩選出滿足……這個條件的子集合放到value

          ?:表示符合邏輯的元素

          #this:迭代大集合的當前元素


           

          二十四、Struts2 標簽使用

          property標簽使用

          <s:set name=”name” value=”kk” />

          <s:property value=”#name” />

          default:可選屬性,如果需要輸出的屬性值為NULL,則顯示該屬性指定的值

          escape:可選屬性,指定是否格式化HTML代碼。

          value:可選屬性,指定需要輸出的屬性值,如果沒有指定該屬性,則默認輸出valueStack棧頂的值

          id:可選屬性,指定該元素的標識

          iterator 迭代標簽

          iterator標簽對于集合進行迭代,這里的集合包含ListSet和數組

          <s:set name="list" value="{'zhangming','xiaoi','liming'}"/>

          <s:iterator value="#list" status="st">

              <font color=<s:if test="#st.odd">red</s:if><s:else>blue</s:else>>

              <s:property /></font>/<br>

          </s:iterator>

          value:可選屬性,指定被迭代的集合,如果沒有設置該屬性,則使用ValueStack棧頂的集合

          id:可選屬性,指定集合里元素的id(已被標注為過時)

          status:可選屬性,該屬性指定迭代時的iteratorStatus實例,該實例包含如下幾個方法:

              int getCount(),返回當前迭代了幾個元素

              int getIndex(),返回當前迭代元素的索引

              Boolean isEven(),返回當前被迭代元素的索引是否是偶數

              Boolean isOdd(),返回當前被迭代元素的索引是否是奇數

              Boolean isFirst(),返回當前被迭代元素是否是第一個元素

              Boolean isLast(),返回當前被迭代元素是否是最后一個元素

          if/elseif/else 邏輯判斷

          s:set name="age" value="323" scope="request"/>

          <s:if test="#request.age==23">

              23

          </s:if>

          <s:elseif test="#request.age==21">

              21

          </s:elseif>

          <s:else>

              都不等

          </s:else>

          url標簽

          <a href="<s:url action="helloworld_add" namespace="/test"><s:param name="personid" value="233"/></s:url>">ssss</a>

          <s:set name="myurl" value="'http://www.foshanshop.net'"/>

          <s:url value="%{#myurl}" /><br>

          checkboxlist復選框/radio 單選框/select下拉列表框

              集合為list:

          <s:checkboxlist name="list"

          list="{'Java','.Net','RoR','PHP'}" value="{'Java','.Net'}"/><br/>

              集合為map:

          <s:checkboxlist name="map" list="#{1:'瑜珈用品',2:'戶外用品',3:'球類',4:'自行車'}"

               listKey="key" listValue="value" value="{1,2,3}"/><br/>

               <s:radio name="raido1" list="#{1:'瑜珈用品',2:'戶外用品',3:'球類',4:'自行車'}" listKey="key" listValue="value" value="1"/>

               <br/>

               <s:select name="se" list="#{1:'瑜珈用品',2:'戶外用品',3:'球類',4:'自行車'}" listKey="key" listValue="value" value="1"/>

           <!-- 默認的視圖主題,即不需要struts2在頁面為我們輸出一些代碼 -->

          <constant name="struts.ui.theme" value="simple" />


           

          二十五、國際化

          目前對筆者不適用,由于時間緊迫,不再記錄

          主站蜘蛛池模板: 三门县| 新乡县| 宝应县| 新绛县| 富蕴县| 衡南县| 子长县| 孝感市| 平阳县| 犍为县| 江华| 巴马| 柏乡县| 高碑店市| 武功县| 准格尔旗| 壶关县| 平湖市| 怀柔区| 德化县| 巴彦淖尔市| 余江县| 乾安县| 乐亭县| 洱源县| 襄樊市| 邯郸县| 紫阳县| 临武县| 股票| 上林县| 冀州市| 邛崃市| 左权县| 马关县| 藁城市| 浙江省| 上饶县| 江口县| 南充市| 泾川县|