我在课堂上遇到关于@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>
答案 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>
,它会附加您的上下文根。