1. 程式人生 > >springmvc瀏覽器顯示jsp原始碼解決辦法

springmvc瀏覽器顯示jsp原始碼解決辦法

url-pattern問題
spring用到forward(“/WEB-INF/jsp/*.jsp”)
而forward當然是又要經過web.xml的對映的,
然後,在URL匹配時,
<url-pattern> / </url-pattern> 不會匹配到*.jsp,不會進入spring的DispatcherServlet類
<url-pattern> /* </url-pattern> 會匹配*.jsp,導致進入spring的DispatcherServlet 類,然後去尋找controller,接著找不到對應的controller所以報錯。

總之,關於web.xml的url對映的小知識:
<url-pattern>/</url-pattern> 會匹配到/login這樣的路徑型url,不會匹配到模式為*.jsp這樣的字尾型url
<url-pattern>/*</url-pattern> 會匹配所有url:路徑型的和字尾型的url(包括/login,.jsp,.js和*.html等)

<url-pattern>/</url-pattern>甚至會造成The requested resource () is not available.

以上內容轉載自:http://www.cnblogs.com/Mr-Nobody/p/3642018.html





=============================分割線:對轉載文章的補充===========================
<url-pattern> /* </url-pattern> 會匹配*.jsp,導致進入spring的DispatcherServlet 類,然後去尋找controller,接著找不到對應的controller所以報錯。

這句話值得應該是請求返回到瀏覽器,頁面顯示的是jsp原始碼,這樣才能與題相對應。

那麼為什麼匹配*.jsp,導致進入spring的DispatcherServlet 類頁面就顯示jsp原始碼了?原因如下:
一般情況,在spring-mvc.xml配置檔案中,都會新增如下程式碼來處理對靜態資源的訪問:

    <!-- 對訪問靜態資源請求的處理方式有兩種: 選擇任意一種配置都可以-->
    <!-- 方式一:對靜態資原始檔的訪問,避免controller攔截 -->
    <mvc:default-servlet-handler />

    <!-- 方式二: 配置指定的靜態資源地址以及攔截的請求,static資原始檔與WEB-INF同級-->
    <mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>
    <!-- 
    此部分與題無關,作為了解內容
    多個HandlerMapping的執行順序問題:
        DefaultAnnotationHandlerMapping的order屬性值是:0
        <mvc:resources/ >自動註冊的 SimpleUrlHandlerMapping的order屬性值是: 2147483646
        <mvc:default-servlet-handler/>自動註冊 的SimpleUrlHandlerMapping 的order屬性值是: 2147483647
        spring會先執行order值比較小的。當訪問一個a.jpg圖片檔案時,先通過 DefaultAnnotationHandlerMapping 來找處理器,一定是找不到的,我們沒有叫a.jpg的Action。
        再按order值升序找,由於最後一個 SimpleUrlHandlerMapping 是匹 "/**"的,所以一定會匹配上,再響應圖片。
     -->

上述配置導致了一個的結果就是.jsp,.sql,*.txt都當做txt處理。結果就是直接在瀏覽器載入了jsp原始碼。

當然,如果不配置上述對靜態資源處理的程式碼,那麼結果是找不到對應的controller所以報錯,404錯誤。實際上靜態資源的處理配置肯定是要加的。

後臺日誌也給出了上述顯示jsp原始碼的經過:

//顯示Forward跳轉
Forwarding to resource [/WEB-INF/jsp/list.jsp] in InternalResourceView 'list'
//然後被DispatcherServlet攔截
DispatcherServlet with name 'springServlet' processing GET request for [/seckill/WEB-INF/jsp/list.jsp]
//然後為/WEB-INF/jsp/list.jsp請求尋找處理方法
Looking up handler method for path /WEB-INF/jsp/list.jsp
//結果當然是沒有找到了
Did not find handler method for [/WEB-INF/jsp/list.jsp]
Matching patterns for request [/WEB-INF/jsp/list.jsp] are [/**]
URI Template variables for request [/WEB-INF/jsp/list.jsp] are {}
Mapping [/WEB-INF/jsp/list.jsp] to HandlerExecutionChain with handler [org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@5fce904c] and 1 interceptor
Last-Modified value for [/seckill/WEB-INF/jsp/list.jsp] is: -1
//一個空的ModelAndView返回給了DispatcherServlet,並認為請求已完成
Null ModelAndView returned to DispatcherServlet with name 'springServlet': assuming HandlerAdapter completed request handling
Successfully completed request

如果我就不想用<url-pattern>/</url-pattern>,想用某個固定的字尾,比如<url-pattern>*.do</url-pattern>,那麼controller的@RequestMapping(value = "/xxx.do")這樣的,位址列請求是這樣的:http://localhost:8080/xxx.do