天天看點

Struts 1 之<logic>标簽庫

1. logic:empty

logic:empty标簽是用來判斷是否為空的。如果為空,該标簽體中嵌入的内容就會被處理。該标簽用于以下情況:

當Java對象為null時

當String對象為""時

當java.util.Collection對象中的isEmpty()傳回true時

當java.util.Map對象中的isEmpty()傳回true時

下面的代碼示例了logic:empty标簽判斷集合persons是否為空:

<logic:empty name="listForm" property = "persons">
<div>集合persons為空!</div>     
</logic:empty>  
           

2. logic:notEmpty

該标簽的應用正好和logic:empty标簽相反。

3. logic:equal

該标簽為等于比較符。

eg1. 比較使用者的狀态屬性是否1,若為1,輸出"啟用";

eg2. 如果上例中的value值是動态獲得的,例如需要通過bean:write輸出,因struts不支援标簽嵌套,可采用EL來解決該問題。

logic:equal

這裡要介紹的不隻是logic:equal(=)标簽,而是要介紹一類标簽,這類标簽完成比較運算,包括:

logic:equal(=)

logic:notEqual(!=)

logic:greaterEqual(>=)

logic:lessEqual(<=)

logic:graterThan(>)

logic:lessThan(<)

該類标簽的用法類似,我們隻介紹logic:equal标簽,其餘類似。

logic:equal是用來判斷是否相等的。如果相等,該标簽體中嵌入的内容就會被處理。該标簽用于以下情況:

 比較由該标簽的cookie屬性指定的cookie的值是否與該标簽的value屬性值相等。

比較由該标簽的header屬性指定的header的值是否與該标簽的value屬性值相等。

比較由該标簽的name屬性指定的JSP Bean是否與該标簽的value屬性值相等(property屬性不出現)或比較由該标簽的name屬性指定的JSP Bean中的property屬性值是否與該标簽的value屬性值相等。

比較由該标簽的parameter屬性指定的參數值(request中)是否與該标簽的value屬性值相等。

4. logic:notEqual

該标簽意義與logic:equal相反,使用方法類似,略。

5. logic:forward

該标簽用于實作頁面導向,查找配置檔案的全局forward。struts-config.xml檔案中全局轉向
<logic:forward name="redirect"/>
           

6. logic:greaterEqual

為大于等于比較符。

eg. 當某學生的成績大于等于60時,輸出“及格”:

<logic:greaterEqual name="student" property="scores" value="60">
及格
</logic:greaterEqual>
           

7. logic:greaterThan

此為大于比較符,使用方法同logic:greaterEqual;

8. logic:lessEqual

此為小于等于比較符,使用方法同logic:greaterEqual;

9. logic:lessThan

此為小于比較符,使用方法同logic:greaterEqual;

10. logic:match

此标簽比較對象是否相等;

logic:match标簽用來處理子串比對問題。

如果指定的值比對該标簽就會建立其标簽體内的内容。該标簽用于以下情況:

檢查具有指定名稱的cookie是否與該标簽的value比對。

檢查具有指定名稱的header是否與該标簽的value比對。

檢查具有指定名稱的JSP Bean是否與該标簽的value比對 或 檢查具有指定名稱的JSP Bean中的property屬性值是否與該标簽的value比對。

檢查request中指定名稱的參數值是否與該标簽的value比對。

 下面的代碼示例了logic:match标簽的典型用法:

<logic:present header="User-Agent">
        <logic:match header="User-Agent" value="MSIE 6.0">
                 MS IE 6.0
        </logic:match>
</logic:present>
           
eg1. 檢查在request範圍内的name屬性是否包含"hello"串:
<logic:match name="name" scope="request" value="hello">
        <bean:write name="name"/>中有一個“hello”串。
</logic:match>
           
eg2. 檢查在request範圍内的name屬性是否已“hello”作為起始字元串:
<logic:match name="name" scope="request" value="hello"location="start">
        <bean:write name="name"/>以“hello”作為起始字元串。
</logic:match>
           
eg3.
<logic:match header="user-agent" value="Windows">
    你運作的是Windows系統
</logic:match>
           

11. logic:notMatch

logic:notMatch标簽的應用正好和logic:match标簽相反。

此标簽用于比較對象是否不相同,與logic:match意義相反,使用方法類似

12. logic:messagePresent

該标簽用于判斷ActionMessages/ActionErrors對象是否存在;

logic:messagesPresent标簽用于以下情況:

在request作用域中存在一個ActionMessages對象,标簽的property屬性和ActionMessages中的property對應。

在request作用域中存在一個ActionErrors對象,标簽的property屬性和ActionErrors中的property對應。

存在一個String對象,将其轉換(構造)成ActionMessage然後在添加到ActionMessages中。

存在一個String Array對象,将數組中的每一個String轉換成一個ActionMessage,在将其添加到ActionMessages中。

标簽的message屬性值為true時将以Globals.MESSAGE_KEY為key在request作用域中查找Message,其它情況下,将name的值作為key查找,如果name 沒有出現,預設值為Globals.ERROR_KEY。

下面的代碼示例了logic:messagesPresent标簽的典型用法:

eg1.

<logic:messagesPresent>
<ul>
<html:messages id="message">
      <li><bean:writen ame="message"/></li>
</html:messages>
</ul>
</logic:messagesPresent> 
           

eg2.

如果存在error資訊,将其全部輸出:

<logic:messagePresent property="error">
      <html:messages property="error" id="err" >
            <bean:write name="err"/>
      </html:messages>
</logic:messagePresent>
           

13. logic:messagesNotPresent

标簽logic:messagesNotPresent的應用正好和logic:messagesPresent的應用相反。

