使用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的方法的更多相关文章
- springMVC项目国际化(i18n)实现方法
SpringMVC项目国际化(i18n)实现方法 按照作息规律,每周五晚必须是分享知识的时间\(^o^)/~,这周讲点儿啥呢,项目需要逼格,咱们国际化吧(* ̄rǒ ̄)~,项目中碰到这类需求的童鞋可能并 ...
- 《SpringMVC从入门到放肆》十一、SpringMVC注解式开发处理器方法返回值
上两篇我们对处理器方法的参数进行了分别讲解,今天来学习处理器方法的返回值. 一.返回ModelAndView 若处理器方法处理完后,需要跳转到其它资源,且又要在跳转资源之间传递数据,此时处理器方法返回 ...
- angular当router使用userhash:false时路由404问题
angular当router使用userhash:false时路由404问题 安装iis urlrewrite2.0组件 在根目录下创建 Web.config <configuration> ...
- shiro+SpringMVC 项目 配置404页面
说的配置404,大家都会想到去web.xml里面配置 <error-page> <error-code></error-code> <location> ...
- TP框架中ajax post请求时提示404
ajax post请求时提示404错误 TP框架中ajax post请求时提示404 找了半天是 控制器中方法有错误! 下次再遇到去控制器方法中找一步一步找,肯定能找到,我是单词拼错了!
- 应用springMVC时如果配置URL映射时如下配置
应用springMVC时如果配置URL映射时如下配置 [html] view plaincopy<servlet> <servlet-name>appServlet</s ...
- tornado 重定向404(方法不对)
application = tornado.web.Application(url_wrapper([ (r"", include('app.views.web_services. ...
- IIS7或者IIS7.5部署MVC项目时出现404错误
IIS7或者IIS7.5部署MVC项目时出现404错误 服务器上需要安装Windows 补丁 kb980368 下载链接:http://support.microsoft.com/kb/980368
- Win7与Ubuntu双系统时卸载Ubuntu的方法
Win7与Ubuntu双系统时卸载Ubuntu的方法 [日期:2010-03-26] 来源:Ubuntu社区 作者:Ubuntu编辑 [字体:大 中 小] 1. 下载MBRFix工具,放 ...
随机推荐
- HDOJ 1196 Lowest Bit
题目大意是给一个1-100的整数,要求首先转化成2进制,然后从最低位开始数起到不是0的位停止,输出这些位代表队额10进制数 #include <iostream> using namesp ...
- JavaPersistenceWithMyBatis3笔记-第2章Bootstrapping MyBatis-001XMl形式和Java形式
一. 1.Mapper 同上 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper ...
- 1用java实现冒泡排序算法以及解决的几个小问题。
package huawei.exam; public class BubbleSort { /** * @param args */ public static void main(String[] ...
- CF 671D Roads in Yusland
弄完之后点进去一看,竟然是div1的D题……最近真是天天被题虐哭 推荐这一篇博客 https://www.cnblogs.com/Sakits/p/8085598.html 感觉讲清楚了,也是基本照着 ...
- Luogu 1357 花园
发现$m$很小,直接状压起来,可以处理出一开始的合法的状态. 对于每一个合法的状态,可以处理出它的转移方向,即在后面填一个$1$或者填一个$0$,反着处理比较方便. 考虑一下环的情况,在这题中有一个小 ...
- 总结:kathasis如何发送get请求获取数据
1.进入前端页面,找到对应的模块,开始塞字段数据. 2.如果字段为基本类型,如String,比如website,则在前段界面,右击,inspect,找到对应的代码所处的jsp,跳转到该jsp,通过该j ...
- 《Linux内核设计与实现》读书笔记(九)- 内核同步介绍
存在共享资源(共享一个文件,一块内存等等)的时候,为了防止并发访问时共享资源的数据不一致,引入了同步机制. 主要内容: 同步的概念 同步的方法-加锁 死锁 锁的粒度 1. 同步的概念 了解同步之前,先 ...
- JetBrains WebStorm 如何从GitHub上克隆的代码
工作中经常会遇到要从GitHub上拉代码,详细操作记录如下: 绑定账号 1.File->Settings->Version Control->Github 成功后会出现下面的这个账户 ...
- WGestures鼠标手势快捷手势介绍
1.官方网站 WGestures 2.快截图 3.自定义快捷键列表
- JS图片转Base64
网络上有很多片介绍通过js将图片转换成base64的文章,之所以再写这篇文章的原因时发现没有找到系统的介绍的文章,有的介绍如何实现本地项目的图片转码,有的介绍如何实现网络资源的图片转化,但是系统介绍的 ...