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请求根本无法做错误处理;
浙公网安备 33010602011771号