我的Blog我做主^_^

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            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> 標簽來根據判斷結果處理對應工作。

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

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

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

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

          q???????? 替換方案:利用 <c:forEach> 標簽和 EL 表達式的協作替換 <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 表達式協作的動作:

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

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

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

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

          </c:forEach>

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

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

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

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

          q???????? 比較結果:

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

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

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

          當然,熟悉 <logic:iterate> 標的程序設計者也可以將 <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>

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

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

          q???????? 原形 <logic:redirect> 標簽用來轉發到一個頁面,并可以為轉發傳遞參數。

          q???????? 替換方案:利用 <c:redirect> <c:param> 標簽的協作替換 <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> 標簽協作的動作:

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

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

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

          </c:redirect>

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

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

          q???????? 比較結果

          一眼就可以看出, <logic:redirect> 標簽的可讀性不強,它的 name 屬性表示的是一個 Map 類型的變量。如果還有 property 屬性,則 name 屬性指的是一個標準 JavaBean 。 property 屬性指的是 JavaBean 中的一個 Map 類型的變量屬性,通過 Map 的“名值對”來為轉發頁面傳遞參數。如果轉發參數是來自于一個 Map JavaBean 中的 Map 類型變量屬性,那還好,因為可以在 Java 類中處理??墒侨绻兇馐菑捻撁嫔先〉媚承┲底鳛檗D發參數,那就困難了,必須像本示例所給出的那樣,自行定義一個 Map 實例 。這種情況下,頁面就會看到 Java 語言的片段,既麻煩又不符合標準。

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

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



          posted on 2007-01-08 15:26 java_蟈蟈 閱讀(669) 評論(0)  編輯  收藏 所屬分類: STRUTS
          主站蜘蛛池模板: 武鸣县| 凤山县| 江城| 乌兰浩特市| 平顺县| 阳西县| 江北区| 铁岭县| 衢州市| 镇巴县| 易门县| 庄浪县| 读书| 天气| 库伦旗| 玉树县| 沂水县| 芜湖县| 大厂| 德格县| 原阳县| 襄垣县| 丹寨县| 海阳市| 固安县| 清水县| 邳州市| 区。| 文安县| 沁阳市| 剑阁县| 云林县| 上虞市| 博罗县| 大宁县| 穆棱市| 珲春市| 南靖县| 清流县| 兴和县| 乳源|