JSTL與Struts的結(jié)合(十)分類:我的著作 9.8.3 JSTL VS Struts Logic標(biāo)簽庫(kù)
Struts Logic標(biāo)簽庫(kù)中的標(biāo)簽在頁(yè)面顯示時(shí)是時(shí)常被用到的,但是常用的卻不一定是最好用的,有了JSTL標(biāo)簽庫(kù)和EL表達(dá)式后,許多Struts Logic標(biāo)簽庫(kù)的標(biāo)簽可以被簡(jiǎn)單替換。 1. 所有判斷標(biāo)簽被EL表達(dá)式和<c:if>標(biāo)簽替換 q 原形:判斷標(biāo)簽有一個(gè)特點(diǎn),就是需要取得一個(gè)實(shí)例的變量,因此通過(guò)<bean:define>標(biāo)簽來(lái)取得實(shí)例的變量是必須的,隨后就通過(guò)各種判斷標(biāo)簽來(lái)完成判斷的工作。常用的判斷標(biāo)簽如表9.30所示: 表9.30 常用判斷標(biāo)簽
q 替換方案:利用EL表達(dá)式和<c:if>標(biāo)簽來(lái)替換。 q 示例比較:判斷標(biāo)簽的動(dòng)作: <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)簽的動(dòng)作: <c:if test="${requestScope.javaBeanParameter.attack_event_code != null && requestScope.javaBeanParameter.attack_event_code != ‘‘”}> javaBeanParameter not empty </c:if> EL表達(dá)式利用操作符來(lái)完成判斷動(dòng)作,然后通過(guò)<c:if>標(biāo)簽來(lái)根據(jù)判斷結(jié)果處理對(duì)應(yīng)工作。 q 比較結(jié)果:EL表達(dá)式的 反觀Struts框架的判斷標(biāo)簽,在工作之前必須先定義被判斷的變量,而判斷后又無(wú)法保存判斷結(jié)果,這樣的程序設(shè)計(jì)遠(yuǎn)不如EL表達(dá)式和<c:if>標(biāo)簽的協(xié)作來(lái)得強(qiáng)大。因此使用EL表達(dá)式和<c:if>標(biāo)簽來(lái)替換判斷標(biāo)簽是更好的選擇。 2. <logic:iterate>標(biāo)簽被<c:forEach>標(biāo)簽和EL表達(dá)式替換 q 原形:<logic:iterate>標(biāo)簽用來(lái)對(duì)集合對(duì)象的迭代,可以依次從該集合中取得所需要的對(duì)象。 q 替換方案:利用<c:forEach>標(biāo)簽和EL表達(dá)式的協(xié)作替換<logic:iterate>標(biāo)簽。 q 示例比較 <logic:iterate>標(biāo)簽的動(dòng)作: <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é)作的動(dòng)作: <c:forEach items="${requestScope.allAttackSolution}" var="attackSolution"> ${attackSolution.attack_event_code} ${attackSolution.attack_mean} ${attackSolution.attack_action} </c:forEach> 兩個(gè)動(dòng)作都做的是同一件事,從request中得到保存的“allAttackSolution”參數(shù),該參數(shù)為一個(gè)集合,集合中的對(duì)象為struts.sample.cap1.sample3.entity.AttackSolution類型的實(shí)例。 <logic:iterate>標(biāo)簽本身可以接收集合,保存為一個(gè)變量,利用迭代子模式,使<logic:iterate>標(biāo)簽體中的<bean:write>標(biāo)簽將集合中的每個(gè)JavaBean顯示出來(lái)。 提示:在本例中由于要顯示JavaBean中的變量屬性,因此<bean:write>標(biāo)簽還需要設(shè)置property屬性。 替換工作的<c:forEach>標(biāo)簽則相對(duì)要方便些,items屬性使用EL表達(dá)式取得集合,然后設(shè)置var屬性作為集合中對(duì)象的變量,最后使用EL表達(dá)式來(lái)顯示數(shù)據(jù)。 q 比較結(jié)果: 值得注意的一個(gè)地方是,<logic:iterate>標(biāo)簽必須為集合中的對(duì)象指定類型,因?yàn)闃?biāo)簽庫(kù)處理時(shí)會(huì)將集合中的對(duì)象作為Object類型得到,然后需要讀取type屬性定義的Java類為它強(qiáng)制轉(zhuǎn)型。 而<c:forEach>標(biāo)簽則完全不用,只要符合標(biāo)準(zhǔn)JavaBean(為變量屬性提供get、set方法)的對(duì)象都可以通過(guò)EL表達(dá)式來(lái)從var屬性定義的變量中取得該JavaBean的變量屬性。 因此<c:forEach>標(biāo)簽和EL表達(dá)式的方式更加簡(jiǎn)單,也更加靈活。 當(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 q 替換方案:利用<c:redirect>和<c:param>標(biāo)簽的協(xié)作替換<logic:redirect>標(biāo)簽。 q 示例比較:<logic:iterate>標(biāo)簽的動(dòng)作: <% 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é)作的動(dòng)作: <c:redirect url="/MyHtml.jsp"> <c:param name="userName" value="RW"/> <c:param name="passWord" value="123456"/> </c:redirect> 兩個(gè)動(dòng)作都做的是同一件事,都將轉(zhuǎn)發(fā)到當(dāng)前Web Context下的“MyHtml.jsp”去,而且都將為它提供兩個(gè)參數(shù)。最后的轉(zhuǎn)發(fā)鏈接看起來(lái)應(yīng)該如下所示: http://localhost:8080/test/ MyHtml.jsp? userName=RW&password=123456 q 比較結(jié)果 一眼就可以看出,<logic:redirect>標(biāo)簽的 而使用<c:redirect>和<c:param>標(biāo)簽協(xié)作,由于包含在<c:redirect>標(biāo)簽體內(nèi)的<c:param>標(biāo)簽可以有多個(gè),因此顯式地提供<c:param>標(biāo)簽就完成了給出轉(zhuǎn)發(fā)參數(shù)的工作,即使用到JavaBean,也可以使用EL表達(dá)式來(lái)實(shí)現(xiàn)。 綜上所述,利用<c:redirect>和<c:param>標(biāo)簽來(lái)代替<logic:redirect>標(biāo)簽是有必要的。 9.8.4 總結(jié)
Struts |
|
來(lái)自: WindySky > 《標(biāo)簽》