SpringMVC中url-pattern /和/*的區別
學習Spring的時候,在配置web.xml的時候,把url-pattern 配置成/*,啟動專案後去訪問自己的Controller總是報404.檢查了很多發現資源是存在的,配置的地址也沒有問題,為什麼會出現404錯誤呢?最後發現是自己配置的 url-pattern 不對!
現整理一下:
(1):在使用springmvc時,都會在web.xml中配置一個dispatchservlet,如下:
<!-- Spring MVC Servlet -->
<servlet>
<servlet-name>springmvc</servlet-name >
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern> /</url-pattern>
</servlet-mapping>
(2):配置spring的配置檔案
<!-- 預設的檢視解析器 在上邊的解析錯誤時使用 (預設使用html)- -->
<bean id="defaultViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:order="2">
<property name="viewClass"
value ="org.springframework.web.servlet.view.JstlView" />
<property name="contentType" value="text/html" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
(3):舉例說明:
①:<url-pattern>/</url-pattern> 會匹配到/login這樣的路徑型url,不會匹配到模式為*.jsp這樣的字尾型url
②:<url-pattern>/*</url-pattern> 會匹配所有url:路徑型的和字尾型的url(包括/login,*.jsp,*.js和*.html等)
①:地址為 localhost:8088/login , /login 返回login.jsp
訪問去Controller下的/login 跳轉到相應的檢視login.jsp
②:訪問的地址為 localhost:8088/login/ ,/login 返回login.jsp
訪問去Controller下的/login,跳轉到login.jsp ,然後進過dispatchservlet的時候,由於是/* ,有會以localhost:8088/login/login.jsp 去請求Controller ,那麼如果Controller沒有 /login/login.jsp 的Mapping對映,則會報404 錯誤!
(4):總結
< url-pattern > /
< url-pattern > /* 能匹配所有請求URL,會匹配到*.jsp,會出現返回jsp檢視時再次進入spring的DispatcherServlet 類,導致找不到對應的controller所以報404錯。
當對映規則為 /* 時,最後返回xx.jsp也經過DispatcherServlet,它又會去找相對應的處理器,這也是控制檯列印noHandlerFound,也就導致了404錯誤,頁面更別想看到。當改成 / 後,servlet不會匹配到.jsp的URI,當然就能正常返回頁面了