隨筆-8  評論-7  文章-0  trackbacks-0

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

          web.xml:
            <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標簽顯示每個信息.例如:
          <html:messages message="true" id="msg">
              <c:out value="${msg}"/><br />
          </html:messages>

          3. 具體的一個例子:
          接受輸入頁面input.jsp:

            <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:
            <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:

          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:

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

           

          posted on 2008-05-04 15:00 神未必這么寫 閱讀(2494) 評論(2)  編輯  收藏 所屬分類: think in struts

          評論:
          # re: actionMessages(),actionError()介紹 2008-05-04 15:23 | 天堂一定是圖書館的樣子
          logic:messagesPresent標簽用于以下情況:

          在request作用域中存在一個ActionMessages對象,標簽的property屬性和ActionMessages中的property對應。
          在request作用域中存在一個ActionErrors對象,標簽的property屬性和ActionErrors中的property對應。
          存在一個String對象,將其轉換(構造)成ActionMessage然后在添加到ActionMessages中。
          存在一個String Array對象,將數組中的每一個String轉換成一個ActionMessage,在將其添加到ActionMessages中。
          標簽的message屬性值為true時將以Globals.MESSAGE_KEY為key在request作用域中查找Message,其它情況下,將name的值作為key查找,如果name 沒有出現,默認值為Globals.ERROR_KEY。

          下面的代碼示例了logic:messagesPresent標簽的典型用法:

          <logic:messagesPresent>
          <ul>
          <html:messages id="message">
          <li><bean:write name="message"/></li>
          </html:messages>
          </ul>
          </logic:messagesPresent>

          標簽logic:messagesNotPresent的應用正好和logic:messagesPresent的應用相反。

          回頁首
            回復  更多評論
            
          # re: actionMessages(),actionError()介紹 2008-05-04 15:26 | 天堂一定是圖書館的樣子
          Struts框架中,網頁的錯誤標簽都是由<html:errors/>標簽實現和負責的。
          <html:errors/>標簽在request和session的范圍內尋找ActionMessages(或者其子類ActionErrors)集合對象,再從ActionMessages集合對象中讀取ActionMessage對象,把ActionMessage對象包含的消息文本顯示到網頁上。

          <html:errors/>標簽還有很多屬性,諸如name,propertity,bundle等;
          在向ActionMessages 或者ActionErrors對象中添加子對象(ActionMessage,ActionError)使用的方法是:
          ActionMessages.add(java.lang.String property,ActionMessage message);
          而<html:errors/>標簽在讀ActionMessages或者ActionErrors對象時,使用name屬性幫助用戶顯示和String property 相匹配的信息。
          如果<html:errors/>標簽沒有規定name屬性,那么顯示的將是默認的 Globals.ERROR_KEY對應的消息。


          這個是我學習的一點心得,樓主見笑。
          o saveErrors(request,errors)的意思呢,是將你的errors集合對象存放到request的范圍內,以便你在jsp頁面中的<html:errors/>讀取和顯示。  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宁南县| 兰西县| 陇南市| 吉林省| 环江| 古丈县| 曲阳县| 万州区| 建平县| 成武县| 奉新县| 资溪县| 福建省| 黄平县| 弥渡县| 靖西县| 宜阳县| 紫云| 平昌县| 乐安县| 邮箱| 盐亭县| 高平市| 阿巴嘎旗| 呼和浩特市| 百色市| 绥滨县| 梁平县| 新竹市| 潜山县| 儋州市| 万山特区| 白山市| 泸州市| 安康市| 吴堡县| 河池市| 道孚县| 永川市| 岳池县| 瑞丽市|