今天在编写配置文件web.xml时,发现在 前端控制器 和 字符集过滤器中,过滤的内容很相似,但是有所不同。以下是相关代码:
<servlet>
<!-- 配置前端过滤器 -->
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 初始化时加载配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!-- 表示容器在启动时立即加载Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
不知道大家有没有发现,在前端控制器 中 <url-pattern> 配置的是 /,将拦截所有请求;字符集过滤器中<url-pattern> 配置的是 /*,也将过滤所有请求。看起来作用是一样的,但是为什么是不同写法呢?查阅资料之后,得到以下原因。
这个问题我们可以回到最原始的 Servlet 和 Filter,因为前端控制器就是一个 Servlet,字符集过滤器就是一个 Filter,我从这方面下手,尝试写了几个 Demo,发现其实 / 和 /* 分别在 Servlet 和 Filter 中有不同的意义。并得出下列结论:
1、Servlet
/ :它会匹配所有的路径,但是不会匹配到像 .jsp 这样的页面。如:
http://localhost:8080/chapter13/toOrders(会匹配);
http://localhost:8080/chapter13/toOrders.jsp(不会匹配)。
你会发现后面有 .jsp 不会被匹配到。
/* :它会匹配所有的路径和页面,上述的例子均会被匹配到。
2、Filter
/ :它会过滤根目录,而且只会过滤根目录,不会过滤其他路径;
/* :它会过滤全部请求,也包括根目录。