structs2与ajax结合,无论采用$.post还是$.ajax都捕获不到服务器产生的错误,这是structs2内部设计的不是很好,
但是$.ajax捕获错误在servlet能做到。因为
public void serviceAction(HttpServletRequest request,HttpServletResponse response,ServletContext context, ActionMapping mapping) throws ServletException { Map<String,Object> extraContext = createContextMap(request,response,mapping,context); // If there was a previous value stack,then create a new copy and pass it in to be used by the new Action ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); boolean nullStack = stack == null; if (nullStack) { ActionContext ctx = ActionContext.getContext(); if (ctx != null) { stack = ctx.getValueStack(); } } if (stack != null) { extraContext.put(ActionContext.VALUE_STACK,valueStackFactory.createValueStack(stack)); } String timerKey = "Handling request from Dispatcher"; try { UtilTimerStack.push(timerKey); String namespace = mapping.getNamespace(); String name = mapping.getName(); String method = mapping.getMethod(); Configuration config = configurationManager.getConfiguration(); ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace,name,method,extraContext,true,false); request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY,proxy.getInvocation().getStack()); // if the ActionMapping says to go straight to a result,do it! if (mapping.getResult() != null) { Result result = mapping.getResult(); result.execute(proxy.getInvocation()); } else { proxy.execute(); } // If there was a previous value stack then set it back onto the request if (!nullStack) { request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY,stack); } } catch (ConfigurationException e) { // WW-2874 Only log error if in devMode if(devMode) { String reqStr = request.getRequestURI(); if (request.getQueryString() != null) { reqStr = reqStr + "?" + request.getQueryString(); } LOG.error("Could not find action or resultn" + reqStr,e); } else { if (LOG.isWarnEnabled()) { LOG.warn("Could not find action or result",e); } } sendError(request,context,HttpServletResponse.SC_NOT_FOUND,e);//产生错误的模板页面,并返回到客户端 } catch (Exception e) { sendError(request,HttpServletResponse.SC_INTERNAL_SERVER_ERROR,e);//产生错误的模板页面,并返回到客户端 } finally { UtilTimerStack.pop(timerKey); } }
所以所有的struts2的错误都会走该模板页面. (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|