<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的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_蟈蟈 閱讀(669) 評論(0)  編輯  收藏 所屬分類: STRUTS
    主站蜘蛛池模板: 中文字幕a∨在线乱码免费看| 免费成人福利视频| 亚洲视频2020| 免费观看理论片毛片| 中文字幕a∨在线乱码免费看 | 亚洲V无码一区二区三区四区观看| 91精品国产免费入口| 亚洲精品无码久久久久久| 国产偷国产偷亚洲清高动态图 | 亚洲精品天堂在线观看| 免费在线观看日韩| 午夜精品免费在线观看| 亚洲高清一区二区三区电影| 国产亚洲精品精华液| 成年性生交大片免费看| 免费观看成人久久网免费观看| 亚洲日韩AV无码一区二区三区人| 亚洲精品卡2卡3卡4卡5卡区| 久久久久久精品免费看SSS| 人人爽人人爽人人片av免费| 亚洲人配人种jizz| 亚洲色精品vr一区二区三区| 日韩免费视频观看| 久久久久久国产精品免费无码| 无人视频在线观看免费播放影院 | 亚洲激情在线观看| 亚洲精品国产高清嫩草影院| 国产曰批免费视频播放免费s | 国产一级特黄高清免费大片| 亚洲免费视频观看| 日韩精品无码免费专区网站| 亚洲av无码专区在线电影天堂| 亚洲蜜芽在线精品一区| 亚洲永久无码3D动漫一区| 日本无卡码免费一区二区三区| 91久久青青草原线免费| 成全视频高清免费观看电视剧 | 两个人www免费高清视频| 亚洲AV综合色区无码一二三区| 亚洲日韩国产精品无码av| 亚洲香蕉成人AV网站在线观看|