Spring中/與/*的區別

版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/104819575




我是在整合 SSM 框架時發現的問題,這個問題以前我從沒深究過它 —— //* 的區別。

學過 Spring MVC 的小夥伴們肯定還記得,我們在配置 前端控制器字符集過濾器 時,通常在 web.xml 中是這樣配置的:

<!-- 前端控制器 -->
<servlet>
	<servlet-name>mvc-dispatcher</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:springmvc.xml</param-value>
	</init-param>
</servlet>

<servlet-mapping>
	<servlet-name>mvc-dispatcher</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> 配置的是 /*,也將過濾所有請求。不細看的話,它們好像作用都一樣,那麼大家有沒有想過既然都是攔截或過濾所有請求,那麼爲什麼寫法會不同呢?

關於這個問題我在網上查了很多資料,基本上他們的回答要麼抄襲要麼回答不全面,或者有人都不屑回答這樣問題(他們認爲沒有必須研究這個問題),經過我認真的推敲,有些人的答案還是可以借鑑的。

這個問題我們可以回到最原始的 ServletFilter,因爲 前端控制器 就是一個 Servlet字符集過濾器 就是一個 Filter,我從這方面下手,嘗試寫了幾個 Demo,發現其實 //* 分別在 ServletFilter 中有不同的意義。並得出下列 結論

1、Servlet

  • / :它會匹配所有的路徑,但是不會匹配到像 .jsp 這樣的頁面。如:

    • http://localhost:8080/webdemo/hello(會匹配);
    • http://localhost:8080/webdemo/hello/abc(會匹配);
    • http://localhost:8080/webdemo/hello/world.html(不會匹配)。

    你會發現只要後面有 .xxx 都不會被匹配到。

  • /* :它會匹配所有的路徑和頁面,上述的例子均會被匹配到。

2、Filter

  • / :它會過濾根目錄,而且只會過濾根目錄,不會過濾其他路徑;
  • /* :它會過濾全部請求,也包括根目錄。


博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,並肩前行!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章