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>
標簽是有必要的。