在介紹ActionMessages前,我以爲有必要先介紹一下ActionMessages的數據結構.理解了其數據結構有助於理解相關的各類操做.
ActionMessages以一個HashMap存儲ActionMessage.Map中的key是一個標識,其對應的value是一個List對象,全部的ActionMessage存儲在List中.也就是說key標識了一組ActionMessage.
先介紹涉及到的類中的幾個經常使用方法,而後給出幾個示例代碼,幫助理解.
- ActionMessage
- ActionMessage(String key)
該方法接受一個字符串,字符串是在資源文件種配置的key值,必須在配置文件中進行相關配置.
- ActionMessage(String key,Object value)
ActionMessage(String key,Object value0,Object value1)
ActionMessage(String key,Object value0,Object value1,Object value2)
ActionMessage(String key,Object value0,Object value1,Object value2,Object value3)
上面4個方法第一個參數一樣是資源文件中配置的key值,一樣必須在配置文件中進行相關配置.後面的參數爲資源文件中key所對應的信息中須要的參數
- ActionMessage(String key,Object[] values)
這種方法第一個參數同上,第二個參數接受一個Object數組,其中保存key在資源文件中對應信息須要的參數.
- ActionMessages
- ActionMessages.add(String property,ActionMessage message)
第一個參數property對應於<html:messages>標籤中的property屬性,具體使用方法在後面介紹. property的值通常採用ActionMessages類中的靜態常量ActionMessages.GLOBAL_MESSAGE,也能夠本身定義一個key.該方法執行時,先判斷ActionMessages中有沒有該key,若是沒有就新添加對key-List鍵值對;若是有一樣的key,就先獲取該key對應的Value並轉換爲List對象,而後將(ActionMessage)message添加進List對象中.
- ActionMessages.add(ActionMessages ams)
該方法將參數中保存的ActionMessage合併到調用ActionMessages中.
- Action及其全部子類
- addMessages(HttpServletRequest request,ActionMessages messages)
該方法首先檢查request對象中是否有ActionMessages對象,若是有對象,則將接收的ActionMessages合併到request中,若是沒有,用setAttribute(Globals.MESSAGE_KEY,messages)方法將messages添加進去.若是一個Action中須要顯示多條錯誤信息,推薦使用該方法.(Globals.MESSAGE_KEY = "org.apache.struts.action.ACTION_MESSAGE")
- saveMessages(HttpServletRequest request,ActionMessages messages)
該方法保存messages時,若是request中已經有一個ActionMessages對象,則用新的覆蓋原有的.不推薦使用該方法,該方法容易發生丟失信息的狀況.
- addErrors()和saveErrors()
這兩個方法與addMessages()和saveMessages()類似,不過在HttpServletRequest.setAttribute()時的參數不同,這兩個方法是:setAttribute(Globals.ERROR_KEY,messages)添加的.(Globals.ERROR_KEY = "org.apache.struts.action.ERROR")
在request中添加的ActionMessages在頁面顯示時,用<html:messages>標籤進行顯示,下面介紹一下該標籤和常常配套使用的<logic:messagePresent>標籤.
<html:messages>
id |
必須指定id屬性.<html:messages>標籤做用是遍歷ActionMessages對象中的全部 ActionMessage.相似<logic:iterator>,每次循環都定義一個名稱爲id指定的頁面範圍的bean,而後用 <bean:write>標籤進行輸出.
|
bundle |
綁定一個MessageResources,不指定的時候從上下文中配置的資源中檢索.通常不指定bundle屬性. |
locale |
指定本地化信息,不指定時和Session的本地化信息相同,通常不用指定. |
name |
指定ActionMessages對象在request中的key.不指定時,默認用 GLOBALS.ERROR_KEY="org.apache.struts.action.ERROR",用Action.addMessages()方法添加的信息將不 被顯示,用Action.addErrors()方法添加的信息纔會被顯示.通常不指定. |
property |
指定哪些ActionMessage將被顯示,與ActionMessages.addMessage(String property,ActionMessage am)中的property參數相對應.不指定的時候顯示全部信息. |
header |
指定一個資源信息key,在顯示ActionMessages前打印到頁面上,可選. |
footer |
指定一個資源信息key,在顯示完ActionMessages後打印到頁面上,可選. |
message |
取值爲true/false,默認爲false.爲false或不指定時,在request中查找key=Globals.ERROR_KEY的ActionMessages bean.當該屬性設置爲true時,在request中查找key=Globals.MESSAGE_KEY的ActionMessages bean,同時name屬性的值將被忽略. |
<logic:messagesPresent>和<logic:messagesNotPresent>標籤,只支持message,name,property3個屬性,做用和<html:messages>相同,就再也不介紹
下面給出一段代碼,幫助你們理解,這裏只寫了關鍵代碼.
1. Action 類中的部分代碼:
ActionMessages ams =
new ActionMessages();
ams.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage(
"addMessages : global message",
false));
ams.add(
"error",
new ActionMessage(
"addMessages : error message",
false));
ams.add(
"info",
new ActionMessage(
"addMessages : info message",
false));
this.addMessages(httpServletRequest,ams);
ActionMessages errorMessage =
new ActionMessages();
errorMessages.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage(
"addErrors : global message",
false));
errorMessages.add(
"error",
new ActionMessage(
"addErrors : error message",
false));
errorMessages.add(
"info",
new ActionMessage(
"addErrors : info message",
false));
this.addErrors(httpServletRequest,errorMessages);
2. JSP文件中的部分代碼:
<
html:messages
id
="message"
>
<
bean:write
name
="message"
/>
<
br
/>
</html:messages>
<!-- 上面代碼的輸出結果:
addErrors : global message
addErrors : error message
addErrors : info message
-->
<
html:messages
id
="message"
property
="info"
>
<
bean:write
name
="message"
/>
<br />
</html:messages>
<!-- 這段代碼的輸出結果爲:
addErrors : info message
-->
<
html:messages
id
="message"
message
="true"
>
<
bean:write
name
="message"
/>
<br />
</html:messages>
<!-- 這段代碼的輸出結果:
addMessages : global message
addMessages : error message
addMessages : info message
-->
<
html:messages
id
="message"
message
="true"
property
="info"
>
<
bean:write
name
="message"
/>
<br />
</html:messages>
<!-- 這段代碼的輸出結果爲:
addMessages : info message
-->
若是結合上<logic:messagesPresent>標籤,將能夠作出自由度很高的錯誤信息顯示效果,具體如何表現這裏就不在細說了.<logic:messagePresent>的使用方法你們本身體會,我相信你們掌握了<html:messages>,必定能駕馭<logic:messagesPresent>
對struts的ActionMessages的討論就到這裏,但願這篇文章能對廣大剛接觸struts的朋友們有所幫助.