分類:我的著作
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)簽
標(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)簽來(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)簽是有必要的。
Struts
聯(lián)系客服