Spring MVC请求映射冲突

时间:2013-04-30 14:00:00

标签: java spring spring-mvc controller mapping

我在课堂上遇到关于@RequestMapping的问题。说我有这两个控制器:

@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方法11调用时,它工作正常,生成的网址为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

那么,我应该以何种方式拨打电话,以便始终从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>

1 个答案:

答案 0 :(得分:2)

您应该通过使用JSP EL检索脚本中的上下文根来让客户端知道正确的URL。

在JSP中

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

然后,您可以使用ctx作为通过Javascript构建的网址的前缀。

var url = ctx + "/rest_of_url"

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

${pageContext.request.contextPath}或JSTL有一个标记<c:url>,它会附加您的上下文根。