在我对MVC模式的经典理解中,控制器不必了解视图的任何实现细节。我想要一个由事件(@RequestMapping
)触发的控制器并返回一个模型。这取决于如何呈现模型。
concret用例是将商品添加到购物车中。我有两个视图,一个简单的HTML视图和一个更丰富的Ajax-View。在我的梦想场景中,两个视图都向相同的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");
}
我真的不喜欢用视图相关模型适配器装饰每个控制器的想法。是否有更通用的方式来通过模型的适当呈现来提供视图?我想在我的控制器中只有一个方法将模型发送到任何视图。当然,堆栈上必须存在处理程序,如果某些条件为真,则决定将模型作为JSON提供(假设x-requested-with = XMLHttpRequest)。
答案 0 :(得分:1)
ContentNegotiatingViewResolver
作为默认视图的 MappingJackson2JsonView
似乎有所帮助。它比阅读文档更多的试验和错误。另外对我而言,它读取的不是直接设置默认视图为JSON。我想知道你们是如何在Spring 3.2之前解决这个常见用例的。