2012-08-30 45 views
4

這是我認爲應該很容易的事情,但到目前爲止,我還沒有得到它的工作。Spring MVC中的地圖/(根URL)

我想要做的是將我的根路徑映射到Spring MVC控制器。使用正常的Servlet,我只需在我的web.xml中添加「/」的映射,就可以很好地提取它。但對於Spring MVC而言,並非如此。

我已經嘗試了很多組合,但似乎沒有工作。我認爲下面的一個應該可以工作。

web.xml

<servlet-mapping> 
    <servlet-name>myDispatcherServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

在我contextConfigLocation文件:

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="alwaysUseFullPath" value="true"/> 
    <property name="mappings"> 
     <util:map> 
      <entry key="/" value-ref="rootController"/> 
     </util:map> 
    </property> 
</bean> 

<bean id="rootController" class="my.package.RootController"> 

那麼很明顯,有控制器本身的情況。我不知道如何將該方法映射到實際的根路徑。我的嘗試是這樣的:

public class RootController extends MultiActionController { 

    @RequestMapping("/") 
    public ModelAndView display(HttpServletRequest request, HttpServletResponse response) throws Exception { 

     final Map<String, Object> model = new HashMap<String, Object>(); 
     model.put("someVariable", "Hello, MVC world."); 
     return new ModelAndView("rootPage", model); 
    } 
} 

所以我們可以說我的應用程序上運行http://localhost:8080/app/,我想,準確的URL來執行方法display。我不想在/app/之後輸入任何內容。事實上,/app/之後的一些東西被映射到其他控制器,並且所有工作正常(並且他們必須繼續工作)。

我在這裏錯過了什麼?爲什麼這不是簡單的工作?如果我使用相同的url-pattern映射到一個普通的Servlet實例,它工作正常,我到達doGet方法,但對於Spring MVC,我似乎錯過了一些特殊的黑魔法來實現它。

回答

1

我建議你擺脫SimpleUrlHandlerMapping建立的,只是執​​行以下操作:

@Controller 
@RequestMapping("/") 
public class RootController 
{ 
    @RequestMapping(method=RequestMethod.GET) 
    public ModelAndView display(...) 
    { 
    ... 
    } 
} 

這應該得到你想要的結果。另外,將<mvc:annotation-driven/>添加到您的servlet上下文中,使用<context:component-scan base-package="some.package.path.to.controller" />將Spring控制器連接到該控制器。

否則,您可以用SimpleUrlHandlerMapping建立的網址可能映射爲這樣:

<property name="mappings"> 
    <value> 
     /*=rootController 
    </value> 
<property> 

如果做這樣一來,你能保持rootController定義的豆。

+0

感謝您的回答。我想這會起作用,但不幸的是,它不那麼容易。除了這個''RootController'',我們還有一些'Controllers'通過這個'SimpleUrlHandlerMapping'來設置。或者你會建議爲這個'RootController'單獨設置一個'DispatcherServlet'? – pbean

+0

那麼保持url映射,但刪除條目「/」 – dardo

+0

所以你的意思是,保留'SimpleUrlHandlerMapping',但沒有「'/'」的條目,並添加''和' pbean

2

不是映射到/的,你可以在你的web.xml文件中聲明一個歡迎頁面:

<welcome-file-list> 
    <welcome-file>welcome.htm</welcome-file> 
</welcome-file-list> 

所以你/路徑將被處理爲/welcome.htm,然後如果你的控制器正確映射到/welcome.htm它將處理/就好像這是一個/welcome.htm請求,而不會更改其他配置。

0

對於Spring Webflow,Boris Treukhov建議使用網絡文件列表導致我發現了一種適用於weblogic的hack。例如,如果welcome是一個flow.xml文件,請執行以下操作:在web.xml中將url模式從\更改爲* .html。將一個虛擬(空)文件welcome.htm放入src \ main \ webapp \ WEB-INF文件夾中。在SimpleUrlHandlerMapping中映射值/welcome.htm=flowController。最後,完成註冊表,flow-location path =「welcome.xml」。請參閱鏈接:http://forum.spring.io/forum/spring-projects/web/50547-welcome-file-list-with-spring