如何使用Spring MVC 3在控制器中从模型中获取对象?

时间:2011-09-12 14:14:48

标签: java spring spring-mvc

我有一个控制器,它有一个处理传入GET数据的方法,在model中存储一些东西,然后重定向到另一个处理这些对象的页面。

我似乎找不到任何好的方法来将第一个方法中存储的对象从模型中取出,以便在第二个方法中使用。我怎么能这样做?

这是控制器的顶部:

@Controller
@RequestMapping("/reviews")
@SessionAttributes({"review", "externalReview"})
public class ReviewController {
    // [SNIP]
}

这是将我追随的对象添加到模型中的代码:

@RequestMapping(value="/new", params="UName", method=RequestMethod.GET)
public String newFormFromExternal(@ModelAttribute("externalReview") ExternalReview externalReview, Model model) throws IncompleteExternalException {
    // Convert the inbound external
    Review fromExternal = ExternalReviewUtil.reviewFromExternalReview(externalReview, externalDAO);

    // Add the externalReview to the session so we can look to see if we got a reviewee on the way in
    model.addAttribute("externalReview", externalReview);

    model.addAttribute("review", fromExternal);

    return "redirect:/reviews/newFromExternal";
}

3 个答案:

答案 0 :(得分:2)

你很幸运。

如果您正在使用或有能力更新到新发布的 Spring 3.1 ,则可以使用新范围的 Flash 变量。

http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/mvc.html#mvc-flash-attributes

如果您不能使用3.1,您可能可以自己实施该解决方案。基本上,您希望捕获重定向中所需的模型对象,放入会话中,并在检索后将其删除,以防止会话膨胀。

答案 1 :(得分:1)

目前,我只是获得模型的Map,通过它的密钥(String名称)获取我想要的对象,然后将其转换为它真正的对象(而不只是Object)。

以下是代码:

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET)
public String newExternalForm(Model model) {
    // Get the review from the model
    Review review = (Review) model.asMap().get("review");

    /*** Do stuff with the review from the model ****/

    return "reviews/newFromPacs";
}

这种方式有效,但看起来很笨拙。这真的是唯一的方法吗?

答案 2 :(得分:1)

一种可能的解决方案是使用@ModelAttribute,虽然它非常难看,因为您需要为该属性禁用数据绑定(为了安全性):

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(@ModelAttribute Review review) {
    ...
}

@InitBinder("review")
public void disableReviewBinding(WebDataBinder b) {
    b.setAllowedFields();
}