2010-10-14 36 views
4

首先,如果這是重複的,我很抱歉。我做了相當多的搜索,但無法找到多少,我懷疑我沒有使用正確的術語...Spring MVC網址沒有.something extension

我正在用Spring MVC構建一個站點,並使用註釋驅動的配置。我想要做的是在最後沒有任何擴展名的網址(.html,.do等)。所以他們看起來像http://www.mysite.com/account/create,我知道這是傳統上在Apache上使用mod_rewrite或使用沒有擴展名的文件完成的事情。看起來好像它可以在不使用重寫引擎(我知道urlrewritefilter項目)的情況下完成,因爲Spring支持從請求字符串中提取參數(參見the documentation的第15.3.2.1節),並且寵物商店示例沒有似乎在其網址末尾有擴展名。

但是,似乎每當我嘗試將所有請求轉發給調度程序servlet(我的想法是否定*.htm),我遇到了麻煩......我能夠得到它工作(使用XML配置,我最近切換到註釋配置),對所有頁面僅使用標準的「* .htm」。

我的控制器代碼看起來像

@Controller 
@RequestMapping("/home") 
public class HomeController { 

    ... 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView get() { 

     ... 

    } 

而且我的web.xml看起來像

<servlet> 
     <servlet-name>dispatch</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatch</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

我在這裏失去了一些東西?這可能沒有使用重寫引擎?

我應該注意,上面的配置不起作用。它始終返回一個404錯誤...

回答

4

使用URL模式(如/*)通常是一個壞主意,因爲容器會將所有內容都轉發到DispatcherServlet,包括對JSP的內部請求。因此,當您的控制器返回ModelAndView中的JSP名稱時,它將會再次反饋到DispatcherServlet,從而爲您提供404。

您或者需要在路徑中保留文件擴展名,或者需要某個前綴可以讓您區分請求的DispstcherServlet與JSP的請求。

+1

這是一個很好的觀點,也是我沒有想到的。應該像'/ app/*'那樣工作嗎? – 2010-10-15 17:18:32

+0

這樣做,謝謝!對於它的價值,我也在Servlet xml文件中使用了我的''標記,而不是在上下文配置文件中。 – 2010-10-15 17:49:55