我的Blog我做主^_^

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

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

          9.8.3? JSTL VS Struts Logic 標(biāo)簽庫

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

          1. 所有判斷標(biāo)簽被 EL 表達(dá)式和 <c:if> 標(biāo)簽替換

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

          9.30? 常用判斷標(biāo)簽

          標(biāo)簽名

          描述

          empty

          判斷變量是否為空

          notEmpty

          empty 標(biāo)簽正好相反

          equal

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

          notEqual

          equal 標(biāo)簽正好相反

          lessThan

          判斷變量是否比指定的小

          greaterThan

          判斷變量是否比指定的大

          lessEqual

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

          greaterEqual

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

          present

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

          notPresent

          present 標(biāo)簽正好相反

          match

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

          notMatch

          match 標(biāo)簽正好相反

          q???????? 替換方案:利用 EL 表達(dá)式和 <c:if> 標(biāo)簽來替換。

          q???????? 示例比較:判斷標(biāo)簽的動作:

          <bean:define id="javaBeanName"

          name="javaBeanParameter"

          property="attack_event_code"

          scope="request"/>

          <logic:notEmpty name="javaBeanParameter">

          ???????? javaBeanParameter not empty

          </logic:notEmpty>

          EL 表達(dá)式和 <c:if> 標(biāo)簽的動作:

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

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

          ???????? javaBeanParameter not empty

          </c:if>

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

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

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

          2. <logic:iterate> 標(biāo)簽被 <c:forEach> 標(biāo)簽和 EL 表達(dá)式替換

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

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

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

          <logic:iterate> 標(biāo)簽的動作:

          <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> 標(biāo)簽 EL 表達(dá)式協(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 類型的實(shí)例。

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

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

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

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

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

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

          因此 <c:forEach> 標(biāo)簽和 EL 表達(dá)式的方式更加簡單,也更加靈活。

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

          <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> 標(biāo)簽顯示方式靈活多了。

          3. <logic:redirect> 標(biāo)簽被 <c:redirect> <c:param> 標(biāo)簽替換

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

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

          q???????? 示例比較: <logic:iterate> 標(biāo)簽的動作:

          <%

          ???????? 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> 標(biāo)簽協(xié)作的動作:

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

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

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

          </c:redirect>

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

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

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

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

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

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



          posted on 2007-01-08 15:26 java_蟈蟈 閱讀(669) 評論(0)  編輯  收藏 所屬分類: STRUTS
          主站蜘蛛池模板: 滨州市| 聂荣县| 平谷区| 兴业县| 井陉县| 涞水县| 肥西县| 泉州市| 出国| 弥渡县| 卫辉市| 西青区| 金平| 济南市| 沁源县| 利津县| 通河县| 古浪县| 福州市| 万州区| 平遥县| 虞城县| 岚皋县| 长治市| 自治县| 施甸县| 托克逊县| 丰镇市| 津南区| 高平市| 尚义县| 石楼县| 天祝| 扶风县| 绥江县| 宜丰县| 肥西县| 中宁县| 龙海市| 台湾省| 板桥市|