第1种方式:Tomcat直接处理
web.xml
<error-page>
<error-code>404</error-code>
<location>/error/404.htm</location>
</error-page>

这样的仅仅能展示纯静态的页面,很不灵活。

第2种方式:利用Spring MVC的最精确匹配
@Controller
public class UrlNotFoundController {
@RequestMapping("*")
public String test404(){
//TODO
return "404Page";
}
}

在网上找到这样的方法。利用SpringMVC的精确匹配,从而在其他Controller找不到相应请求的时候。来处理404。
可是,这样的方式也有问题,仅仅能拦截一部分。
比方,假设有这个一个Controller
@Controller("/home")
public class HomeController{
@RequestMapping("a")
public String a(){
//
}
}

直接訪问: http://localhost:8080/b.html,会被UrlNotFoundController处理。
可是http://localhost:8080/home/b.html,就不会被UrlNotFoundController处理。
这说明。通过精准匹配也是有局限性的。

第3种方式:自己定义org.springframework.web.servlet.DispatcherServlet。重载noHandlerFound方法。
<servlet>
<servlet-name>theDispatcher</servlet-name>
<servlet-class>base.web.MyDispatchServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc-servlet.xml</param-value>
</init-param>
<init-param>
<param-name>fileNotFondUrl</param-name>
<param-value>/error/404</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>theDispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

public class MyDispatchServlet extends DispatcherServlet {

	private static final long serialVersionUID = 1L;

	private static final UrlPathHelper urlPathHelper = new UrlPathHelper();

	private String fileNotFondUrl = "/error/404.html";

	public void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (pageNotFoundLogger.isWarnEnabled()) {
String requestUri = urlPathHelper.getRequestUri(request);
pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +
"] in DispatcherServlet with name '" + getServletName() + "'");
} response.sendRedirect(request.getContextPath() + fileNotFondUrl);
} public String getFileNotFondUrl() {
return fileNotFondUrl;
} public void setFileNotFondUrl(String fileNotFondUrl) {
this.fileNotFondUrl = fileNotFondUrl;
} }

默认的DispatchServlet的noHandlerFound方法。
protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (pageNotFoundLogger.isWarnEnabled()) {
String requestUri = urlPathHelper.getRequestUri(request);
pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +
"] in DispatcherServlet with name '" + getServletName() + "'");
}
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
直接返回HTTP404。
特别须要说明的是:
  自己定义之后,不能再使用
  <!-- <mvc:default-servlet-handler /> -->
  
  通常情况下。使用这个配置,能够让SpringMVC相应js、css等静态页面,在合适的路径,自己主动去找。

  凝视之后,就仅仅能手动响应静态资源等请求了。
  2种方式:
  第1种:Tomcat处理。
  配置
  <servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>

  
  第2种:SpringMVC处理
  <mvc:resources mapping="/kindeditor/upload/image/**"
location="file:${kindeditorImagePath}/kindeditor/upload/image/**" />
  
  假设使用了“<mvc:default-servlet-handler />”
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
  DispatchServlet上述代码的mappedHandler就不为空了。因此无法进入noHandlerFound方法。
  

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

