`

struts声明式异常二

阅读更多

上文如果资源文件改为:

error.login.usernull = user must not null{0}

则输出user must not null null

即参数由null来代替。

我们可以看到ExceptionHandler的excute方法里面是这样处理的。

 error = new ActionMessage(ae.getKey(), ex.getMessage());   
           property = error.getKey();   

 

可以看到new ActionMessage(ae.getKey(), ex.getMessage());  
这里的ae.getKey()就是我们在配置文件的exception的key属性。

<action path="/logon" type="com.lwf.struts.action.LogonAction"
name="logonForm" input="/logon.jsp" scope="session" validate="true" >
<exception key="error.login.usernull" type="com.lwf.struts.util.UserNotFoundException" path="/index.jsp" ></exception>
</action>

 而第二个参数ex.getMessage()则是获取异常信息。

也就是说如果我们的异常处理类抛出一个带参数的异常如;

package com.lwf.struts.action.entity;

import com.lwf.struts.exception.PasswordNotFoundException;
import com.lwf.struts.exception.UserNotFoundException;

public class UserManager {

	private static UserManager userManager = new UserManager();
	private UserManager(){}
	
	public static UserManager instance(){
		return userManager;
	}
	
	public boolean isValidaUser(String name, String pwd) throws Exception{
		boolean flagPwd = false;
		boolean flagUser = false;
		if(name!=null && name.equals("admin")){
			flagUser = true;
		}else{
			throw new UserNotFoundException(“user incorrect”);
		}
		if(pwd!=null && pwd.equals("super")){
			flagPwd = true;
		}else{
			throw new PasswordNotFoundException("pwd incorrect");
		}
		return flagPwd && flagUser;
	
	}

}

new UserNotFoundException(“user incorrect”);
 

注意黑体部分。那么异常会输出:

user must not null user incorrect null

即资源文件的key内容+异常抛出的文本+参数化

当然上面参数化也没有显示出来。需要我们写一个自己的ExceptionHandler来处理。

我们使用一个统一的异常类。如下:

package com.lwf.struts.exception;

public class ErrorCodeException extends RuntimeException {

	private static final long serialVersionUID = 1L;
	private String errorCode;//错误码,对应资源文件的key
	private Object[] args;//占位符,即参数
	
	public ErrorCodeException(){}
	public ErrorCodeException(String errorCode){
		this.errorCode = errorCode;
	}
	public ErrorCodeException(String errorCode, Object[] args){
		this.errorCode = errorCode;
		this.args = args;
	}
	public ErrorCodeException(String errorCode, Object args){
		this(errorCode,new Object[]{args});
	}
	
	public String getErrorCode() {
		return errorCode;
	}
	public void setErrorCode(String errorCode) {
		this.errorCode = errorCode;
	}
	public Object[] getArgs() {
		return args;
	}
	public void setArgs(Object[] args) {
		this.args = args;
	}
	
	
}

 

实际上我们是为构造ActionMessage做准备。

我们自己的handler类:

package com.lwf.struts.handler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.config.ExceptionConfig;
import com.lwf.struts.exception.ErrorCodeException;

public class LogonHandler extends ExceptionHandler {

	public ActionForward execute(Exception ex, ExceptionConfig ae,
			ActionMapping mapping, ActionForm formInstance,
			HttpServletRequest request, HttpServletResponse response)
			throws ServletException {

		if(!(ex instanceof ErrorCodeException)){
		          return  super.execute(ex, ae, mapping, formInstance, request, response);
		}
		
        ActionForward forward;
        ActionMessage error;
        String property;

        if (ae.getPath() != null) {
            forward = new ActionForward(ae.getPath());
        } else {
            forward = mapping.getInputForward();
        }

        ErrorCodeException ece = (ErrorCodeException)ex;
        String errocode = ece.getErrorCode();
        Object[] args = ece.getArgs();
        error = new ActionMessage(errocode, args);
        property = error.getKey();

        this.logException(ex);

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

        return forward;
	}

}

 

 error = new ActionMessage(errocode, args);

我们可以看到现在我们构造ActionMessage传入的第一个参数不再是ae.getKey()所以现在来说

配置文件exception的key属性在这里可以不需要与资源文件相对应,可随便取值。如下配置:

<action path="/login" type="com.lwf.struts.action.LoginAction"
			name="loginForm" input="/index.jsp" scope="session" validate="true" >
<exception key="keyCode" type="com.lwf.struts.exception.ErrorCodeException" handler="com.lwf.struts.handler.LogonHandler"></exception>
</action>

 看上面key="keyCode"

下面action

package com.lwf.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;

import com.lwf.struts.action.entity.UserManager;
import com.lwf.struts.form.LoginForm;

public class LoginAction extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		LoginForm loginForm = (LoginForm)form;
		String name = loginForm.getUsername();
		String pwd = loginForm.getPassword();
		ActionMessages errors = new ActionMessages();
		UserManager.instance().isValidaUser(name, pwd);
		return mapping.findForward("success");
	}

}

 下面是UserManager类。

package com.lwf.struts.action.entity;

import com.lwf.struts.exception.ErrorCodeException;
import com.lwf.struts.exception.PasswordNotFoundException;

public class UserManager {

	private static UserManager userManager = new UserManager();
	private UserManager(){}
	
	public static UserManager instance(){
		return userManager;
	}
	
	public boolean isValidaUser(String name, String pwd) throws Exception{
		boolean flagPwd = false;
		boolean flagUser = false;
		if(name!=null && name.equals("admin")){
			flagUser = true;
		}else{
			throw new ErrorCodeException("user.name.incorrect",name);
		}
		if(pwd!=null && pwd.equals("super")){
			flagPwd = true;
		}else{
			throw new ErrorCodeException("user.pwd.incorrect",pwd);
		}
		return flagPwd && flagUser;
	
	}

}

 注意我们这里统一抛出的是ErrorCodeException异常,只是参数不同。第一个参数必须与资源文件的key对应,第二个参数则可以是对象或对象数组。对应于资源文件的点位符。如ApplicationResources.properties文件内容

user.name.incorrect	= user incorrect {0}
user.pwd.incorrect	= pwd incorrect	{0}

 这里我们传入的是输入的用户名。

好测试一下。我们输入用户名为we

那么在页面上会看到:

user incorrect we

 

即实现了参数化

分享到:
评论

相关推荐

    struts2之声明式异常捕捉

    在Struts2中,声明式异常处理是其强大的特性之一,它允许开发者通过配置文件来定义不同类型的异常如何被处理,而不是在每个动作类中进行硬编码。这样可以提高代码的可读性和可维护性,同时也方便了异常处理策略的...

    Struts 声明式异常处理和个性化异常处理

    声明式异常处理是Struts中的一种特性,允许我们在struts.xml配置文件中定义全局的异常映射,而不是在每个Action类中单独处理。这样可以实现异常处理的统一和标准化,减少代码重复,提高可维护性。声明式异常处理通常...

    Struts2声明式异常示例代码

    Struts2是一个强大的Java web开发框架,它提供了一种声明式异常处理机制,极大地简化了在应用程序中处理异常的方式。本示例代码旨在演示如何在Struts2中定义和使用声明式异常,以及如何访问异常属性。 声明式异常...

    Struts1和Struts2区别

    - **Struts2**:支持注解和XML方式的校验,可以实现声明式校验,减少了代码量并提高了可维护性。 7. 国际化和本地化: - **Struts1**:需要手动配置资源文件,处理相对复杂。 - **Struts2**:提供了一套更直观的...

    Struts2主要Lib

    它允许开发者以声明式的方式配置应用程序的行为。 4. **拦截器(Interceptor)**:拦截器是Struts2的一个重要特性,它提供了AOP(面向切面编程)的能力。拦截器可以插入到Action调用链中,执行额外的任务,如日志...

    struts2的新闻管理系统

    7. **表单验证**:Struts2提供了强大的表单验证功能,可以在Action类中定义验证规则,或者使用XML配置文件进行声明式验证。 通过这个新闻管理系统,新手可以学习到如何使用Struts2搭建一个完整的web应用,包括控制...

    Struts2 教学课件

    配置文件提供了声明式编程,简化了代码量。 4. **拦截器(Interceptors)**:Struts2的拦截器是AOP(面向切面编程)的一个体现,可以在Action执行前后插入自定义的处理逻辑,如日志记录、权限验证、性能监控等。常见...

    struts2框架jar包

    这些配置可以声明式地指定Action的映射、参数、结果类型等,增强了灵活性。 4. **拦截器(Interceptor)**:拦截器是Struts2的一个重要特性,它允许在Action执行前后插入自定义逻辑。比如,可以使用拦截器进行权限...

    struts2标准jar包集

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它在Java Web开发中广泛应用,极大地简化了创建交互式、数据驱动的Web应用程序的过程。这个“struts2标准jar包集”包含了运行和集成Struts2框架所需的核心库和其他...

    struts2必要jar包

    9. **表单验证**:Struts2提供了一种声明式的表单验证方式,开发者可以定义Action的验证规则,框架会自动进行验证。 10. **模板技术**:Struts2可以与FreeMarker、Velocity等多种模板引擎集成,用于生成动态视图。 ...

    Struts2中异常处理机制分析

    本文将深入探讨Struts2的异常处理机制,特别是声明式异常捕捉和异常映射。 首先,Struts2的异常处理机制允许开发者在不干扰Action执行逻辑的情况下,集中处理可能出现的异常。默认情况下,由于Action的`execute()`...

    struts2+spring+springstruts2+spring+springstruts2+spring+spring

    - **事务管理**:Spring提供了声明式事务管理,简化了事务处理的代码。 - **JDBC抽象层**:Spring提供了对JDBC的封装,简化了数据库操作。 ### Spring与Struts2的集成 将Spring与Struts2集成,可以利用Spring的...

    ssh Jar 之struts2jar

    SSH中的Spring框架则是Java企业级应用的核心组件,它提供了一种声明式事务管理方式,可以简化事务处理。Spring的IoC容器负责管理对象的生命周期和对象间的依赖关系,而AOP则用于实现代码的横向切面,如日志记录、...

    struts2中文版参考书

    - **声明式异常处理**:通过配置文件来处理异常,提高代码的健壮性。 #### 8. 国际化支持 - **资源文件**:通过定义资源文件来支持多语言。 - **格式化**:根据不同的语言和地区设置,自动调整日期、数字等格式。 ...

    struts2需要导入的包

    这些核心库的引入,使得开发者可以充分利用Struts2的特性,如声明式异常处理、国际化支持、插件扩展性、以及强大的表单验证和数据绑定等功能。在实际开发中,还需要根据具体需求引入其他的库,如数据库连接池、JSON...

    struts2 spring hibernate整合的简单登录代码

    Spring的依赖注入(DI)使得我们可以轻松管理对象的生命周期和依赖关系,同时,它还提供了事务管理,如使用@Transactional注解进行声明式事务管理。 Hibernate的配置文件(通常是hibernate.cfg.xml)会定义数据库...

    Struts2.2.3所有jar包

    - **配置文件**: Struts2的配置文件(struts.xml)用于定义Action、结果、拦截器栈等,可以实现声明式编程。 **2. Struts2的架构** Struts2的架构基于过滤器(Filter)和Servlet容器。`...

Global site tag (gtag.js) - Google Analytics