使用springmvc时处理404的方法

来源: https://www.cnblogs.com/handsome-man/p/5519439.html,再次申明不是我原创的,尊重原创

如何定义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

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

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

    SpringMVC项目国际化(i18n)实现方法 按照作息规律,每周五晚必须是分享知识的时间\(^o^)/~,这周讲点儿啥呢,项目需要逼格,咱们国际化吧(* ̄rǒ ̄)~,项目中碰到这类需求的童鞋可能并 ...

  2. 《SpringMVC从入门到放肆》十一、SpringMVC注解式开发处理器方法返回值

    上两篇我们对处理器方法的参数进行了分别讲解,今天来学习处理器方法的返回值. 一.返回ModelAndView 若处理器方法处理完后,需要跳转到其它资源,且又要在跳转资源之间传递数据,此时处理器方法返回 ...

  3. angular当router使用userhash:false时路由404问题

    angular当router使用userhash:false时路由404问题 安装iis urlrewrite2.0组件 在根目录下创建 Web.config <configuration> ...

  4. shiro+SpringMVC 项目 配置404页面

    说的配置404,大家都会想到去web.xml里面配置 <error-page> <error-code></error-code> <location> ...

  5. TP框架中ajax post请求时提示404

    ajax post请求时提示404错误 TP框架中ajax post请求时提示404 找了半天是 控制器中方法有错误! 下次再遇到去控制器方法中找一步一步找,肯定能找到,我是单词拼错了!

  6. 应用springMVC时如果配置URL映射时如下配置

    应用springMVC时如果配置URL映射时如下配置 [html] view plaincopy<servlet> <servlet-name>appServlet</s ...

  7. tornado 重定向404(方法不对)

    application = tornado.web.Application(url_wrapper([ (r"", include('app.views.web_services. ...

  8. IIS7或者IIS7.5部署MVC项目时出现404错误

    IIS7或者IIS7.5部署MVC项目时出现404错误 服务器上需要安装Windows 补丁 kb980368  下载链接:http://support.microsoft.com/kb/980368

  9. Win7与Ubuntu双系统时卸载Ubuntu的方法

    Win7与Ubuntu双系统时卸载Ubuntu的方法 [日期:2010-03-26] 来源:Ubuntu社区  作者:Ubuntu编辑 [字体:大 中 小]       1. 下载MBRFix工具,放 ...

随机推荐

  1. PCL—点云分割(超体聚类) 低层次点云处理

    博客转载自:http://www.cnblogs.com/ironstark/p/5013968.html 1.超体聚类——一种来自图像的分割方法 超体(supervoxel)是一种集合,集合的元素是 ...

  2. 前端学习笔记2017.6.12 DIV布局网页

    DIV的功能就是把网页划分成逻辑块的. 看下豆瓣东西页面的布局,我们来分析下. 按照先从上到下的原则,把这个页面分成几个块: 首先是最顶端的这个条,这是一个DIV,我们给它起个名字,叫banner 然 ...

  3. Java的get请求-----接口测试

    package findyou.Interface; import java.net.HttpURLConnection; import java.net.URL; public class URLC ...

  4. easyui 展开缩起

    1.引用jquery-easyui-1.4.4/datagrid-detailview 2.增加属性 view: detailview, detailFormatter: function (rowI ...

  5. 关于jquery.extend()的坑:我的数组变成相同元素了?

    首先呢我有一个数组,存放了多个json对象.这些json对象的属性有缺失,我设置了一个对象模板来存放默认值 先来看一段代码 var source = [ { name: 'dapianzi', bor ...

  6. 【沽泡学院07】基于ElasticSearch搜索附近的人

    1. 为什么要选择ElasticSearch 1)ElasticSearch 优点: 分布式.实时的.Push replication 完全支持Apache Lucene的接近实时的搜索 处理多租户( ...

  7. 转载JAVA八大经典书籍,你看过几本?

    一.Java从入门到精通*<Java从入门到精通(第3版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识.<Java从入 ...

  8. ABAP开发常见任务

    在ABAP开发中 最主要的工作: 1 报表的开发 主要使用到数据库读取 ALV LIST等技术: 2 单据的打印 主要使用到数据库读取.SmartFirms.Form等技术: 3 数据的上载 主要使用 ...

  9. 开窗函数Over用法

    比如我们有这个表: 销售记录表 日期 姓名 产品 销售额 201601 A 电脑 12560 201601 A 手机 6501 201601 A 平板 8510 201602 A 手机 1560 20 ...

  10. 记一次IIS应用程序域崩溃的原因

    在日常工作中,每次新的功能上线前,我们会搭建一个测试环境提供给客户测试使用,确定无误后才会更新到正式环境上.这一次也不例外,在约定好时间地点,客户进行集中化测试的过程中,反应网站系统打不开,报500错 ...