ssm架構的Javaweb項目中,錯誤處理的兩種方式
springmvc中錯誤處理
1、建立錯誤處理的類
public class AnnotationHandlerMethodExceptionResolver extends ExceptionHandlerExceptionResolver {
private String defaultErrorView;
private String defaultJsonErrorView;
public String getDefaultErrorView() {
return defaultErrorView;
}
public void setDefaultErrorView(String defaultErrorView) {
this.defaultErrorView = defaultErrorView;
}
public String getDefaultJsonErrorView() {
return defaultJsonErrorView;
}
public void setDefaultJsonErrorView(String defaultJsonErrorView) {
this.defaultJsonErrorView = defaultJsonErrorView;
}
protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
if (handlerMethod == null) {
return null;
}
Method method = handlerMethod.getMethod();
if (method == null) {
return null;
}
ModelAndView returnValue = super.doResolveHandlerMethodException(request, response, handlerMethod, exception);
ResponseBody responseBodyAnn = AnnotationUtils.findAnnotation(method, ResponseBody.class);
if (responseBodyAnn != null) {
if (null != returnValue) {
if(returnValue.getViewName() == null){
returnValue.setViewName(defaultJsonErrorView);
}
} else {
returnValue = new ModelAndView(defaultJsonErrorView);
}
} else {
if (null != returnValue) {
if(returnValue.getViewName() == null){
returnValue.setViewName(defaultErrorView);
}
} else {
returnValue = new ModelAndView(defaultErrorView);
}
}
returnValue.addObject("ex", exception);
return returnValue;
}
}
2、在springmvc.xml中添加配置
<bean id="handlerExceptionResolver" class="xxx.xxx.AnnotationHandlerMethodExceptionResolver">
<!-- 錯誤頁面 -->
<property name="defaultErrorView" value="/err/err"/>
<property name="defaultJsonErrorView" value="/err/errjson"/>
</bean>
3、錯誤頁
WEB-INF/jsp/err/err.jsp
<%@ page language="java" isErrorPage="true" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.text.*"%>
<%
if (request.getAttribute("base") == null) {
request.setAttribute("base", request.getContextPath());
}
if (exception!=null) {
exception.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="author" content="yipeng">
<meta name="description" content="錯誤頁">
<title>404錯誤</title>
<link rel="stylesheet" href="${base}/js/AdminLTE-2.4.3/bootstrap/css/bootstrap.min.css" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
<link rel="stylesheet" href="${base}/js/AdminLTE-2.4.3/font-awesome/css/font-awesome.min.css" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
<link rel="stylesheet" href="${base}/js/AdminLTE-2.4.3/dist/css/AdminLTE.min.css" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
</head>
<body class="skin-blue" style="width: 100%;text-align: center;background: #eceff6;overflow: hidden;">
<div style="width: 354px;margin: auto; margin-top:158px;">
<img src="${base}/image/error.jpg">
<h3 style="margin-top:35px;">
<i class="fa fa-warning text-red"></i> ! 您無權限或是出現錯誤了
</h3>
<form class='search-form' style="margin-top:51px;">
<div style="width: 100%;text-align: center;">
<button style="width:84px;margin: auto;" type="button" class="btn btn-danger"
οnclick="{top.location.href='${base}/work/home/logout.do'}">重新登陸</button>
</div>
</form>
</div>
</body>
</html>
WEB-INF/jsp/err/err.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.util.* " %>
<%
response.setContentType("application/json;charset=utf-8");
Exception ex = (Exception)request.getAttribute("ex");
if (ex != null) {
ex.printStackTrace();
}
%>
{"status":"falied", "message": "<%=ex!=null?ex.getMessage():"" %>"}
web.xml中錯誤配置
1、在web.xml中添加配置
<!-- 設定錯誤頁面 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error/err.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/err.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/err.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error/err.jsp</location>
</error-page>
錯誤頁也可以根據不同錯誤,配置不同的頁面。比如404,500等配置不同錯誤頁面。
2、錯誤頁 /webapp/error/err.jsp
<%@ page language="java" isErrorPage="true" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.text.*"%>
<%
if (request.getAttribute("base") == null) {
request.setAttribute("base", request.getContextPath());
}
if (exception!=null) {
exception.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="author" content="yipeng">
<meta name="description" content="錯誤頁">
<title>404錯誤</title>
<link rel="stylesheet" href="${base}/js/AdminLTE-2.4.3/bootstrap/css/bootstrap.min.css" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
<link rel="stylesheet" href="${base}/js/AdminLTE-2.4.3/font-awesome/css/font-awesome.min.css" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
<link rel="stylesheet" href="${base}/js/AdminLTE-2.4.3/dist/css/AdminLTE.min.css" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >
</head>
<body class="skin-blue" style="width: 100%;text-align: center;background: #eceff6;overflow: hidden;">
<div style="width: 354px;margin: auto; margin-top:158px;">
<img src="${base}/image/error.jpg">
<h3 style="margin-top:35px;">
<i class="fa fa-warning text-red"></i> ! 您無權限或是出現錯誤了
</h3>
<form class='search-form' style="margin-top:51px;">
<div style="width: 100%;text-align: center;">
<button style="width:84px;margin: auto;" type="button" class="btn btn-danger"
οnclick="{top.location.href='${base}/work/home/logout.do'}">重新登陸</button>
</div>
</form>
</div>
</body>
</html>
測試錯誤頁
這兩種方式都有必要,經過springmvc處理産生的錯誤自然走springmvc的錯誤處理,但是沒有經過springmvc産生的錯誤就可以又web.xml中配置的來處理。
springmvc錯誤測試:在controller的方法中添加 int a = 1/0; 然後通路這個路徑。
web.xml錯誤測試:将預設首頁删除,然後ip端口項目名直接通路項目,就會走到這個錯誤頁。