`
wgcode
  • 浏览: 599624 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

避免用户看到异常

    博客分类:
  • Java
阅读更多
尽管Struts框架提供了有效的异常处理机制,但不能保证处理所有的错误,这时Struts框架会把错误抛给Web容器,在默认情况下Web容器会向用户浏览器直接返回原始信息。如果想避免直接让用户看到这些原始信息,可以在web.xml中配置<error-page>元素,以下代码演示了如何避免用户看到HTTP 404、HTTP 500错误和Exception异常。

web.xml
Java代码
  1. <error-page>   
  2.     <error-code>404</error-code>   
  3.     <location>/exception/error404.jsp</location>   
  4.   </error-page>   
  5.   <error-page>   
  6.     <error-code>500</error-code>   
  7.     <location>/exception/error500.jsp</location>   
  8.   </error-page>   
  9.   <error-page>   
  10.     <exception-type>java.lang.Exception</exception-type>   
  11.     <location>/exception/default.jsp</location>   
  12.   </error-page>  
<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代码
  1. <html:messages message="true" id="msg">   
  2.     <c:out value="${msg}"/><br />   
  3. </html:messages>  
<html:messages message="true" id="msg">
    <c:out value="${msg}"/><br />
</html:messages>
 


3. 具体的一个例子:
接受输入页面input.jsp:
Java代码
  1. <html:form action="/errormessage/input">   
  2.     phoneNumber : <html:text property="phoneNumber"/> <html:errors     property="<%=org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>"/><br/>   
  3.   <html:submit/><html:cancel/>   
  4.   </html:form>  
<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代码
  1. <form-beans >   
  2.     <form-bean name="inputForm" type="cn.rolia.struts.form.errorexception.InputForm" />   
  3.   </form-beans>   
  4.   <action-mappings >   
  5.     <action   
  6.       attribute="inputForm"  
  7.       input="/errormessage/input.jsp"  
  8.       name="inputForm"  
  9.       path="/errormessage/input"  
  10.       scope="request"  
  11.       type="com.yourcompany.struts.action.errormessage.InputAction"  
  12.       validate="false">   
  13.       <forward name="success" path="/errormessage/success.jsp" />   
  14.     </action>   
  15.   </action-mappings>  
<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代码
  1. public ActionForward execute(ActionMapping mapping, ActionForm form,   
  2.     HttpServletRequest request, HttpServletResponse response) {   
  3.   cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub   
  4.   String phoneNumber = inputForm.getPhoneNumber();   
  5.   if(phoneNumber.length()<4){   
  6.   ActionErrors messages = new ActionErrors();   
  7.     messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));   
  8.     this.saveErrors(request, messages);   
  9.     return mapping.getInputForward();   
  10.   }   
  11.   
  12.   return mapping.findForward("success");   
  13. }  
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代码
  1. public ActionForward execute(ActionMapping mapping, ActionForm form,   
  2.     HttpServletRequest request, HttpServletResponse response) {   
  3. cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub   
  4.   String phoneNumber = inputForm.getPhoneNumber();   
  5.   if(phoneNumber.length()<4){   
  6.     ActionErrors messages = new ActionErrors();   
  7.     messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));   
  8.     this.saveErrors(request.getSession(true), messages);   
  9.     return mapping.getInputForward();   
  10.   }   
  11.   
  12.   return mapping.findForward("success");   
  13. }  
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");
}
 
分享到:
评论

相关推荐

    UncaughtException不让Android应用异常退出

    "UncaughtException不让Android应用异常退出"这个主题,就是关于如何处理程序中的未捕获异常,以防止应用突然崩溃,从而提升用户体验。在这个问题上,我们可以从以下几个方面来探讨: 1. **...

    java异常机制小结

    Java 异常的对象来自两个来源:一是 Java 语言本身定义的一些基本异常类型,二是用户通过继承 Exception 类或者其子类自己定义的异常。异常的对象可以是 Java 运行时环境自动抛出的系统生成的异常,也可以是程序员...

    异常提示弹窗优化

    4. **详细日志记录**:虽然用户看到的是简化后的错误消息,但为了开发者调试,需要在后台记录详细的异常信息,包括异常类型、堆栈跟踪和可能的相关数据。这些信息可以通过日志文件、数据库或者发送到远程服务器进行...

    使用异常处理输入是,输出三边,不是输出异常,还有输入取钱时也会输出的异常的问题

    为了避免这种情况,我们可以使用`try-catch`语句块来捕获可能的异常,并在`catch`块中提供合适的处理逻辑,如提示用户输入无效并重新输入。 其次,异常时的正确输出至关重要。当异常发生时,程序不应仅仅打印出异常...

    基于深度学习的用户异常用电模式检测

    【基于深度学习的用户异常用电模式检测】 在智能电网领域,非技术性损失(Non-Technical Loss, NTL)是一个重大的问题,包括窃电、欺诈等行为,它对电网的稳定运行造成威胁并带来经济损失。传统的降低NTL的方法如...

    J2EE项目中统一异常处理源码

    一个良好的异常处理机制能够提供详细的错误信息,帮助开发者快速定位问题,并且可以在生产环境中优雅地处理异常,防止用户看到不必要的技术细节。"J2EE项目中统一异常处理源码"的实践就是为了解决这些问题,通过...

    VS自定义异常处理窗口

    6. **用户定义的异常**: 如果你的代码中使用了自定义异常类,记得在VS的异常设置中添加它们,这样在抛出这些异常时,VS也能正确地中断并显示相关信息。 7. **异常处理最佳实践**: 在编写代码时,应该遵循良好的异常...

    Android全局异常捕获

    因此,实现Android全局异常捕获是一个必要的技术手段,它可以帮助开发者捕获并处理运行时出现的任何异常,避免程序无故终止,并提供调试信息。 全局异常捕获的基本思路是在应用程序的主进程中创建一个顶级的异常...

    C++ 异常处理 C++ 异常处理

    异常处理机制允许程序在执行过程中捕获并处理未预料的事件或错误条件,从而避免程序崩溃或行为不正常。在C++中,异常处理主要包括以下几个方面: 1. **抛出异常**:当程序检测到某个问题时,可以通过`throw`语句抛...

    易语言异常处理辅助模块

    在实际编程过程中,结合模块提供的功能,开发者应当遵循良好的异常处理原则,如尽早捕获异常、避免空异常处理和充分测试异常处理逻辑,以确保在各种情况下程序都能正常运行。 总的来说,易语言异常处理辅助模块是...

    基于CNN-GS-SVM的用户异常用电行为检测

    "基于CNN-GS-SVM的用户异常用电行为检测" 本文提出了一种基于CNN-GS-SVM的用户异常用电行为检测模型,旨在辅助...该模型具有较高的准确率,可以有效地检测用户异常用电行为,并且可以避免人工设置参数的局部最优问题。

    App全局异常捕捉处理工具类

    通过使用这样的工具类,开发者可以避免因未捕获的异常导致的程序崩溃,从而减少用户流失和负面反馈。 异常捕捉的基本原理是通过自定义全局的ExceptionHandler来替代系统默认的异常处理器。当应用抛出未捕获的异常时...

    自定义异常捕捉器

    为避免这种情况,开发者可以使用异常捕捉器来捕获并处理这些异常。 自定义异常捕捉器的设计通常包含以下几个步骤: 1. **全局异常监听**:在程序的入口点或主页面设置一个全局的异常监听器。这可以通过注册一个...

    Release异常捕获

    这有助于开发者及时发现并修复问题,提高用户体验,避免因为未预见的错误导致应用程序崩溃。 首先,我们来了解一下异常的基本概念。异常是程序执行期间发生的不正常情况,它可以是由用户输入的数据错误、程序逻辑...

    Android 全局异常捕获

    当程序出现异常时,如果没有进行适当的处理,可能会导致应用突然崩溃,给用户带来不愉快的体验。因此,全局异常捕获是一个必要的技术手段,用于捕获和处理那些可能引发程序异常退出的事件。下面将详细解释如何在...

    android全局异常捕获 exception_global

    在Android开发中,全局异常捕获是一个至关重要的实践,它能确保应用在遇到未预期的错误时仍能保持稳定,并提供良好的用户体验。标题"android全局异常捕获 exception_global"和描述都指向了这个主题,表明我们将探讨...

    用友财务软件异常任务清除

    在这个压缩包文件中,我们可以看到一系列与异常任务清除相关的工具,如“用友清除异常工具.exe”、“清除启用日期工具.exe”、“异常任务清除.exe”等。这些工具专门设计用于解决用友财务软件在运行过程中遇到的异常...

    关于异常的作业

    - 尽量避免空异常处理(empty catch block),这可能导致错误被忽视。 - 提供有用的异常信息,包括异常类型和错误消息,便于调试。 - 在可能的情况下,尝试恢复程序状态,而不是简单地终止程序。 了解和熟练运用...

    自定义异常类步骤

    通过异常处理,开发者可以编写更加健壮的代码,避免程序因未预料到的错误而崩溃,同时提供更友好的错误信息反馈给用户。 ### 自定义异常类的重要性 尽管大多数编程语言提供了内置的异常类型来处理常见的错误情况,...

Global site tag (gtag.js) - Google Analytics