Struts2的错误处理机制

struts的错误处理:
java的异常处理:两种 :抛[谁调用谁处理] try[自己处理]

xwork2中:
DefaultActionInvocation里面的invoke方法,是对业务处理的底层方法;里面进行try finally,也没有进行处理;那就
是谁调用这个xwork的DefaultActionInvocation的invoke方法谁进行处理;
struts2中:
从过滤器开始看:StrutsPrepareAndExecuteFilter; doFilter方法;里面的execute.executeAction
(request,response,mapping);然后进如:ExecuteOperations中的executeAction方法,里面dispatcher.serviceAction
(request,response,servletContext,mapping);然后进去Dispatcher的这个serviceAction方法,里面proxy.execute();
然后看到是ActionProxy接口代理出来的Action执行;默认实现的类是DefaultActionProxy--- StrutsActionProxy;这里
DefaultActionProxy是xwork2里面的默认实现,StrutsActionProxy是继承自这个DefaultActionProxy,然后进行调用
retCode = invocation.invoke()方法;
异常步骤是:StrutsActionProxy中调用invoke没有处理异常,向上抛出;一直到Dispatcher.serviceAction方法中进行try
。。catch处理:
try{
proxy.execute();
}catch(ConfigurationException e ){
if(devMode){
LOG.error("Could not find action or result",e);
}else{
LOG.warn("COuld not find action or result",e);
}
sendError(request,response,context,HttpServletResponse.SC_NOT_FOUND,e);
}catch(Exception e){
sendError(request,response,context,HttpServletResponse.SC_INTERNAL_SERVICE_ERROR,e);
}finally{
UtilTimeStack.pop(timeKey);
}
里面的这个sendError就是struts2的异常错误处理类;方法也在Dispatcher类里面定义:
\struts-2.3.8\src\core\src\main\resources\org\apache\struts2\dispatcher\error.ftl
这个是定义的struts的自己错误机制做的处理页面;
public void sendError(HttpServletRequest request, HttpServletResponse response, ServletContext ctx, int
code, Exception e) {

Boolean devModeOverride = FilterDispatcher.getDevModeOverride();

if (devModeOverride != null ? devModeOverride : devMode) {

if (LOG.isDebugEnabled()) {

LOG.debug("Exception occurred during processing request: #0", e, e.getMessage());

}

try {

FreemarkerManager mgr = getContainer().getInstance(FreemarkerManager.class);


freemarker.template.Configuration config = mgr.getConfiguration(ctx);

Template template = config.getTemplate("/org/apache/struts2/dispatcher/error.ftl");


List<Throwable> chain = new ArrayList<Throwable>();

Throwable cur = e;

chain.add(cur);

while ((cur = cur.getCause()) != null) {

chain.add(cur);

}


HashMap<String,Object> data = new HashMap<String,Object>();

data.put("exception", e);

data.put("unknown", Location.UNKNOWN);

data.put("chain", chain);

data.put("locator", new Locator());


Writer writer = new StringWriter();

template.process(data, writer);


response.setContentType("text/html");

response.getWriter().write(writer.toString());

response.getWriter().close();

…………
可以看到是FreeMaker的方式形成的页面;

调试的时候断点停不住也可能是打开的项目过多,串用了;

里面的devMode如果为true进入这里进行装饰出来显示struts的自定义错误显示,如果为false,默认也是false,就会交给
Servlet容器处理,就比如tomcat;

struts2的错误处理机制就是建了一个模板,将错误信息显示出来;
----
一般需要将后台抛出的错误信息写到一个页面中;就有了全局的错误处理机制;
<package name="struts-global" namespace="/" extends="struts-default">
<global-results>
<result name="errHandler" type="chain">
<param name="actionName">errorProcessor</param>
</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception"
result="errHandler" />
</global-exception-mappings>

<action name="errorProcessor" class="com.itcast.oa.exception.ErrorPrcessor">
<result>error.jsp</result>
</action>
</package>

这里面怎么进去的,这就是一个拦截器做的,strutsdefault.xml里面的
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String result;

try {
result = invocation.invoke();
} catch (Exception e) {
if (isLogEnabled()) {
handleLogging(e);
}
List<ExceptionMappingConfig> exceptionMappings = invocation.getProxy().getConfig
().getExceptionMappings();
String mappedResult = this.findResultFromExceptions(exceptionMappings, e);
if (mappedResult != null) {
result = mappedResult;
publishException(invocation, new ExceptionHolder(e));
} else {
throw e;
}
}

return result;
}

可以看到是在这里捕获异常;然后,进行处理,日志或者继续抛出;
List<ExceptionMappingConfig> exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
这里是获取errHandler中配置的信息的;

struts2的错误处理就是借用拦截器;
---
$.post()只可以接受成功信息,$.ajax()即可以接受成功,也可以接受失败信息;
service报错的时候因该自动设置这个status的值;但是struts的错误机制中没有设置这个值;
因此导致$.ajax请求根本无法做错误处理;

posted @ 2014-02-27 17:56  教程学习  阅读(366)  评论(0)    收藏  举报