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标簽的典型用法:
eg1. 檢查在request範圍内的name屬性是否包含"hello"串:<logic:present header="User-Agent"> <logic:match header="User-Agent" value="MSIE 6.0"> MS IE 6.0 </logic:match> </logic:present>
eg2. 檢查在request範圍内的name屬性是否已“hello”作為起始字元串:<logic:match name="name" scope="request" value="hello"> <bean:write name="name"/>中有一個“hello”串。 </logic:match>
eg3.<logic:match name="name" scope="request" value="hello"location="start"> <bean:write name="name"/>以“hello”作為起始字元串。 </logic:match>
<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,輸出對應字元串:
eg3.<logic:present name="hello" > 有一個名字為“hello”的JavaBean。 </logic:present>
<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)中使用者的姓名:
eg2. 從使用者清單中輸出從1開始的兩個使用者的姓名<logic:iterate id="emp" name="empList"> <bean:write name="emp"property="name"/><br> </logic:iterate>
eg3.logic:iterator标簽的嵌套舉例<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>
<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标簽。