1

在我对 MVC 模式的经典理解中,控制器不必知道视图的任何实现细节。我想要一个由事件(a @RequestMapping)触发并返回模型的控制器。如何呈现模型取决于视图。

具体用例是将商品添加到购物车中。我有两个视图,一个简单的 HTML 视图和一个更丰富的 Ajax 视图。在我梦寐以求的场景中,两个视图都向相同的 URI 发出请求,并点击了我的控制器中的唯一方法:

@Controller
public class ShoppingCartController {

    @RequestMapping("/add")
    public String addItem(@RequestParam String itemId, Model model) {
        // …
        model.add(shoppingCart);
        return "cart";
    }

}

我的 Ajax 视图向 /add?itemId=abc 发送请求,理想情况下将获得 JSON 格式的模型。我的 HTML 视图发送到相同的请求并将模型呈现为 JSP。

我目前的方法是在控制器中实现第二种方法,该方法调用addItem()并返回 JSON:

@RequestMapping(value="/add", headers="x-requested-with=XMLHttpRequest")
public @ResponseBody ShoppingCart addItemByAjax(@RequestParam String itemId, Model model) {
    addItem(itemId, model);
    return model.asMap().get("shoppingCart");
}

我不太喜欢用依赖于视图的模型适配器来装饰每个控制器的想法。是否有更通用的方式来提供模型的适当表示形式的视图?我希望我的控制器中只有一种方法可以将模型发送到任何视图。当然,堆栈中的某处必须存在一个处理程序,如果某些条件为真(假设 x-requested-with=XMLHttpRequest),该处理程序决定将模型作为 JSON 服务。

4

1 回答 1

1

ContentNegotiatingViewResolver配置MappingJackson2JsonView为默认视图似乎有帮助。这比阅读文档更多的是反复试验。另外对我来说,将默认视图设置为 JSON 并不那么直观。我想知道你们是如何在 Spring 3.2 之前解决这个常见用例的。

于 2012-12-30T23:37:33.860 回答