我正在从一个控制器重定向到另一个控制器。但我还需要将模型属性传递给第二个控制器。
我不想把模型放在会话中。
请帮忙。
我正在从一个控制器重定向到另一个控制器。但我还需要将模型属性传递给第二个控制器。
我不想把模型放在会话中。
请帮忙。
我使用 spring 3.2.3,这是我解决类似问题的方法。
1) 在控制器 1 的方法参数列表中添加了 RedirectAttributes redirectAttributes。
public String controlMapping1(
@ModelAttribute("mapping1Form") final Object mapping1FormObject,
final BindingResult mapping1BindingResult,
final Model model,
final RedirectAttributes redirectAttributes)
2) 在方法内部添加代码以将 flash 属性添加到 redirectAttributesredirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);
3)然后,在第二个控制器中使用带有@ModelAttribute注解的方法参数来访问重定向属性
@ModelAttribute("mapping1Form") final Object mapping1FormObject
以下是控制器 1 的示例代码:
@RequestMapping(value = { "/mapping1" }, method = RequestMethod.POST)
public String controlMapping1(
@ModelAttribute("mapping1Form") final Object mapping1FormObject,
final BindingResult mapping1BindingResult,
final Model model,
final RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);
return "redirect:mapping2";
}
从控制器 2:
@RequestMapping(value = "/mapping2", method = RequestMethod.GET)
public String controlMapping2(
@ModelAttribute("mapping1Form") final Object mapping1FormObject,
final BindingResult mapping1BindingResult,
final Model model) {
model.addAttribute("transformationForm", mapping1FormObject);
return "new/view";
}
使用redirectAttributes.addFlashAttribute(...) -> "redirect:..."
也可以,不必“重新插入”模型属性。
谢谢,阿伯斯基!
我认为最优雅的方法是在 Spring MVC 中实现自定义 Flash Scope。
闪存范围的主要思想是将数据从一个控制器存储到第二个控制器中的下一个重定向
请参阅我对自定义范围问题的回答:
此代码中唯一缺少的是以下 xml 配置:
<bean id="flashScopeInterceptor" class="com.vanilla.springMVC.scope.FlashScopeInterceptor" />
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list><ref bean="flashScopeInterceptor"/></list>
</property>
</bean>
您可以使用 org.springframework.web.servlet.mvc.support.RedirectAttributes 来解决它。
这是我的控制器示例。
@RequestMapping(method = RequestMethod.POST)
public String eligibilityPost(
@ModelAttribute("form") @Valid EligibiltyForm form,
Model model,
RedirectAttributes redirectAttributes) {
if(eligibilityService.validateEligibility(form)){
redirectAttributes.addFlashAttribute("form", form);
return "redirect:<redirect to your page>";
}
return "eligibility";
}
在我的博客上阅读更多内容: http: //mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value
我有同样的问题。
刷新页面后使用 RedirectAttributes,我的第一个控制器的模型属性已经丢失。我以为这是一个错误,但后来我找到了解决方案。在第一个控制器中,我在 ModelMap 中添加属性并执行此操作而不是“重定向”:
返回“转发:/nameOfView”;
这将重定向到您的另一个控制器,并保留第一个控制器的模型属性。
我希望这就是你要找的。对不起我的英语不好
如果您只想将所有属性传递给重定向...
public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
if(shouldIRedirect()) {
redirectAttributes.addAllAttributes(request.getParameterMap());
return "redirect:/newPage.html";
}
}
我用过@ControllerAdvice
,请检查 Spring 3.X 是否可用;我在 Spring 4.0 中使用它。
@ControllerAdvice
public class CommonController extends ControllerBase{
@Autowired
MyService myServiceInstance;
@ModelAttribute("userList")
public List<User> getUsersList()
{
//some code
return ...
}
}
将所有模型属性作为查询字符串添加到重定向 URL。
通过使用@ModelAttribute,我们可以将模型从一个控制器传递到另一个控制器
[第一个控制器的输入][1]
[]: https://i.stack.imgur.com/rZQe5.jpg 来自 jsp 页面第一个控制器将带有 @ModelAttribute 的表单数据绑定到用户 Bean
@Controller
public class FirstController {
@RequestMapping("/fowardModel")
public ModelAndView forwardModel(@ModelAttribute("user") User u) {
ModelAndView m = new ModelAndView("forward:/catchUser");
m.addObject("usr", u);
return m;
}
}
@Controller
public class SecondController {
@RequestMapping("/catchUser")
public ModelAndView catchModel(@ModelAttribute("user") User u) {
System.out.println(u); //retrive the data passed by the first contoller
ModelAndView mv = new ModelAndView("userDetails");
return mv;
}
}