江左梅郎2017/01/18         
一、500错误处理
1、要求
(1)如果是页面跳转请求,出现了异常,希望能够跳转到统一的异常处理页面,如:
(2)如果是异步请求,则将错误信息返回回调函数中,如:
2、实现,通过实现HandlerExceptionResolver接口进行异常处理
(1)、配置
(2)、实现接口,重写doResolveException方法
@Override
protected ModelAndView doResolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
String viewName = determineViewName(ex, request);
// vm方式返回
if (viewName != null) {
if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request
.getHeader("X-Requested-With") != null && request
.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
// 非异步方式返回
Integer statusCode = determineStatusCode(request, viewName);
if (statusCode != null) {
applyStatusCodeIfPossible(request, response, statusCode);
}
// 将异常栈信息记录到日志中
logger.error(getTrace(ex));
// 设置跳转到提示页面
ModelAndView mv = getModelAndView(viewName, ex, request);
// 错误提示,根据需求添加
mv.addObject("errorMsg", "系统异常!");
// 跳转到提示页面
return mv;
} else {
// 异步方式返回
// 将异常栈信息记录到日志中
logger.error(getTrace(ex));
try {
response.setContentType("application/json;charset=UTF-8");
PrintWriter writer = response.getWriter();
// 错误提示,根据需求添加
Map map = new HashMap();
map.put("success", false);
map.put("errorMsg", "系统异常!");
writer.write(JSONObject.fromObject(map).toString());
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
// 不进行页面跳转
return null;
}
} else {
return null;
}
}
(3)、controller中的代码
@Controller
@RequestMapping()
public class ExceptionTestController {
private final Logger log = Logger.getLogger(this.getClass().getName());
@RequestMapping("500")
public ModelAndView error_500(HttpServletRequest request,
HttpServletResponse response) throws IOException {
ModelAndView mv = new ModelAndView();
mv.setViewName("500");
return mv;
}
@RequestMapping("404")
public ModelAndView error_404(HttpServletRequest request,
HttpServletResponse response) throws IOException {
ModelAndView mv = new ModelAndView();
mv.setViewName("404");
return mv;
}
@RequestMapping("t1")
public ModelAndView t1(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
int[] arr = new int[]{1};
System.out.println(arr[1]);
mv.setViewName("t1");
return mv;
}
@RequestMapping("t2")
public ModelAndView t2(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.setViewName("t2");
return mv;
}
@RequestMapping("t3")
public ModelAndView t3(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.setViewName("t3");
return mv;
}
@ResponseBody
@RequestMapping(value="/t4", method=RequestMethod.POST,produces={"text/html;charset=UTF-8"})
public String t4(HttpServletRequest request){
Map m = new HashMap();
int flag = 1;
System.out.println(1/0);
m.put("flag", flag);
return JSONObject.fromObject(m).toString();
}
}
页面异步代码:
jQuery.ajax({
url: "${webRoot}t4.do",
type: "post",
dataType: "json",
data: {},
success: function(data) {
if(!data.success){
alert(data.errorMsg);
}
}
});
执行结果如要求所示.
二、Freemaker异常处理
1、要求,实现有误的标签显示“数据有误”
2、实现
(1)、实现TemplateExceptionHandler接口,进行异常处理
(2)、配置