深入探討struts的ActionMessages消息機制

    在介紹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的朋友們有所幫助. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章