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

第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方法。

参考资料:http://blog.csdn.net/u012345283/article/details/39718245

时间: 2024-10-08 08:09:19

三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet的相关文章

三种思路实现自定义404页面

如何定义404 404,说白了就是找不到页面,那么如何定义"找不到"呢? 我们可以通过源代码来看看Spring MVC如何定义"404"的: // Determine handler for the current request. mappedHandler = getHandler(processedRequest, false); if (mappedHandler == null || mappedHandler.getHandler() == null)

Android 三种方式实现自定义圆形页面加载中效果的进度条

转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如下: [java] view plaincopy <?xml version="1.0" encoding="UTF-8"?> <animation-list android:oneshot="false" xmlns:androi

Apache服务器自定义404页面的两种方法以及.htaccess的重要命令总结

Apache服务器自定义404错误页面有两种方法: 第一种方法最简单,直接在Apache的httpd.conf下进行配置修改命令,修改的内容请参看.htaccess命令写法中的自定义错误页面 第二种方法可以在.htaccess文件中配置命令,具体操作请参看.htaccess命令写法中的自定义错误页面 .htaccess使用方法总结 1 . 首先让的本地APACHE服务器器允许.htaccess修改 打开httpd.conf (1) Options FollowSymLinks AllowOver

Web---演示Servlet的相关类、下载技术、线程问题、自定义404页面

Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代表用户的请求. ServletResponse – 代表用户的响应. HttpSession – 代表用户的一次会话. 本篇博客演示:ServletConfig类 和 ServletContext 类(网页点击量统计,留言板和图片下载技术(其他类型文件类似)) ServletConfig: 它包含了Serv

JavaWeb 自定义404页面

本来,Tomcat中自定义404页面不过是在web.xml文件中写4行代码的事情. 直接引用 Tomcat官方FAQ 怎样自定义404页面? 编辑web.xml 1 <error-page> 2 <error-code>404</error-code> 3 <location>/error/404.html</location> 4 </error-page> 运气好的话,就能看到结果了. 运气好的话,我就不会折腾一个上午都没见到结果

IIS配置404页面配置,IIS自定义404页面

.NET 环境下 用到404页的场景一般有两种: 场景一:报黄页,程序性的错误,代码层可以捕捉到的. 场景二:用户输入不存在的页面,代码层捕捉不到的. IIS 默认会有404的配置,不过这种呈现出的都不好,而且也不能引流,影响用户体验! 所以,我们可以进行自定义404页面,方法如下: 准备一个404页面,如404.aspx,建议放在网站跟目录下 我们可以通过web.config进行配置: 场景一的配置: <system.web> <customErrors mode="On&q

NGINX下如何自定义404页面

什么是404页面 如果碰巧网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是NGINX服务器,那么404页面的内容则为:404 Not Found 为什么要自定义404页面 在访问时遇到上面这样的404错误页面,我想99%(未经调查,估计数据)的用户会把页面关掉,用户就这样悄悄的流失了.如果此时能有一个漂亮的页面能够引导用户去他想去的地方必然可以留住用户.因此,每一个网站都

求一个数的最大公约数的三种思路——解题笔记

求一个数的最大公约数的三种思路--解题笔记 编程之美上的题目:求一个数的最大公约数. 这道题目有三种解题思路,总结如下: 思路一: 直接使用辗转相除法,这个不多介绍,代码如下: // 直接辗转相除法 int gcd1(int a, int b) { for(int m = a%b; m != 0; m = a%b) { a = b; b = m; } return b; } 分析:辗转相除法需要用到数值之间的取余运算,这是非常耗时间的. 思路二: 改进辗转相除法中取余(除法)运算,改为减法.这里

【Android进度条】三种方式实现自定义圆形进度条ProgressBar

一.通过动画实现 定义res/anim/loading.xml如下: [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <animation-list android:oneshot="false" xmlns:android="http://schemas.android.com/apk/res/android"> &