天天看點

springmvc錯誤處理與web.xml錯誤頁配置ssm架構的Javaweb項目中,錯誤處理的兩種方式

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端口項目名直接通路項目,就會走到這個錯誤頁。