三思考,实现自己定义404页:Tomcat、SpringMVC精确匹配、重写DispatchServlet的更多相关文章

  1. 三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet

    第1种方式:Tomcat直接处理 web.xml <error-page> <error-code>404</error-code> <location> ...

  2. Apacheserver自己定义404页面的两种方法以及.htaccess的重要命令总结

    Apacheserver自己定义404错误页面有两种方法: 第一种方法最简单,直接在Apache的httpd.conf下进行配置改动命令,改动的内容请參看.htaccess命令写法中的自己定义错误页面 ...

  3. SharePoint 2013 设置自己定义布局页

    在SharePoint中.我们常常须要自己定义登陆页面.错误页面.拒绝訪问等:不知道大家怎样操作,曾经自己常常在原来页面改或者跳转.事实上SharePoint为我们提供了PowerShell命令,来改 ...

  4. ajax json 表格排序,分页,自己定义每页数量

    ajax json 表格排序.分页,自己定义每页数量  点击表头能够排序.依照升序或者降序,另外支持多列排序 设置每页数量 演示   XML/HTML Code <table id='examp ...

  5. 十六:SpringBoot-自定义启动页,项目打包和指定运行环境

    SpringBoot-自定义启动页,项目打包和指定运行环境 1.自定义启动页 2.打包配置 2.1 打包pom配置 2.2 多环境配置 3.环境测试接口 4.打包执行 4.1 指定模块打包 4.2 运 ...

  6. 创建一个People类型,有年龄、工资、性别三个属性。 定义一个方法叫做找对象,找对象方法传过来一个人;

    创建一个People类型,有年龄.工资.性别三个属性. 定义一个方法叫做找对象,找对象方法传过来一个人: 首先如果性别相同,就输出"我不是同性恋", 如果对方是男的,年龄小于28, ...

  7. Nginx反向代理+Tomcat+Springmvc获取用户访问ip

    Nginx+Tomcat+Springmvc获取用户访问ip 1.Nginx反向代理 修改Nginx配置文件 location / { ***********之前代码*******; proxy_se ...

  8. mysql innodb 数据打捞(三)innodb 簇不连接页的扫描提取(计划)

    操作系统簇大小一般是4K,而innoDB的页大小一般是16K,那么就有可能16K的页没有存储在连续的簇中,这样扫描软件就不会扫描出来这样的页面.为了解决这个问题,决定给软件增加半页扫描功能. 在第一次 ...

  9. eclipse 404以及tomcat failed to start错误

    eclipse中的servlet项目有时会不编译,不编译可能就会出现404错误,因为在build path的输出目录并没有class文件,然而如果在输出目录引入之前编译的class文件,就可能出现cl ...

随机推荐

  1. Base64实现android端图片上传到server端

    首先要下载Base64.java文件http://iharder.sourceforge.net/current/java/base64/ 将代码复制到project中. 然后上代码: android ...

  2. Ice-2.1.2在RHEL Server 5.5上的安装

         因为项目的需要,服务器上的程序需要使用Ice接口与其它程序通信,对方提供了一个Windows版的工程,我要把它移植到Linux服务器上,既然Ice是跨平台跨语言的中间件,想来移植不是很困难, ...

  3. 解决backgroud:transparent在低版本浏览器中的bug

    今天在html页面上定义了一个button和一个div,大小相同,button使用绝对定位,覆盖在div上面一层,同时样式设置背景透明(background:transparent). 这样就可以在看 ...

  4. Java中读取某个目录下的所有文件和文件夹

    import java.io.File; public class Test1 { public static void main(String[] args) { String path=" ...

  5. Java虚拟机几个命令行参数说明

    一.运行class文件 执行带main方法的class文件,Java虚拟机命令参数行为: java <CLASS文件名> 注意:CLASS文件名不要带文件后缀.class 例如: java ...

  6. Class ThreadPoolExecutor

    Class ThreadPoolExecutor java.lang.Object java.util.concurrent.AbstractExecutorService java.util.con ...

  7. 采用keepalived施工可用性MySQL-HA

    描述了使用keepalived施工可用性MySQL-HA,两个保证MySQL数据一致性,然后,keepalived虚拟IP,经keepalived内置的在线监测功能来实现MySQL. AD: 关于My ...

  8. uip UDPclient模式通信移植,当地port随机

    现在移植UDPclient模式,测试广播地址. //udp_client.c /************************************************************ ...

  9. SQL注入的原理解说,挺好!

    原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 总结 前几天,国内最大的程序猿社区CSDN网站的用户数据库 ...

  10. Sqlserver中Over函数

    Over函数不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用.  其参数:over(partition by columnname1 order ...