本篇内容介绍了“Spring MVC标签<mvc:default-servlet-handler/>有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在Spring MVC框架中,针对静态资源的请求处理的常见策略有两种:1. 配置< mvc:default-servlet-handler />标签,通过容器来处理;2. 配置< mvc:resources />标签,通过框架来处理。
从Spring MVC的XML Schema文件说明中可以知道,通过< mvc:default-servlet-handler />标签的配置可以使DispatcherServlet在声明过滤路径为"/"时,依旧使用容器中默认的Servlet来处理静态资源请求。在整个处理过程中,会声明注册DefaultServletHttpRequestHandler类来进行从MVC框架到容器Servlet的转发处理。
通过该处理策略弥补了Spring MVC框架对处理静态资源时的不足,可以有效提升静态资源的请求处理效率。同时又兼顾了框架对请求统一管理的需求,并能够时请求的URL命名更符合REST风格,降低人工配置请求后缀名来进行请求分类的管理成本。
在DefaultServletHttpRequestHandler类中声明了诸如Tomcat, Jetty, JBoss, GlassFish以及WebLogic, WebSphere等容器中默认Servlet的命名。在系统启动时,通过匹配容器中的RequestDispatcher类来进行注册。
public void setServletContext(ServletContext servletContext) { this.servletContext = servletContext; if (!StringUtils.hasText(this.defaultServletName)) { if (this.servletContext.getNamedDispatcher(COMMON_DEFAULT_SERVLET_NAME) != null) { this.defaultServletName = COMMON_DEFAULT_SERVLET_NAME; } else if (this.servletContext.getNamedDispatcher(GAE_DEFAULT_SERVLET_NAME) != null) { this.defaultServletName = GAE_DEFAULT_SERVLET_NAME; } else if (this.servletContext.getNamedDispatcher(RESIN_DEFAULT_SERVLET_NAME) != null) { this.defaultServletName = RESIN_DEFAULT_SERVLET_NAME; } else if (this.servletContext.getNamedDispatcher(WEBLOGIC_DEFAULT_SERVLET_NAME) != null) { this.defaultServletName = WEBLOGIC_DEFAULT_SERVLET_NAME; } else if (this.servletContext.getNamedDispatcher(WEBSPHERE_DEFAULT_SERVLET_NAME) != null) { this.defaultServletName = WEBSPHERE_DEFAULT_SERVLET_NAME; } else { throw new IllegalStateException("Unable to locate the default servlet for serving static content. " + "Please set the 'defaultServletName' property explicitly."); } } }
当请求抵达该Handler类时会直接调用对应的RequestDispatcher来forward转发请求至容器处理请求。
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher rd = this.servletContext.getNamedDispatcher(this.defaultServletName); if (rd == null) { throw new IllegalStateException("A RequestDispatcher could not be located for the default servlet '" + this.defaultServletName + "'"); } rd.forward(request, response); }
由此完成从MVC框架到容器的请求转发与处理。
除了可以通过使用DefaultServletHttpRequestHandler类中默认提供的容器,同样可以通过default-servlet-name属性来配置运行容器中默认Servlet的命名,以达到灵活配置并满足在任意Java Web容器中运行的需求。
由于在该配置下,预期是DispatcherServlet拦截的全部请求若无对应的Handler进行处理时,会转发到容器中的默认的Servlet进行处理。因此,将其他自定义的Handler中配置的URL HandlerMappings的order值小于DefaultServletHttpRequestHandler类的order值Integer.MAX_VALUE是非常重要的,以避免URL在匹配时无法满足预期。
“Spring MVC标签<mvc:default-servlet-handler/>有什么作用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。