天天看點

ActionMessage 使用

原來都是一直用struts1.1,是以一直以來都用ActionErrors,今天自己做了點東東,想用struts1.2了,但是它又不提倡用ActionErrors,隻能轉為ActionMessage了.就學了點..留下來...僅供以後參考...   1.在建struts時裡面的struts-config.xml裡面需要加入 <message-resources parameter="ApplicationResources" />如果你想用到這個配置檔案讀資料的話...當然可以不用,直接在類裡寫入要輸出的文字也可.ApplicationResources這個檔案放在src目錄下叫ApplicationResources.properties.......在ApplicationResources檔案裡加入一條記錄:errors.user.login=error,error,error!!

  2.在struts的action裡加入

    ActionMessages messages = new ActionMessages();

    messages.add("errorMsg", new ActionMessage("errors.user.login"));

    addMessages(request, messages);

   原先以為和ActionErrors類似是saveMessage這樣的方法的,可是一直嘗試在頁面就是顯示不出我要的資料,在網上查找了一會發現有人用addMessages方法,就拿來試試,結果真的就顯示了...

 3.頁面代碼顯示:

    <html:messages message="true" property="errorMsg">    

        <bean:write />  

    </html:messages>

    有用html:messages标簽來顯示...

    <html:messages>的message屬性如果設定為true,會輸出ActionMessages中所儲存的訊息,Message表示一個提示訊息,也許使用者輸入了不正确的資訊,例如在輸入名稱與密碼時打錯了字,程式要提示使用者他們輸入了不正确的訊息。

    <html:messages>的message屬性如果不設定為true,會輸出ActionErrors中所儲存的訊息,Error代表的是一個操作方面的錯誤,例如錯誤操作導緻使用者名稱或密碼為空(當然也許也是故意的)。

  以上的三步就可以實作ActionMessages的顯示了...

  但是ActionMessages還有一些更好功能,雖然還沒有用到,但是在網上發現了先貼上以後可以用到:

  有人會問,錯誤資訊隻能存放在資源檔案中嗎,其實不是這樣。不需要資源檔案也可以産生錯誤資訊。

  我們再來看一下ActionMessage的另一種構造方法:

  ActionMessage(String key,boolean isresource)

  如果isresource值為true,則表示key是資源檔案中的key,産生的消息就是與key相對應的消息

  如果isresource值為false,則表示key為一條普通的消息。

  如果上面的error.add改為error.add("testerror",new ActonMessage("這是一條自定義消息",false",));那麼頁面上顯示的将是:這是一條自定義消息.

  另外還可以用ActionMessage産生複合消息,比如我們要輸出:xxx不能用作使用者名,其中xxx是一個變量。

  首先我們在資源檔案中加一個條複合消息

  testmsg = {0}不能用作使用者名。這裡{0}是要被替換的參數。

  我們再來看一下ActionMessage的另一中構造方法

  ActionMessage(String key,Object value0);

  也就是說用value0的值來替換{0}

  我們修改error.add為error.add("testerror",new ActonMessage("testmsg",""))

  那麼JSP頁面上将顯示:不能用作使用者名。

  當然在一條複合消息中也可帶多個參數,參數依次為{0},{1},{2}或更多

  例如:loginUser = 使用者名:{0} 姓名:{1} 登入次數:{2}.....

  那麼在産生錯誤消息時就用new ActionMessage(String key,Object value0,Object value1,Object value2.....)或者使用對象數組new ActionMessage(String key,Object[] values)

  String[] detail = {"Admin","王晶","12"};

  error.add("testerror",new ActionMessage("loginUser",detail));

在介紹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屬性的值将被忽略.