我的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 類中處理。可是如果純粹是從頁面上取得某些值作為轉發參數,那就困難了,必須像本示例所給出的那樣,自行定義一個 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_蟈蟈 閱讀(674) 評論(0)  編輯  收藏 所屬分類: STRUTS
          主站蜘蛛池模板: 凌海市| 犍为县| 江西省| 曲周县| 安化县| 峡江县| 龙泉市| 内乡县| 保亭| 襄樊市| 湘西| 宜丰县| 屏山县| 东辽县| 通辽市| 迁西县| 江孜县| 邯郸市| 马尔康县| 贵南县| 成安县| 兴仁县| 苍南县| 东光县| 东丽区| 恩施市| 象山县| 万源市| 青州市| 北辰区| 丰县| 荣昌县| 巴马| 漠河县| 广水市| 哈密市| 双江| 石嘴山市| 池州市| 灌南县| 南皮县|