我的Blog我做主^_^

          走向一條通往JAVA的不歸路...

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            64 隨筆 :: 68 文章 :: 77 評論 :: 0 Trackbacks

          9.8.3? JSTL VS Struts Logic 標簽庫

          Struts Logic 標簽庫中的標簽在頁面顯示時是時常被用到的,但是常用的卻不一定是最好用的,有了 JSTL 標簽庫和 EL 表達式后,許多 Struts Logic 標簽庫的標簽可以被簡單替換。

          1. 所有判斷標簽被 EL 表達式和 <c:if> 標簽替換

          q???????? 原形:判斷標簽有一個特點,就是需要取得一個實例的變量,因此通過 <bean:define> 標簽來取得實例的變量是必須的,隨后就通過各種判斷標簽來完成判斷的工作。常用的判斷標簽如表 9.30 所示:

          9.30? 常用判斷標簽

          標簽名

          描述

          empty

          判斷變量是否為空

          notEmpty

          empty 標簽正好相反

          equal

          判斷變量是否與指定的相同

          notEqual

          equal 標簽正好相反

          lessThan

          判斷變量是否比指定的小

          greaterThan

          判斷變量是否比指定的大

          lessEqual

          判斷變量是否小于等于指定的值

          greaterEqual

          判斷變量是否大于等于指定的值

          present

          檢查 header request parameter cookie JavaBean JavaBean propertie 不存在或等于 null 的時候,判斷成功

          notPresent

          present 標簽正好相反

          match

          比較 String 類型字符串是否與指定的相同

          notMatch

          match 標簽正好相反

          q???????? 替換方案:利用 EL 表達式和 <c:if> 標簽來替換。

          q???????? 示例比較:判斷標簽的動作:

          <bean:define id="javaBeanName"

          name="javaBeanParameter"

          property="attack_event_code"

          scope="request"/>

          <logic:notEmpty name="javaBeanParameter">

          ???????? javaBeanParameter not empty

          </logic:notEmpty>

          EL 表達式和 <c:if> 標簽的動作:

          <c:if test="${requestScope.javaBeanParameter.attack_event_code != null

          && requestScope.javaBeanParameter.attack_event_code != ''”}>

          ???????? javaBeanParameter not empty

          </c:if>

          EL 表達式利用操作符來完成判斷動作,然后通過 <c:if> 標簽來根據(jù)判斷結(jié)果處理對應工作。

          q???????? 比較結(jié)果: EL 表達式的操作符對判斷的貢獻很大, EL 表達式的靈活性是 Struts 判斷標簽無法比擬的,任何判斷標簽都可以通過表達式來實現(xiàn)。 <c:if> 標簽還可以將判斷的結(jié)果保存為一個變量,隨時為之后的頁面處理服務(wù)。

          反觀 Struts 框架的判斷標簽,在工作之前必須先定義被判斷的變量,而判斷后又無法保存判斷結(jié)果,這樣的程序設(shè)計遠不如 EL 表達式和 <c:if> 標簽的協(xié)作來得強大。因此使用 EL 表達式和 <c:if> 標簽來替換判斷標簽是更好的選擇。

          2. <logic:iterate> 標簽被 <c:forEach> 標簽和 EL 表達式替換

          q???????? 原形: <logic:iterate> 標簽用來對集合對象的迭代,可以依次從該集合中取得所需要的對象。

          q???????? 替換方案:利用 <c:forEach> 標簽和 EL 表達式的協(xié)作替換 <logic:iterate> 標簽。

          q???????? 示例比較

          <logic:iterate> 標簽的動作:

          <logic:iterate name="allAttackSolution"

          ???? id="attackSolution"

          ???? type="struts.sample.cap1.sample3.entity.AttackSolution">

          ???????? <bean:write property="attack_event_code" name="attackSolution"/>

          ???????? <bean:write property="attack_mean" name="attackSolution"/>

          ???????? <bean:write property="attack_action" name="attackSolution"/>

          </logic:iterate>

          <c:forEach> 標簽 EL 表達式協(xié)作的動作:

          <c:forEach items="${requestScope.allAttackSolution}" var="attackSolution">

          ???????? ${attackSolution.attack_event_code}

          ???????? ${attackSolution.attack_mean}

          ???????? ${attackSolution.attack_action}

          </c:forEach>

          兩個動作都做的是同一件事,從 request 中得到保存的“ allAttackSolution ”參數(shù),該參數(shù)為一個集合,集合中的對象為 struts.sample.cap1.sample3.entity.AttackSolution 類型的實例。

          <logic:iterate> 標簽本身可以接收集合,保存為一個變量,利用迭代子模式,使 <logic:iterate> 標簽體中的 <bean:write> 標簽將集合中的每個 JavaBean 顯示出來。

          提示:在本例中由于要顯示 JavaBean 中的變量屬性,因此 <bean:write> 標簽還需要設(shè)置 property 屬性。

          替換工作的 <c:forEach> 標簽則相對要方便些, items 屬性使用 EL 表達式取得集合,然后設(shè)置 var 屬性作為集合中對象的變量,最后使用 EL 表達式來顯示數(shù)據(jù)。

          q???????? 比較結(jié)果:

          值得注意的一個地方是, <logic:iterate> 標簽必須為集合中的對象指定類型,因為標簽庫處理時會將集合中的對象作為 Object 類型得到,然后需要讀取 type 屬性定義的 Java 類為它強制轉(zhuǎn)型。

          <c:forEach> 標簽則完全不用,只要符合標準 JavaBean (為變量屬性提供 get set 方法)的對象都可以通過 EL 表達式來從 var 屬性定義的變量中取得該 JavaBean 的變量屬性。

          因此 <c:forEach> 標簽和 EL 表達式的方式更加簡單,也更加靈活。

          當然,熟悉 <logic:iterate> 標的程序設(shè)計者也可以將 <bean:write> 標簽替換為 EL 表達式而仍然使用 <logic:iterate> 標簽。代碼可以是這樣:

          <logic:iterate name="allAttackSolution"

          id="attackSolution"

          type="struts.sample.cap1.sample3.entity.AttackSolution">

          ???????? ${attackSolution.attack_event_code}

          ???????? ${attackSolution.attack_mean}

          ???????? ${attackSolution.attack_action}

          </logic:iterate>

          結(jié)果一樣,但這種方式比 <bean:write> 標簽顯示方式靈活多了。

          3. <logic:redirect> 標簽被 <c:redirect> <c:param> 標簽替換

          q???????? 原形 <logic:redirect> 標簽用來轉(zhuǎn)發(fā)到一個頁面,并可以為轉(zhuǎn)發(fā)傳遞參數(shù)。

          q???????? 替換方案:利用 <c:redirect> <c:param> 標簽的協(xié)作替換 <logic:redirect> 標簽。

          q???????? 示例比較: <logic:iterate> 標簽的動作:

          <%

          ???????? HashMap paramMap = new HashMap();

          ???????? paramMap.put("userName", "RW");

          ???????? paramMap.put("passWord", "123456");

          %>

          ?<logic:redirect page="/MyHtml.jsp" name="paramMap" scope="request" />

          <c:redirect> <c:param> 標簽協(xié)作的動作:

          <c:redirect url="/MyHtml.jsp">

          ???????? <c:param name="userName" value="RW"/>

          ???????? <c:param name="passWord" value="123456"/>

          </c:redirect>

          兩個動作都做的是同一件事,都將轉(zhuǎn)發(fā)到當前 Web Context 下的“ MyHtml.jsp ”去,而且都將為它提供兩個參數(shù)。最后的轉(zhuǎn)發(fā)鏈接看起來應該如下所示:

          http://localhost:8080/test/ MyHtml.jsp? userName=RW&password=123456

          q???????? 比較結(jié)果

          一眼就可以看出, <logic:redirect> 標簽的可讀性不強,它的 name 屬性表示的是一個 Map 類型的變量。如果還有 property 屬性,則 name 屬性指的是一個標準 JavaBean property 屬性指的是 JavaBean 中的一個 Map 類型的變量屬性,通過 Map 的“名值對”來為轉(zhuǎn)發(fā)頁面?zhèn)鬟f參數(shù)。如果轉(zhuǎn)發(fā)參數(shù)是來自于一個 Map JavaBean 中的 Map 類型變量屬性,那還好,因為可以在 Java 類中處理。可是如果純粹是從頁面上取得某些值作為轉(zhuǎn)發(fā)參數(shù),那就困難了,必須像本示例所給出的那樣,自行定義一個 Map 實例 。這種情況下,頁面就會看到 Java 語言的片段,既麻煩又不符合標準。

          而使用 <c:redirect> <c:param> 標簽協(xié)作,由于包含在 <c:redirect> 標簽體內(nèi)的 <c:param> 標簽可以有多個,因此顯式地提供 <c:param> 標簽就完成了給出轉(zhuǎn)發(fā)參數(shù)的工作,即使用到 JavaBean ,也可以使用 EL 表達式來實現(xiàn)。

          綜上所述,利用 <c:redirect> <c:param> 標簽來代替 <logic:redirect> 標簽是有必要的。



          posted on 2007-01-08 15:26 java_蟈蟈 閱讀(669) 評論(0)  編輯  收藏 所屬分類: STRUTS
          主站蜘蛛池模板: 乐清市| 泌阳县| 上高县| 定西市| 社旗县| 秀山| 抚松县| 枣阳市| 桐柏县| 宜阳县| 阿巴嘎旗| 时尚| 临颍县| 清水河县| 通州区| 开封市| 顺昌县| 昆明市| 宁都县| 尖扎县| 大安市| 寿宁县| 珲春市| 谷城县| 仙桃市| 宝兴县| 阿图什市| 齐齐哈尔市| 福安市| 金川县| 嘉黎县| 东乌| 吴旗县| 湄潭县| 富蕴县| 河池市| 韶关市| 延寿县| 丹寨县| 邵东县| 明水县|