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/" />-->
posted @   Lz_蚂蚱  阅读(454)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起