springmvc配置servlet的攔截形式/*和/的區別


    今天復制一個現有的spring-mvc的項目修改配置作為新的項目,結果悲劇了!遇到了一個小問題困擾了半天,找同事找總監都沒有搞定,糾結了半天終於發現了問題所在,隨筆記一下,所謂好記性不如爛博客嘛!

問題描述:

   項目很簡單,只是簡單搭建一個spring-mvc框架,寫一個測試的NewsController,關於問題的配置如下:

web.xml

 1 <servlet>
 2     <servlet-name>spring-mvc</servlet-name>
 3     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 4     <init-param>
 5       <param-name>contextConfigLocation</param-name>
 6       <param-value>/WEB-INF/spring-mvc.xml</param-value>
 7     </init-param>
 8   </servlet>
 9   <servlet-mapping>
10     <servlet-name>spring-mvc</servlet-name>
11     <url-pattern>/*</url-pattern>
12   </servlet-mapping>

spring-mvc的視圖解析器如下:

    <!-- 視圖解釋類 通過配置文件,把一個視圖名交給到一個View來處理 InternalResourceViewResolver加入了JSTL的支持 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

controller方法如下

    //首頁
        @RequestMapping("/index")
        public String getnewsList(ModelMap model) {
            return "ttt";
        }

ttt.jsp是/WEB-INF/views/目錄下的一個新建的ttt.jsp,就這樣啟動項目后,訪問項目http://localhost:8080/news/index,結果返回404,Problem accessing /news/WEB-INF/views/ttt.jsp。

解決方案

  開始一直以為jsp頁面沒有編譯,最后發現確實沒有編譯,tomcat的jsp是在第一次請求頁面的時候編譯的,但是為什么沒有編譯呢?說明沒有請求到頁面,查看控制台打印的信息發現

日志打印沒有找到/WEB-INF/views/ttt.jsp對應的handler,說明/WEB-INF/views/ttt.jsp請求又被spring-mvc的selvet攔截了兩次,問題出現了,為什么會攔截兩次呢?原因就出在web.xml里配置的攔截形式/*上面,修改成/就沒問題了。

總結一下

  /*是攔截所有請求,包括視圖解析后跳轉的.jsp頁面,/則不會攔截視圖解析后的.jsp頁面!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM