使用springmvc时处理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方法。这个方法很简单,返回一个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

时间: 2024-10-21 09:51:50

使用springmvc时处理404的方法的相关文章

详谈何为404错误及404处理方法

404问题绝对关乎网站的优化,而大部分网站都会有404错误的相关处理,比如一个网站删除了页面内容,正常网站将自动返回404状态码,搜索引擎进行更新并删除,避免对网站用户及搜索引擎带来负面影响.但问题来了,如果网站只删除了内容,没有任何主体内容的页面被保存了下来,未做404处理.当然,存在一类网站只删除内容后返回正常200状态码,提醒一句"该内容已删除",但其都没有.可以发现目前这个搜藏中的url仍然正常返回200,http://cang.baidu.com/Lee/snap/3b0a0

ASP.NET中最保险最环保的返回404的方法

代码如下: Response.StatusCode = 404; Response.SuppressContent = true; Context.ApplicationInstance.CompleteRequest(); 1. 只返回404 Status Code,自定义404页面在IIS的Error Pages中配置. <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath"> &

springMVC项目国际化(i18n)实现方法

SpringMVC项目国际化(i18n)实现方法 按照作息规律,每周五晚必须是分享知识的时间\(^o^)/~,这周讲点儿啥呢,项目需要逼格,咱们国际化吧(* ̄rǒ ̄)~,项目中碰到这类需求的童鞋可能并不多,但偶尔用到也会比较费时间滴;-),不如驻足本帖片刻吧︿( ̄︶ ̄)︿ 额,嗯~,记得一开始从事软件开发时在一个很轻量级的项目中碰到了一个貌似叼炸天的需求,什么?国际化?没听说过,不知道怎么玩儿...,谷歌翻帖快一周,大神们的神贴也看了许久,可就是解决不了我的项目需求,怎么办,加大神Q骚扰之~~(

shiro+SpringMVC 项目 配置404页面

说的配置404,大家都会想到去web.xml里面配置 <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> 可是如果我有业务需求,当发生404,我要记录相关信息呢?或者说404的展示页面我也有需要动态获取的资源呢?那么静态页面就力不从心了. 那么先写一个处理404的方法 //404 @RequestMapping(v

关于继承时子类重写父类方法和覆盖父类变量的若干问题

假设,子类重载父类的方法,并将子类的成员覆盖. 创建子类对象实例,将其上转型成父类. 例子1 public class Parent { public void init() { System.out.println("1 init parent"); this.demo(); } public void demo() { System.out.println("2 demo parent"); } } public class Son extends Parent

springmvc中针对一个controller方法配置两个url请求

springmvc中针对一个controller方法配置两个url请求 标签: spring mvc孙琛斌 2015-12-10 17:10 2189人阅读 评论(0) 收藏 举报  分类: Spring(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. 记录一个小知识点. 某些应用场景>..你可能需要不同的url请求得到相同的结果,那么你写两个方法总是不太好的,使用下面的方法可以解决这个问题. @RequestMapping(value = { "/item/index.ht

JS 省市区级联 修改地址操作时的默认选中方法

省市区级联JS控件 下载地址http://files.cnblogs.com/bin-pureLife/%E5%B0%8F%E5%9B%BE%E6%A0%87.zip function update(province,city,county){ $("#s_province option").each(function(){ if($(this).val()==province){ $(this).attr('selected',true) change(1); } }); $(&qu

iOS 运行时添加属性和方法

原文链接http://blog.csdn.net/meegomeego/article/details/18356169第一种:runtime.h里的方法 BOOL class_addProperty(Class cls,constchar*name,constobjc_property_attribute_t*attributes,unsignedint attributeCount) #include <objc/runtime.h> #import <Foundation/Foun

web项目启动时,执行某个方法

1.监听(Listener) web文件添加 <listener> <listener-class>cn.ro.common.InitListener</listener-class> </listener> 添加InitListener类,如下 package cn.ro.common; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener