zoukankan      html  css  js  c++  java
  • 三个思路来实现自己定义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

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

  • 相关阅读:
    当老板如何带团队?
    创业者第一法宝-了解自己
    交流才能交易,交易才能交心
    集合框架
    MySQL一些命令语法
    JS组成整理
    git中可以pull但是push提示Everything up-to-date的情况
    循环判断以及文件的使用--练习1
    Hello World !
    linux文件权限修改
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4653893.html
Copyright © 2011-2022 走看看