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");
}