三个思路来实现自己定义404页面

如何定义404


404,这意味着找不到网页,那么,你如何定义“我找不到”它?

我们可以采取通过源看看Spring MVC如何定义“404”的:

// Determine handler for the current request.
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
	noHandlerFound(processedRequest, response);
	return;
}

getHandler是依据请求的url,通过handlerMapping来匹配到Controller的过程。

假设匹配不到,那么就运行noHandlerFound方法。这种方法非常easy,返回一个404的错误代码。

我们的Web容器,比方tomcat,会依据这个错误代码来生成一个错误界面给用户。

那么,我们怎样自己定义这个界面呢?


重写noHandlerFound方法


最先想到的肯定是重写noHandlerFound方法,这种方法是protected,能够重写。

我们须要将页面重定向到我们自己定义的404界面。那么仅仅须要

	@Override
	protected void noHandlerFound(HttpServletRequest request,
			HttpServletResponse response) throws Exception {		
		response.sendRedirect(request.getContextPath() + "/notFound");
	}

这里我们的Controller里须要定义一个@requestMapping("/notFound")的这么一个方法,用来返回一个404页面

或者。这里应该能够採用直接訪问静态文件的方法。

另外,也能够通过抛出一个异常NoSuchRequestHandlingMethodException

这样我们就实现了自己定义的404页面。那么。还有别的方法吗?


利用Spring MVC的最精确匹配


Spring MVC对于url的匹配採用的是一种叫做“最精确匹配的方式”。举个样例

比方我们同一时候定义了“/test/a”, "/test/*"。那么若请求的url结尾为/test/a,那么则会匹配精确的那个。也就是"/test/a"

我们是不是能够利用这个特点来找到那些找不到的页面?

1、首先我们定义一个拦截全部url的规则@requestMapping("*"),那么实际上不存在找不到的页面了,也就是永远不会进入noHandlerFound方法体内

2、后面的步骤和平时一样,为别的请求都配置上@requestMapping

那么请求过来,要么进入我们精确匹配的method(也就是找的到的)。要么进入@requestMapping("*)拦截的方法体内(也就是找不到的)

那么我们仅仅要让@requestMapping("*)拦截的这种方法返回一个自己定义的404界面就OK了~


利用web容器提供的error-page


还记得之前提到的web容器会提供一个404的默认界面吗?

事实上我们全然能够替换成我们自己的界面,那么看起来这样的方法应该是最简单的了。

仅仅须要在web.xml文件里写上例如以下代码就能够了:

	<error-page>
		<error-code>404</error-code>
		<location>/resource/view/404.htm</location>
	</error-page>

只是值得注意的是,这里配置的的location事实上会被当成一个请求来訪问。

那么我们的DispatcherServlet会拦截这个请求而造成无法訪问,此时的结果是用户界面一片空白。

所以这里的404.htm事实上是一个静态资源,我们须要用訪问静态资源的方式去訪问。

而在我的Spring MVC里,resource文件夹下的文件都是不会被拦截的


比較三种方式的差别


1、最方便:那肯定是第三种了,我们仅仅须要提供一个静态页面就可以
2、最快捷:第一种肯定最慢,由于它会发起2个请求。另外一种和第三种应该差点儿相同
3、最灵活:从灵活性上来看,第三种肯定是最缺乏的。可是事实上对于404来说并非须要常常变化的,只是也保不准可能能够同意用户自己定义404界面等。这里一、二两种方式则提供了灵活性。
4、通用性:第三应该是最常见的。和、两 两种则要依靠Spring MVC

版权声明:本文博客原创文章,博客,未经同意,不得转载。

posted @ 2015-07-17 11:19  blfshiye  阅读(288)  评论(0编辑  收藏  举报