該标簽用于判斷ActionMessages/ActionErrors對象是否不存在,使用方法與logic:messagePresent類似

14. logic:present

此标簽用于判斷request對象傳遞參數是否存在。

如果指定的值出現該标簽就會建立其标簽體内的内容。該标簽用于以下情況:

檢查具有指定名稱的cookie是否出現。

檢查具有指定名稱的header是否出現。

檢查具有指定名稱的JSP Bean是否出現 或 檢查具有指定名稱的JSP Bean中的property屬性是否出現。

檢查request中指定名稱的參數是否出現。

檢查目前的認證使用者是否與指定的安全角色相關聯。

檢查目前認證的主體是否具有指定的名字。

eg1.

user對象和它的name屬性在request中都存在時,輸出相應字元串:

<logic:present name="user" property="name">
user對象和該對象的name屬性都存在
</logic:present>
           

eg2.

 若有一個名字為“hello”的JavaBean,輸出對應字元串:

<logic:present name="hello" >
有一個名字為“hello”的JavaBean。
</logic:present>
           
eg3.
<logic:present header="user-agent">
we got auser-agent header.
</logic:present>
           

eg4.

下面的代碼示例了logic:present标簽檢查具有指定名稱User-Agent的header是否出現:

<logic:present header="User-Agent">
您的浏覽器是<bean:header id="userAgent" name="User-Agent"/>
    <bean:writen ame="userAgent"/>。<br/>
</logic:present>
           

15. logic:notPresent

此标簽用于判斷request對象傳遞參數是否不存在,意義與了logic:present相反,使用方法類似。

logic:notPresent标簽的應用正好和logic:present标簽相反。

16. logic:iterator

用于顯示清單為collection的值(List,ArrayList,HashMap等)。

logic:iterate标簽用來疊代集合,您可以使用如下方式來為這個标簽指定其要疊代的集合:

使用一個運作時表達式,這個表達式的值是一個集合。

用name屬性引用一個JSPBean,這個JSP Bean本身就是一個集合。

用name屬性引用一個JSPBean,這個JSP Bean的一個屬性是一個集合,這時可以聯合使用property來指定這個集合。

上面所提到的集合可以是:

對象類型或原子類型的數組(Array)。

java.util.Collection的實作,包括ArrayList,Vector。

java.util.Enumeration的實作。

java.util.Iterator的實作。

java.util.Map的實作,包括HashMap,Hashtable和TreeMap。

如果您疊代的集合中含有null的值,這時需要采取一定的措施,因為這時logic:iterate不會在page作用域中建立對象。一般是使用<logic:present>标簽或<logic:notPresent>标簽來判斷一下。

persons清單是在ListAction中填充的,在這裡隻是簡單的加入了三個Person對象,在實際的應用中這些資料應該取自資料庫。具體的代碼如下:

public ActionForward execute(ActionMapping mapping,ActionForm. form,
    HttpServletRequest request,   HttpServletResponse response) {
 
ListForm.listForm. = (ListForm) form;
 
List<Person>persons = new ArrayList<Person>();
 
Person person1 =new Person();
person1.setId("00001");
person1.setName("趙辰");
 
Person person2 =new Person();
person2.setId("00002");
person2.setName("李為芳");
 
Person person3 =new Person();
person3.setId("00003");
person3.setName("王微");
 
persons.add(person1);
persons.add(person2);
persons.add(person3);
 
listForm.setPersons(persons);
 
return mapping.findForward("success");
}
           

标簽輸出的結果為:

00001-->趙辰

00002-->李為芳

00003-->王微

eg1. 逐一輸出使用者清單(empList)中使用者的姓名:

<logic:iterate id="emp" name="empList">
         <bean:write name="emp"property="name"/><br>
</logic:iterate>
           
eg2. 從使用者清單中輸出從1開始的兩個使用者的姓名
<logic:iterate id="emp" name="empList" indexId="index"offset="1" length="2">
        <bean:write name="index"/>.<bean:write name="emp"property="name"/><br>
</logic:iterate>
           
eg3.logic:iterator标簽的嵌套舉例
<logic:iterate id="emp" indexId="index" name="empList">
        <bean:write name="index"/>. <bean:write name="emp"property="name"/><br>
        <logic:iterate id="address" name="emp" property="addressList"length="3" offset="1">
                <bean:write name="address"/><br>
        </logic:iterate>
</logic:iterate>
           

17. logic:redirect

該标簽用于實作頁面轉向,可傳遞參數。

eg.

<logic:redirect href="http://www.javaeye.com" target="_blank" rel="external nofollow" />
           

18. logic:forward和logic:redirect的比較

将forward和redirect這兩個動作放到一起對比着介紹更加有利于了解,基于此原因也就将logic:forward和logic:redirect這兩個标簽也拿到這裡一起介紹了。

讓我們看看這兩個動作的差別:

forward是在servlet内部執行,浏覽器完全不會感覺到這個動作,原始的url也不會改變,浏覽器重新裝載的話也隻是對原始的請求進行簡單的重複。

redirect則分成兩個步驟:第一步是web應用程式告訴浏覽器第二個url,然後浏覽器向第二個url發送請求。

redirect比forward慢,因為浏覽器要做二次請求。還有就是要注意,在第一次的請求作用域(request作用域)内的bean對于第二次請求是不可見的。

了解了上面描述的差別也就知道了什麼時候該選用logic:forward标簽什麼時候該選用logic:redirect标簽了。

logic:forward标簽完成PageContext.forward()或HttpServletResponse.sendRedirect(),如何選擇由控制器決定。logic:redirect标簽完成HttpServletResponse.sendRedirect()。

在使用logic:redirect标簽時我們可以向使用html:link一樣構造baseurl和query參數。如果感興趣可以參考html:link标簽。