在我对 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 服务。