从一个控制器方法重定向到另一个控制器方法

36

我的应用程序中使用了Spring 3和Tiles 2,在重定向方面遇到了一些麻烦。最好的情况是,我希望能够从Controller1方法直接调用或重定向到Controller2方法,但到目前为止没有成功。

我尝试在pageviews.properties文件中创建一个新条目。这样,我可以从Controller1返回这个名称,并且它将从xml文件中查找我的tiles def名称。

createRejectionEmail.(parent)=tilesView
createRejectionEmail.url=createRejectionEmail.page

redirectRejectionEmail.(class)=org.springframework.web.servlet.view.RedirectView
rediectRejectionEmail.contextRelative=true
redirectRejectionEmail.url=createRejectionEmail.page

但是,当我像下面展示的那样尝试返回时,我的URL包含了"createRejectionEmail"作为URL的一部分 - 而不是使用它来在tile定义中进行查找。 mav.setViewName("redirectRejectionEmail"); return mav;

<definition name="createRejectionEmail.page" extends="brandedLayout">
  <put-attribute name="targetFunction" value="status" />
  <put-attribute name="content" value="/WEB  INF/jsp/pages/status/createRejectionEmail.jsp" />
</definition>

我目前的配置如下。

<bean id="resourceViewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver"
p:order="0" p:basename="config.spring.viewresolution.pageviews"/>



<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
   <list>
  <value>/WEB-INF/jsp/**/views.xml</value>
    </list>
</property>
</bean>

非常感激任何帮助和指导!

2个回答

66

从您的控制器中,您可以更改返回类型为ModelAndView,并返回以下代码。这将重定向请求并调用新URL的控制器。

return new ModelAndView("redirect:/myURL");

或者您可以在控制器方法中接收 HttpServletResponse 并返回重定向。

public void myController(HttpServletResponse response){
response.sendRedirect("/myURL");
}

你好,感谢您的回复。我尝试了一下,但是出现了以下错误信息:“在名为'Spring-MVC-for-OA'的servlet中无法解析名称为'redirect:/myapppath/status/displayEmailRejectionForm.html'的视图。我应该使用不同的视图解析器吗?目前,我们正在使用ResourceBundleViewResolver和tiles2。” - Carl
好的,终于成功了!非常感谢您的帮助。我还不得不将UrlBasedViewResolver添加到我的应用程序上下文中。非常感谢您抽出时间来回复! - Carl
这似乎可以正常工作,即使使用@RequestMapping注释的方法返回String类型。就像在卡尔的例子中一样,关键是添加UrlBasedViewResolver类的配置。 - Marin
1
这对我来说没有任何修改就可以工作。使用Spring 4.1+和Hibernate 5.0+。 - Akah
这非常有用。 - Ravikumar Rathod

9
@RequestMapping(value = "/timeout", method = RequestMethod.GET)
    public ModelAndView loginForm(HttpServletRequest request,HttpServletResponse response) {


                return new ModelAndView("redirect:/app/timeout");

    }

当调用此方法处理程序时,它会重定向到/app/timeout控制器。

运行得很顺畅,最好的是,如果您的应用程序有上下文,则此方法会自动解决它,无需显式传递。 - deFreitas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接