`
liuyinhuan
  • 浏览: 27346 次
  • 性别: Icon_minigender_1
  • 来自: 广东中山
文章分类
社区版块
存档分类
最新评论

初识Struts(十)------异常处理

阅读更多

Struts框架中,对于异常的处理主要有两种机制:编程式和声明式。

 

一、编程式异常处理:

            *  捕获异常

      *  创建相应的异常消息

      *  传递异常消息

*  到相应的页面处理异常

如在Action中:

                         try{

                         ......

                         }catch(UserNotFoundException unf){                                

                                        //创建国际化文本消息

                                        ActionMessage message = new ActionMessage("user.login.userNameNotFound",username);

                                       

                             messages.add("error1", message);

                            

                             //传递国际化文本消息

                             this.saveErrors(request, messages);

                         }catch(PasswordErrorException pee){

                                       

                                        //创建国际化文本

                                        ActionMessage message = new ActionMessage("user.login.passwordError");

                                        messages.add("error2",message);

                                        //传递国际化文本

                                        this.saveErrors(request, messages);

                         }

然后再到页面处理:<html:errors/>

 

二、声明式异常处理(即用<exception/>标签配置)

     *  在相应的action配置中添加<exception>配置(注意:要放在<forward>前面,这是由DTD决定的)

    <action path="/login"

             type="cn.huan.struts.LoginAction"

             name="loginForm"

             scope="request"

             input="/login.jsp"

             >

            

           <exception type="cn.huan.struts.UserNotFoundException" key="user.login.userNameNotFound" path="/login_error.jsp"/>

           <exception type="cn.huan.struts.PasswordErrorException" key="user.login.passwordError" path="/login_error.jsp"/>

  

           <forward name="success" path="/login_success.jsp"/>

           <forward name="error" path="/login_error.jsp"/>

      </action>

            其中<exception>type指定该Exception的类绝对路径(这里是我自己定义的两个RuntimeException)key指定properties资源文件中的key值,path指定异常处理页面(没配该属性时会到input页面处理,因为默认异常处理类ExceptionHandler会先判断getPath是否有值,非空就new一个该getPathActionForward,为空就设置为mapping.getInputForward的值)

     

      *  若多个action都需配同一个exception就可以将其设为全局exception来配置,mapping.findException方法会先到action中找局部exception,若没有就会找全局exception:

  <global-exceptions>

 

      <exception type="cn.huan.struts.UserNotFoundException" key="user.login.userNameNotFound"/>

      <exception type="cn.huan.struts.PasswordErrorException" key="user.login.passwordError"/>

 

   </global-exceptions>

         若没配path就会根据各action中的input属性配置处理异常

          

      *        页面显示和编码方式一样用<html:messages/>标签或<html:errors/>标签

 

 

、自定义个性化异常

    若想把资源文件中配的异常信息都用一个异常来处理,就可自定义异常,并在struts-config.xml中配一处就ok.

 

       *  自定义异常,如 ErrorCodeException.java:

package cn.huan.struts;

/**

 *

 * @author 刘银环

 *

 */

public class ErrorCodeException extends RuntimeException {

          //错误码

          private String errorCode;

          //栈位符消息

          private Object[] args;

         

          /**

           * 构造函数一,根据错误码构造

           * @param errorCode:错误码

           */

          public ErrorCodeException(String errorCode){

                         this(errorCode,null);

          }

         

          /**

分享到:
评论
1 楼 liuyinhuan 2008-11-28  
续上。。。
  
       *  自定义异常,如 ErrorCodeException.java:
package cn.huan.struts;
/**
*
* @author 刘银环
*
*/
public class ErrorCodeException extends RuntimeException {
//错误码
private String errorCode;
//栈位符消息
private Object[] args;

/**
* 构造函数一,根据错误码构造
* @param errorCode:错误码
*/
public ErrorCodeException(String errorCode){
this(errorCode,null);
}

/**
* 构造函数二,根据错误码和单个栈位符消息
* @param errorCode:错误码
* @param args:单个栈位符消息
*/
public ErrorCodeException(String errorCode,Object args){
this(errorCode,new Object[]{args});
}

/**
* 构造函数三,根据错误码和多个栈位符消息
* @param errorCode:错误码
* @param args:多个栈位符消息
*/
public ErrorCodeException(String errorCode,Object[] args){
this.errorCode = errorCode;
this.args = args;

}
/**
* @return the errorCode
*/
public String getErrorCode() {
return errorCode;
}
/**
* @return the args
*/
public Object[] getArgs() {
return args;
}

}

       *  自定义异常处理类继承ExceptionHandler,只需重写execute方法的部分代码,如 ErrorCodeExceptionHandler.java:
public ActionForward execute(Exception ex, ExceptionConfig ae,
        ActionMapping mapping, ActionForm formInstance,
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException {
        LOG.debug("ExceptionHandler executing for exception " + ex);

        ActionForward forward;
        ActionMessage error;
        String property;

        //如果不是自定义的ErrorCodeException,就抛给默认的ExceptionHandler处理
        if(!(ex instanceof ErrorCodeException)){
        return super.execute(ex, ae, mapping, formInstance, request, response);
        }
        // Build the forward from the exception mapping if it exists
        // or from the form input
        if (ae.getPath() != null) {
            forward = new ActionForward(ae.getPath());
        } else {
            forward = mapping.getInputForward();
        }

        // Figure out the error
        if (ex instanceof ModuleException) {
            error = ((ModuleException) ex).getActionMessage();
            property = ((ModuleException) ex).getProperty();
        } else {
        ErrorCodeException ece = (ErrorCodeException) ex;
        String errorCode = ece.getErrorCode();
        Object[] args = ece.getArgs();
        error = new ActionMessage(errorCode,args);
        property = error.getKey();
       
//          error = new ActionMessage(ae.getKey(), ex.getMessage());
//          property = error.getKey();
        }

        this.logException(ex);

        // Store the exception
        request.setAttribute(Globals.EXCEPTION_KEY, ex);
        this.storeException(request, property, error, forward, ae.getScope());

        if (!response.isCommitted()) {
            return forward;
        }

        LOG.debug("Response is already committed, so forwarding will not work."
            + " Attempt alternate handling.");

        if (!silent(ae)) {
            handleCommittedResponse(ex, ae, mapping, formInstance, request,
                response, forward);
        } else {
            LOG.warn("ExceptionHandler configured with " + SILENT_IF_COMMITTED
                + " and response is committed.", ex);
        }

        return null;
    }
     (上面只给出了重写的execute方法)

      
      *  配置,
  <global-exceptions>

      <exception key="error.exception" type="cn.huan.struts.ErrorCodeException" handler="cn.huan.struts.ErrorCodeExceptionHandler"/>

   </global-exceptions>
    上面的key指定properties资源文件中的key值,type指定异常类,handler指定异常的处理类(若没给出就会采用默认的ExceptionHandler)

       *   使用:
if(!"admin".equals(username)){
throw new ErrorCodeException("user.login.userNameNotFound",username);
}
if(!"admin".equals(password)){
throw new ErrorCodeException("user.login.passwordError");
}

    当然,这种自定义的异常也能处理没有配在资源文件中的异常信息..

相关推荐

    struts2学习笔记

    #### 二、初识Struts2配置文件 **1. web.xml文件** - 主要配置StrutsPrepareAndExecuteFilter,这是一个过滤器,负责初始化整个Struts框架并处理所有请求。 - 可以通过初始化参数来指定加载额外的XML配置文件,...

    struts2超详细笔记

    #### 二、初识struts2配置文件 struts2的配置主要包括以下几个文件: **(1)web.xml文件** - **StrutsPrepareAndExecuteFilter**:负责初始化整个struts框架,并处理所有请求。可以设置初始化参数,如指定加载...

    初识Java EE经典MVC框架Struts.rar

    3. **异常处理**:Struts提供了全局的异常处理机制,可以统一处理应用程序中的错误。 4. **国际化与本地化**:Struts支持多语言环境,通过资源文件实现。 5. **校验框架**:Struts提供了ActionForm的校验机制,...

    Struts2入门教程(全新完整版)

    3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 4 (5)其它配置文件 4 4.让MyEclipse提示xml信息 4 5.如何...

    Struts教程大全

    "精通Struts技术.doc"和"Struts架构指导.doc"可能包含了更深入的Struts应用技巧和最佳实践,包括如何设计和实现业务逻辑、如何处理表单提交、异常处理、国际化和本地化等方面的知识。 "Struts 2.0入门.pdf"和...

    Struts2学习笔记

    这个框架简化了开发过程,提供了丰富的功能,包括动作调度、数据绑定、国际化、异常处理等。以下是对标题“Struts2学习笔记”中涉及的一些核心知识点的详细解释: 1. **MVC模式**:MVC模式是软件设计中的一种架构...

    struts2帮助文档

    入门教程中的“第1章:初识Struts2”会介绍Struts2的基本概念,包括框架的历史、特点以及它如何简化Web应用开发。这章将引导新手进入Struts2的世界,了解其核心理念。 “第2章:环境配置”会讲解如何设置开发环境,...

    深入浅出Struts2(附源码)

    第2章初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例 26 2.5.1 ...

    java1000题基础百战程序员

    - 异常处理的重要性 - try-catch-finally结构 - 自定义异常 - 检查性异常与运行时异常 - **常用类** - 字符串操作:String、StringBuilder、StringBuffer - 包装类:Integer、Double等 - 日期与时间类:Date...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    Java Web编程宝典-十年典藏版.pdf 是PDF电子书,不是源码。共分2个包。 《Java Web编程宝典(十年典藏版)》是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Java Web进行程序开发的各种技术、技巧。...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    3.6 异常处理:exception-mapping元素 47 3.7 通配符映射 48 3.8 动态方法调用 51 3.9 对动作类进行测试 51 3.10 小结 51 第4章 OGNL 52 4.1 Value Stack栈 52 4.2 读取Object Stack里的对象的属性 53 4.3 读取...

    first_steps_with_struts.zip_Java书籍_Java_

    《初识Struts:Java Web开发之旅》 在Java Web开发领域,Struts框架一直扮演着重要的角色。这个名为"first_steps_with_struts.zip"的压缩包,显然是一份关于Struts 2的教程或者书籍资源,旨在帮助开发者迈出使用...

Global site tag (gtag.js) - Google Analytics