如何定义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文件夹下的文件都是不会被拦截的
比較三种方式的差别
版权声明:本文博客原创文章,博客,未经同意,不得转载。