struts2 如何将拦截器里产生的异常信息输入到统一的错误页面中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2 如何将拦截器里产生的异常信息输入到统一的错误页面中?相关的知识,希望对你有一定的参考价值。

利用struts2的异常处理机制和拦截器机制可以很方便的实现异常处理功能,你不再需要在Action中捕获异常,并抛出相关的异常了,这些都交给拦截器来帮你做了。
如果在Action中使用了trycatch处理异常,异常信息直接打印到tomcat控制台,如果是抛出的话,控制台看不到信息,但又想看异常信息,以便排错,可以使用如下方法:
Struts2 XML:
<exception-mapping result="exception" exception="java.lang.Exception"></exception-mapping>
<result name="exception">error.jsp</result>

Jsp:
异常信息 :<s:property value="exception.message" />
异常值栈:<s:property value="exceptionStack" />

在拦截器中,捕获常见的异常,并以友好异常信息抛出,如下:
public class BusinessException extends RuntimeException
private static final long serialVersionUID = 0xc1a865c45ffdc5f9L;
public BusinessException(String frdMessage)
super(createFriendlyErrMsg(frdMessage));

public BusinessException(Throwable throwable)
super(throwable);

public BusinessException(Throwable throwable, String frdMessage)
super(throwable);

private static String createFriendlyErrMsg(String msgBody)
String prefixStr = "抱歉,";
String suffixStr = " 请稍后再试或与管理员联系!";
StringBuffer friendlyErrMsg = new StringBuffer("");
friendlyErrMsg.append(prefixStr);
friendlyErrMsg.append(msgBody);
friendlyErrMsg.append(suffixStr);
return friendlyErrMsg.toString();




public class BusinessInterceptor extends AbstractInterceptor
@Override
public String intercept(ActionInvocation invocation) throws Exception
before(invocation);
String result = "";
try
result = invocation.invoke();
catch (DataAccessException ex)
throw new BusinessException("数据库操作失败!");
catch (NullPointerException ex)
throw new BusinessException("调用了未经初始化的对象或者是不存在的对象!");
catch (IOException ex)
throw new BusinessException("IO异常!");
catch (ClassNotFoundException ex)
throw new BusinessException("指定的类不存在!");
catch (ArithmeticException ex)
throw new BusinessException("数学运算异常!");
catch (ArrayIndexOutOfBoundsException ex)
throw new BusinessException("数组下标越界!");
catch (IllegalArgumentException ex)
throw new BusinessException("方法的参数错误!");
catch (ClassCastException ex)
throw new BusinessException("类型强制转换错误!");
catch (SecurityException ex)
throw new BusinessException("违背安全原则异常!");
catch (SQLException ex)
throw new BusinessException("操作数据库异常!");
catch (NoSuchMethodError ex)
throw new BusinessException("方法末找到异常!");
catch (InternalError ex)
throw new BusinessException("Java虚拟机发生了内部错误");
catch (Exception ex)
throw new BusinessException("程序内部错误,操作失败!");

after(invocation, result);
return result;



XML配置:
<!--自定义拦截器 -->
<interceptors>
<interceptor name="businessInterceptor" class="org.test.BusinessInterceptor"></interceptor>
</interceptors>
<action name="test" class="org.test.action.BusinessAction">
<result name="success">test.jsp</result>
<exception-mapping result="exception" exception="java.lang.Exception"></exception-mapping>
<result name="exception">error.jsp</result>
<!-- 拦截器一般配在result之后 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="businessInterceptor"></interceptor-ref>
</action>

如果配合Log4j的话,还可以实现将异常信息输出到文件以及控制台。
参考:http://blog.csdn.net/colin_guo/article/details/6932493
参考技术A 首先,你的拦截器应该有一个返回页面,也就是说触发拦截时要返回到的页面。(比方说登陆画面)这个你可以自己在配置文件里定义,你应该用过struts2的校验功能吧,如果用过的话,应该就知道如何在页面显示提示信息了。(针对struts2的重写方法校验,不是XML校验框架)
简单来说就是:
action:
addFieldError方法

jsp:
<s:fielderror></s:fielderror>

当然,显示提示信息可以灵活运用,你完全可以把信息设置在自己定义的控件上。
本回答被提问者采纳

Struts2令牌 - 会话拦截器问题

我在我的业务Web应用程序中使用Struts 2,并且为了防止在刷新页面时双重输入,我在我的struts.xml文件中添加了拦截器

<interceptor-ref name="tokenSession"/>

当我将插入此语句时,它将始终重定向到invalid.token并转到tiles - requisition.tiles。我做错了什么?

如果我将删除上面的拦截器然后它将正常工作,那么问题是什么?

我在struts2.xml中的代码

<action name="*Requisition" class="com.sttl.rpsc.action.RequisitionAction" method="{1}Requisition">
        <interceptor-ref name="basicStack" />
        <interceptor-ref name="validation">
            <param name="excludeMethods">setupRequisition,setupPostRequisition,setupQualificationRequisition,setUpForUpdateQualificationRequisition,
            setupAgeRequisition,setupReservationRequisition,deletePostRequisition,showSaveCancelRequisition,setUpForUpdateAgeRequisition,setUpForUpdateReservationRequisition,
            deleteQualificationRequisition,deleteAgeRequisition,deleteReservationRequisition,setScrutinizePostRequisition</param>
        </interceptor-ref>
        <interceptor-ref name="tokenSession"/>

        <result name="invalid.token" type="tiles">/requisition.tiles</result> 
        <result name="input" type="tiles">/requisition.tiles</result>
        <result name="success" type="tiles">/requisition.tiles</result>
        <result name="error" type="tiles">/requisition.tiles</result>
        <result name="cancel" type="redirect">rpscadminsecure.action</result>
        <result name="getRequisitionList" type="chain">setupRequisition</result>
        <result name="reqsuccess" type="chain">setupPostRequisition</result>
        <result name="postsuccess" type="tiles">/requisitionpost.tiles</result>
        <result name="qualisuccess" type="tiles">/requisitionqualification.tiles</result>
        <result name="agesuccess" type="tiles">/requisitionage.tiles</result>
        <result name="ressuccess" type="tiles">/requisitionreservation.tiles</result>
        <result name="saveOrCancelsuccess" type="tiles">/saveOrCancelrequisition.tiles</result>
        <result name="cancelSuccess" type="redirect">setupRequisition</result>

        <result name="successSetupScrutinize" type="tiles">/requisitionpost.tiles</result>

    </action>
答案

您必须更改拦截器中声明的顺序。像这样的东西:

<action name="someAction" class="com.examples.SomeAction">
<interceptor-ref name="token-session/>
<interceptor-ref name="basicStack"/>
<result name="success">good_result.ftl</result>
</action>  

basicStack是订单中的最后一个。

以上是关于struts2 如何将拦截器里产生的异常信息输入到统一的错误页面中?的主要内容,如果未能解决你的问题,请参考以下文章

struts2异常处理和log4j日志记录怎么弄?

struts2异常处理机制

Struts2 异常处理

Struts2 异常处理

Struts2学习笔记四:Struts2拦截器学习拦截器实现案例Struts2标签学习

struts2配置过滤器与拦截器