• 三思考,实现自己定义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方法。
      

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

  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4889997.html
Copyright © 2020-2023  润新知