10.解读{url-pattern}
10.解读
tomcat的web.xml文件有一个servlet 名称是 default , 在服务器启动时创建的。
default这个servlet作用:
1.处理静态资源
2.处理未映射到其它servlet的请求
tomcat本身能处理静态资源的访问, 像html, 图片, js文件都是静态资源
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <!--表示静态资源和未映射的请求都这个default处理--> <url-pattern>/</url-pattern> </servlet-mapping>
在WEB-INF目录下web.xml文件中如果配置了url-pattern
<servlet-mapping> <servlet-name>myweb</servlet-name> <!-- 使用框架的时候, url-pattern可以使用两种值 1. 使用扩展名方式,语法 *.xxxx,xxxx是自定义的扩展名。常用的方式 *.do, *.action, *.mvc等等 不能使用 *.jsp http://localhost:8080/myweb/some.do http://localhost:8080/myweb/other.do 2.使用斜杠 "/" 当你的项目中使用了 / ,它会替代 tomcat中的default。 导致所有的静态资源都给DispatcherServlet处理,默认情况下DispatcherServlet没有处理静态资源的能力。 没有控制器对象能处理静态资源的访问。所以静态资源(html,js,图片,css)都是404. 动态资源some.do是可以访问,的因为我们程序中有MyController控制器对象,能处理some.do请求。 --> <url-pattern>/</url-pattern> </servlet-mapping>
10.1 第一种{mvc:default-servlet-handler}处理静态资源方式:
spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- default-servlet-handler 和 @RequestMapping注解有冲突,需要加入annotation-driven解决问题--> <mvc:annotation-driven /> <!--第一种处理静态资源的方式: 需要在springmvc配置文件加入 <mvc:default-servlet-handler> 原理是:加入这个标签后,框架会创健控制器对象DefaultServletHttpRequestHandler(类似我们自己创建的MyController) DefaultServletHttpRequestHandler这个对象可以把接收的请求转发给tomcat的default这个servlet。 --> <mvc:default-servlet-handler /> </beans>
当只加入{mvc:default-servlet-handler}会将所有请求都转发给tomcat中default的servlet,导致我们的Controller中处理器方法不能被请求执行,需要加入{mvc:annotation-driven}注解驱动解决冲突问题。
同时 {mvc:default-servlet-handler} 存在依赖服务器的defalut的servlet缺点。
{default-servlet-handler} 和 @RequestMapping注解有冲突说明:
1.当静态资源和注解驱动两种标签都没有的时候,框架默认注册的有AnnotationMethodHandlerAdapter这个bean,所以能够处理@RequestMapping这个注解。
2.但是只配置了{mvc:default-servlet-handler/}时所注册的两个bean都不能处理@RequestMapping注解,因此无法找到相应的Controller,进而无法进行访问路径的映射,
3.当两种标签都有的时候,{mvc:annotation-driven}会注册一个RequestMappingHandlerAdapter的bean,这个bean能够处理@RequestMapping这个注解。
10.2 第二种{mvc:resources}处理静态资源方式
在 Spring3.0 版本后, Spring 定义了专门用于处理静态资源访问请求的处理器ResourceHttpRequestHandler。并且添加了{mvc:resources/}标签,专门用于解决静态资源无法访问问题。
spring配置文件
<!--第二种处理静态资源的方式 mvc:resources 加入后框架会创建 ResourceHttpRequestHandler这个处理器对象。 让这个对象处理静态资源的访问,不依赖tomcat服务器。 mapping:访问静态资源的uri地址,使用通配符 ** location:静态资源在你的项目中的目录位置。 images/**:表示 images/p1.jpg , images/user/logo.gif , images/order/history/list.png --> <mvc:resources mapping="/images/**" location="/images/" /> <mvc:resources mapping="/html/**" location="/html/" /> <mvc:resources mapping="/js/**" location="/js/" /> <!--mvc:resources和@RequestMapping有一定的冲突--> <mvc:annotation-driven /> <!-- 上面方式需要写多个标签配置。 把所有需要访问的静态资源都放在static目录下,使用一个配置语句,指定多种静态资源的访问 --> <!--<mvc:resources mapping="/static/**" location="/static/" />-->
本文来自博客园,作者:Lz_蚂蚱,转载请注明原文链接:https://www.cnblogs.com/leizia/p/15173513.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步