1. 程式人生 > >SpringMVC中url-pattern /和/*的區別

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,當然就能正常返回頁面了