`

struts声明式异常一

阅读更多

struts声明式异常:

在配置文件中配置exception属性,并配以相应在的异常类型,那么程序中遇到这类异常就会自动处理异常信息.
如下例:登录action处理中会抛出UserNotFoundException,那么采用声明式异常:
<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>

 login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>logon</title>
</head>
<body>
<html:errors/>
<html:form action="logon">
	<table border="0" width="100%">
		<tr>
			<th align="right"><bean:message key="login.user"/></th>
			<td align="left"><html:text property="username" size="20" maxlength="20"></html:text></td>
		</tr>
		<tr>
			<th align="right"><bean:message key="login.pwd"/></th>
			<td align="left"><html:password property="password" size="20" maxlength="20"></html:password></td>
		</tr>
		<tr>
			<td align="right"><html:submit>logonin</html:submit>	</td>
			<td align="left"><html:button property="register" >register</html:button><html:reset>reset</html:reset></td>
		</tr>
	</table>
</html:form>
</body>
</html:html>

 

 

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.ActionMessage;
import org.apache.struts.action.ActionMessages;

import com.lwf.struts.form.LogonForm;
import com.lwf.struts.util.UserManageEntity;
import com.lwf.struts.util.UserNotFoundException;

public class LogonAction extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		ActionMessages errors = new ActionMessages();
		ActionForward forward = new ActionForward();
		
		LogonForm logonForm = (LogonForm)form;
		String name = logonForm.getUsername();
		String pwd = logonForm.getPassword();
		UserManageEntity.UserManager(name);
//		try {
//			UserManageEntity.UserManager(name);
//			errors.add("logonerror1", new ActionMessage("error.login.user"," myerrmsg"));
//			this.saveMessages(request, errors);
//			request.getSession().setAttribute("user", logonForm);
//			forward = mapping.findForward("success");
//		} catch (UserNotFoundException e) {
//			errors.add("logonerror2", new ActionMessage("error.login.again"," error2"));
//			this.saveErrors(request, errors);
//			forward = mapping.findForward("error");
//		}
//		
		forward = mapping.findForward("success");
		return forward;
	}

	
}

 

 

上面注释部分就是采用编程式异常的代码.现在采用声明式异常就不用不需要再catch异常

 

package com.lwf.struts.util;

public class UserNotFoundException extends Exception {

	public UserNotFoundException(){}
	public UserNotFoundException(String message){
		super(message);
	}
}

 

查看配置文件中注意:

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

 

type异常类型,key消息文本.当struts碰到这个异常会默认转向到input指向的jsp页面.消息文本为key所指的值.
  如果在exception添加path属性,如上面path="/index.jsp"  那么异常会转向到index.jsp而不是logon.jsp

 

ApplicationResources.properties文件中内容:

error.login.usernull = user must not null

 

 

运行程序输出结果:

user must not null

 

看看struts源代码:

// Call the Action instance itself
        ActionForward forward =
            processActionPerform(request, response, action, form, mapping);

 

 protected ActionForward processActionPerform(HttpServletRequest request,
        HttpServletResponse response, Action action, ActionForm form,
        ActionMapping mapping)
        throws IOException, ServletException {
        try {
            return (action.execute(mapping, form, request, response));
        } catch (Exception e) {
            return (processException(request, response, e, form, mapping));
        }
    }

 

 protected ActionForward processException(HttpServletRequest request,
        HttpServletResponse response, Exception exception, ActionForm form,
        ActionMapping mapping)
        throws IOException, ServletException {
        // Is there a defined handler for this exception?
        ExceptionConfig config = mapping.findException(exception.getClass());

        if (config == null) {
            log.warn(getInternal().getMessage("unhandledException",
                    exception.getClass()));

            if (exception instanceof IOException) {
                throw (IOException) exception;
            } else if (exception instanceof ServletException) {
                throw (ServletException) exception;
            } else {
                throw new ServletException(exception);
            }
        }

        // Use the configured exception handling
        try {
            ExceptionHandler handler =
                (ExceptionHandler) RequestUtils.applicationInstance(config
                    .getHandler());

            return (handler.execute(exception, config, mapping, form, request,
                response));
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

 从上面我们知道struts声明式异常默认使用ExceptionHandler 来处理,我们可以自己定义异常处理类,从而改变默认声明式异常处理的行为.在配置文件中exception 中增加handler属性

 

 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;

        // 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 {
            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;
    }

  

以上代码是不是解释了异常会默认转向到input指向的jsp页面.  如果在exception添加path属性,如上面path="/index.jsp"  那么异常会转向到index.jsp而不是logon.jsp

上面代码也解释了为什么配置文件exception的key属性在这里要与资源文件相对应。因为

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

 这个方法传入的第一个参数为ae.getKey()即exception下的key值。

如果我们继承ExceptionHandler并复写了excute方法,可以改变传入的参数值。具体看

http://quicker.iteye.com/blog/636332

 

 

我们也可以定义全局异常

<global-exceptions>
<exception key="error.login.usernull" type="com.lwf.struts.util.UserNotFoundException" path="/index.jsp" ></exception>
</global-exceptions>

 

那么当前应用如果配置了input属性,发生异常转向该属性所指页面,如果当前应用配置了exception配置了path则转向path所指页面,如果当前应用input,path都没有或者当前应用没配置exception,那么查找是否配置全局异常,如果有配置,那么转向到全局应用的path所指页面

在上面我们知道声明式异常默认采用ExceptionHandler来处理.但我们修改资源文件将

error.login.usernull = user must not null

改为

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

即增加参数我们会发现默认的异常处理并不能输出参数信息.

下文将对声明式异常默认不能输出参数信息的问题进行探讨。

http://quicker.iteye.com/blog/636332

分享到:
评论

相关推荐

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

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

    struts2之声明式异常捕捉

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

    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中异常处理机制分析

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

    Struts2.2.3所有jar包

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

    struts2框架jar包

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

    Struts2 教学课件

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

    struts2需要导入的包

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

    struts-2.0.11.1-all

    8. **异常处理**:Struts 2提供了一种声明式和编程式的异常处理机制。通过全局异常映射,可以统一处理特定类型的异常,提高代码的可读性和可维护性。 9. **国际化与本地化**:Struts 2支持多语言环境,开发者可以...

    struts2必要jar包

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

    struts2.2.3.1帮助文档

    它允许开发者声明式地配置应用程序的行为。 4. **表达式语言(OGNL)**:Struts2使用OGNL(Object-Graph Navigation Language)作为默认的表示层语言,用于在视图层与模型层之间传递数据,例如在JSP中使用`...

    Struts增删改查

    Struts可以通过编程式或声明式的方式来管理事务,确保数据的一致性。 8. **错误与异常处理**: Struts提供了错误和异常处理机制,当出现错误或异常时,可以跳转到特定的错误页面,或者显示错误消息。 9. **Struts...

    struts2中文版参考书

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

    struts2标准jar包集

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

Global site tag (gtag.js) - Google Analytics