目录
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方法,这个方法是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对于url的匹配采用的是一种叫做“最精确匹配的方式”,举个例子:
比如我们同时定义了“/test/a”, "/test/*",那么若请求的url结尾为/test/a,那么则会匹配精确的那个,也就是"/test/a"
我们是不是可以利用这个特点来找到那些找不到的页面?
1、首先我们定义一个拦截所有url的规则@requestMapping("*"),那么实际上不存在找不到的页面了,也就是永远不会进入noHandlerFound方法体内。
2、后面的步骤和平时一样,为别的请求都配置上@requestMapping。
那么请求过来,要么进入我们精确匹配的method(也就是找的到的),要么。进入@requestMapping("*)拦截的方法体内(也就是找不到的)。
那么我们只要让@requestMapping("*)拦截的这个方法返回一个自定义的404界面就OK了~
还记得之前提到的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。
转自:https://blog.csdn.net/u012345283/article/details/39718245
注:排版等略有修改。
C语言头文件如何避免重复包含一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的'头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含。大家知道C语言头文件如何避免重复包含吗?下面是小编为大家搜索整理的C语言头文件如何避免重复包含,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考...
学习安卓的五大布局
此代码只适用微软的Office Excel软件,WPS软件没有测试,而且WPS宏代码是收费功能。在Excel菜单点击【开发工具】-【查看代码】进入VBA代码编写界面,然后点击【插入】-【模块】,把下面的代码复制到代码编写区域内,然后保存。在点击代码界面上边的绿色小箭头运行代码就可以进行拆分表格了。Sub ZheFenSheet() Dim r, c, i, WJhangshu, WJshu, bt As Long r = Range("A" & Rows.Count).E
接触Qt一年左右,还算个新手。刚刚一直纠结于如何在等待Qt对话框结束后获得对话框的数据,现在终于搞定了。ImageSelection *imSelection=new ImageSelection(this); if(imSelection->exec()==QDialog
刚开始win10的问题是插上耳机无法识别,百度了一番,下载驱动精灵,结果还是没有识别出声卡驱动的安装,只有个nvidia high definition Audio的升级,升级后也还是没有解决,又开始各种百度。1/问题一:音频服务未响应,window+R弹出框中输入services.msc打开服务界面windows audio 依赖下面的endpoint builder服务,所以先检查endpoint builder服务是否开启了,开启后再启动windows audio服务,不管是启动还是重新启
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。
文章目录1. 概述2. FastDFS2.1 架构图2.2 相关概念2.2.1 tracker server2.2.2 storage server2.2.3 client2.3 优缺点2.4 上传下载交互过程2.6 文件ID-FID3. 文件系统的对比4. 安装部署4.1 docker安装4.2 本地安装1. 概述通过独立文件服务器可以解决一些问题,如果某天存储文件的那台服务突然down了怎么办?可能你会说,定时将文件系统备份,这台down机的时候,迅速切换到另一台就OK了,但是这样处理需要人工来干预
映维网2020年05月16日)FacebookReality Labs(FRL)致力于构建一个现实世界和虚拟世界能够自由混合,同时提升我们日常生活体验,增加效率和加强彼此之间联结的未来。续航是迈向所述愿景的挑战之一。为了能够实现能够长时间(包括一整天)舒适穿戴的虚拟现实头显和增强现实眼镜,我们必须优化设备的功耗。作为朝构建下一阶段AR/VR系统的一步,这家实验室正努力开发不影响图像质量的情况下显著降低功耗的图形系统。DeepFovea是FRL为应对这一挑战而开发的数种基于神经网络的方法之一。De..
因为项目中有需要实现控件可任意拖拽的需求,所以简单写了个自定义OnTouchListener,以作抛砖引玉,欢迎大家提议反馈。完整实现类如下,代码中有详细注释: 用户可以决定是否开启自动拖拽边缘功能,可以监听控件的拖拽和点击事件public class OnDragTouchListener implements View.OnTouchListener {private int mScreenW...
类加载子系统完整图类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。(例如:CA FE BA BY)ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)class fi
因为负载生成器的性能太好,发数据包特别快,服务器也响应特别快,从而导致负载生成器的机器的端口在没有timeout之前就全部占满了。在全部占满后,就会出现上面的错误。执行netstat –na命令,可以看到打开了很多端口。所以就调整TCP的time out。即在最后一个端口还没有用到时,前面已经有端口在释放了。成功的解决方法:在注册表HKEY_LOCAL_MACHINE\SYSTEM\C
1.在本地Windows系统的C:\Windows\Fonts目录下,可以拿到“宋体”格式的文件simsun.ttc2.在Linux服务器上输入echo $JAVA_HOME,找到服务器上jdk的存放路径,/usr/lib/jvm/jdk/jdk1.7.0_673.cd /usr/lib/jvm/jdk/jdk1.7.0_67/jre/lib/fonts可进入到jdk路径的fonts目录下, 新建一个文件夹mkdir newfont4.将simsun.ttc文件复制到newfont文件里;5.将字体