做项目时需对项目内异常信息进行处理,在nutz论坛摸索了1天,也没发现有谁分享过一个完整的示例,我这边分享一个动作链处理的方法,有不足的地方还望大家能够一起交流下;
首先是动作链的配置文件
var chain={
"default" : {
"ps" : [
"org.nutz.mvc.impl.processor.UpdateRequestAttributesProcessor",
"org.nutz.mvc.impl.processor.EncodingProcessor",
"org.nutz.mvc.impl.processor.ModuleProcessor",
"org.nutz.mvc.impl.processor.ActionFiltersProcessor",
"org.nutz.mvc.impl.processor.AdaptorProcessor",
"com.paul.nutz.processor.PaulFailProcessor",
"org.nutz.mvc.impl.processor.MethodInvokeProcessor",
"org.nutz.mvc.impl.processor.ViewProcessor"
],
"error" : 'org.nutz.mvc.impl.processor.FailProcessor'
}
};
不要问我为什么要放在MethodInvokeProcessor前面,我也不清楚,是看论坛里兽总回答后尝试的,没办法,基础有点差。
下面是类
/**
* 拦截所有的异常信息,转换后输入到页面
* @author PAUL GAO
*
*/
public class PaulFailProcessor extends AbstractProcessor {
public void process(ActionContext ac) throws Throwable {
Msg msg = null;
try{
doNext(ac);
}catch(BizException e){
msg = ExceptionBulider.handelException(e);
}catch(Exception e){
msg = Msg.error("网络错误,请刷新后重试!");
}
if (ReqUtils.isAjax(ac.getRequest())) {
ac.getResponse().addHeader("loginStatus", "paramsDenied");
ReqUtils.rendAjaxResp(ac.getRequest(), ac.getResponse(), msg);
}else{
//这里是像页面设置一个对象,里面是提示信息;
ac.getRequest().setAttribute("obj", msg);
new ForwardView("/501.jsp").render(ac.getRequest(), ac.getResponse(), null);
}
return;
}
}
然后是工具类
public class ReqUtils {
public static String AjaxEncode = Encoding.UTF8;
public static boolean isAjax(ServletRequest req) {
String value = ((HttpServletRequest)req).getHeader("X-Requested-With");
if (value != null && "XMLHttpRequest".equalsIgnoreCase(value.trim())) {
return true;
}
return false;
}
public static void rendAjaxResp(ServletRequest req, ServletResponse resp, Object re) {
try {
if (AjaxEncode != null)
((HttpServletResponse)resp).setCharacterEncoding(AjaxEncode);
new UTF8JsonView(JsonFormat.compact()).render((HttpServletRequest)req, (HttpServletResponse)resp, re);
} catch (IOException e) {
e.printStackTrace();
}
}
}
工具类是抄袭nutzwk项目里的;
JSP页面是直接放在webRoot目录下的,用的是myeclipse开发工具;
页面怎么搞就随便你了。