2013-04-30 193 views
3

我遇到了關於類的@RequestMapping的問題。說我有兩個控制器:Spring MVC請求映射衝突

@Controller 
@RequestMapping(value="/controller1") 
public class Controller1 { 

    @RequestMapping(value="/method11.do") 
    public @ResponseBody method11(){ 
      //... 
    } 

    @RequestMapping(value="/method12.do") 
    public ModelAndView method12(){ 
      //This method redirects me to another jsp where I'll call Controller2 methods 
      return new ModelAndView("test"); 

    } 
} 

@Controller 
@RequestMapping(value="/controller2") 
public class Controller2 { 

    @RequestMapping(value="/method21.do") 
    public @ResponseBody method21(){ 
      //... 
    } 

} 

當我通過AJAX method11第一個呼叫,它做工精細,生成的URL是http://mydomain/myapp/controller1/method11.do

然後,我打電話method12和重定向到test.jsp的,從在那裏,我打電話給method21,而現在的問題是,產生的URL不是預期http://mydomain/myapp/controller2/method21.do,但別的東西,這取決於如何我做AJAX調用:

url:'controller2/method21' --> http://mydomain/myapp/controller1/controller2/method21.do 
url:'/controller2/method21' --> http://mydomain/controller2/method21.do 

那麼,以什麼方式我應該做這些電話讓他們總是明星t在http://mydomain/myapp/...

我相信我可以使用url:'/myapp/controller2/method21.do',但我想應該有一個更通用的方法,我不必在每次調用時使用'myapp'。

這是我的web.xml:

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

<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping> 
+0

在'jsp'中,您可以使用'$ {pageContext.request.contextPath}'。所以'url:'/ $ {pageContext.request.contextPath}/controller2/method21'。 – 2013-04-30 14:10:13

回答

2

你應該讓客戶知道正確的URL中使用JSP EL在腳本中獲取上下文根。

在JSP

<script>var ctx = "${pageContext.request.contextPath}"</script> 

然後可以使用ctx作爲前綴通過JavaScript構建的URL。

var url = ctx + "/rest_of_url" 

在服務器端,您可以使用:

${pageContext.request.contextPath}或JSTL有一個標籤,<c:url>這將附加到您的上下文根。

+0

謝謝!這工作得很好。另外,我想問,這是完成這個任務的正確方法還是還有其他更優雅或方便的方法?也許通過web.xml或spring-servlet.xml – carcaret 2013-04-30 15:42:52

+0

@carcaret我不知道更優雅的解決方案,我在我的博客上使用此方法,其中上下文根在環境之間變化。本文討論有關靜態資源的問題:http://www.sivalabs.in/2011/07/context-root-relative-urls-using.html – 2013-04-30 16:27:10