1. 程式人生 > >Struts學習之ActionError,ActionMessage介紹

Struts學習之ActionError,ActionMessage介紹


       儘管Struts框架提供了有效的異常處理機制,但不能保證處理所有的錯誤,這時Struts框架會把錯誤拋給Web容器,在預設情況下Web容器會向用戶瀏覽器直接返回原始資訊。如果想避免直接讓使用者看到這些原始資訊,可以在web.xml中配置<error-page>元素,以下程式碼演示瞭如何避免使用者看到HTTP 404、HTTP 500錯誤和Exception異常。 

web.xml 
Java程式碼  
<error-page>  
    <error-code>404</error-code>  
    <location>/exception/error404.jsp</location>  
  </error-page>  
  <error-page>  
    <error-code>500</error-code>  
    <location>/exception/error500.jsp</location>  
  </error-page>  
  <error-page>  
    <exception-type>java.lang.Exception</exception-type>  
    <location>/exception/default.jsp</location>  
  </error-page>  


當WEB容器捕獲到exception-type或error-code指定的錯誤時將跳到由location指定的頁面。 

問題:當form bean 為動態bean時,在action中無法對form bean資料進行驗證,因為formbean沒有具體實現類。action中無法引用 ActionError/ActionErrors/ActionMessage/ActionMessages: 
有時候你需要向用戶提供相關處理資訊,包括表單驗證時發現錯誤等。 
1. 相關類介紹: 
ActionMessage:用於儲存一個與資源束對應的提示資訊。主要建構函式如: 
ActionMessage(String message); 
ActionMessage(String message,paramater)。 

ActionMessages:用於儲存多個ActionMessage。並在html:errors 和html:messages中起作用。 
主要建構函式: 
ActionMessages(). 
主要方法是add(String property,ActionMessage message) 
ActionMessages 有一個HashMap型別messages儲存多個ActionMessage物件,每個ActionMessage物件都有唯一的一個property 標識。這個property可以是自定義的任意字串,也可以由 org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE指定 
html:messages/html:errors使用property屬性訪問某個資源 

ActionErrors:用於儲存一個與資源束對應的錯誤資訊。用法跟ActionMessages差不多。 
ActionError不贊成使用。 


2. 版本: 
struts1.1中用ActionErrors報告錯誤,用ActionMessages提供資訊。 
在struts1.2中使用ActionMessages提供資訊和錯誤,不贊成使用ActionError 
struts1.3中已經沒有ActionError類了。 

3. AtionErrors和ActionMessages的區別 

1. ActionErrors是ActionMessages的一個子類,功能幾乎相同,不同點在於標籤<html:errors/>和<html:messages>的使用上的區別。 
html: errors指定了footer和header屬性。預設值為errors.header和errors.footer,需要時可以自己指定。如果資源屬性檔案配置了 errors.header和errors.footer,則任何時候使用html:errors時開頭和結尾都是這兩個屬性對應的資源資訊。 
而html:message預設情況下沒有errors.header和errors.footer值,當然可以自己指定。 

2. html:errors可以根據property屬性指定顯示一個錯誤資訊。html:messages有一個必添項id。html:messages不能直接顯示資訊,它將選出的資訊放入一個用id標識的Iterator物件裡,然後在用ben:write或JSTL c:out標籤顯示每個資訊.例如: 
Java程式碼  
<html:messages message="true" id="msg">  
    <c:out value="${msg}"/><br />  
</html:messages>  


3. 具體的一個例子: 
接受輸入頁面input.jsp: 
Java程式碼  
<html:form action="/errormessage/input">  
    phoneNumber : <html:text property="phoneNumber"/> <html:errors     property="<%=org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>"/><br/>  
  <html:submit/><html:cancel/>  
  </html:form>  


struts-config.xml: 
Java程式碼  
<form-beans >  
    <form-bean name="inputForm" type="cn.rolia.struts.form.errorexception.InputForm" />  
  </form-beans>  
  <action-mappings >  
    <action  
      attribute="inputForm"  
      input="/errormessage/input.jsp"  
      name="inputForm"  
      path="/errormessage/input"  
      scope="request"  
      type="com.yourcompany.struts.action.errormessage.InputAction"  
      validate="false">  
      <forward name="success" path="/errormessage/success.jsp" />  
    </action>  
  </action-mappings>  


InputAction.java: 
Java程式碼  
public ActionForward execute(ActionMapping mapping, ActionForm form,  
    HttpServletRequest request, HttpServletResponse response) {  
  cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub  
  String phoneNumber = inputForm.getPhoneNumber();  
  if(phoneNumber.length()<4){  
  ActionErrors messages = new ActionErrors();  
    messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));  
    this.saveErrors(request, messages);  
    return mapping.getInputForward();  
  }  
  
  return mapping.findForward("success");  
}  


解說:使用者輸入手機號碼,頁面跳轉到InputAction控制層進行處理,若輸入資料小於4,則建立一個ActionMessage類儲存相關錯誤資訊。然後再建立ActionErrors類將此ActionMessage放入ActionErrors。再呼叫Action的saveErrors方法將此ActionErrors儲存的request範圍裡,然後返回input.jsp頁面要求重新輸入並用html:errors提示錯誤資訊。 

4. Action包含saveErrors()方法和saveMessages()方法。如果建立的ActionErrors則應該呼叫saveErrors(),若建立的是ActionMessages則應該呼叫saveMessages()方法。 
saveErrors ()接收ActionMessages而不是ActionErrors;同時將其儲存在request中並用一個由 org.apache.struts.Globals.ERROR_KEY指定的常量” org.apache.struts.Globals.ERROR_KEY”標識這個ActionMessages,便於html:errors查詢。 saveMessages()方法接收ActionMessages同時將其儲存在request中並用一個由 org.apache.struts.Globals.MESSAGE_KEY指定的常量” org.apache.struts.Globals.MESSAGE_KEY”標識這個ActionMessages,進而讓html: messages從常量Globals.ERROR_KEY中遍歷獲取資訊。可以將其屬性message設定為true,那麼它將從常量 Globals.MESSAGE_KEY中遍歷獲取資訊。 

5. 預設情況下html:messages從 
如果你想將資訊儲存在session裡而不是request,struts1.2提供了 
struts1.1 沒有的saveMessages(HttpSession session, ActionMessages messages)方法和saveErrors(javax.servlet.http.HttpSession session, ActionMessages errors)方法。 

InputAction.java: 
Java程式碼  
public ActionForward execute(ActionMapping mapping, ActionForm form,  
    HttpServletRequest request, HttpServletResponse response) {  
cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub  
  String phoneNumber = inputForm.getPhoneNumber();  
  if(phoneNumber.length()<4){  
    ActionErrors messages = new ActionErrors();  
    messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));  
    this.saveErrors(request.getSession(true), messages);  
    return mapping.getInputForward();  
  }  
  
  return mapping.findForward("success");