如何创建一个控制器,它返回同一型号任意视图(HTML表格或阿贾克斯)?(How to create

2019-10-17 12:57发布

在我的MVC模式的经典理解控制器不必知道视图的任何实现细节。 我想有它获取由事件(已触发控制器@RequestMapping )并返回一个模型。 它是由视图如何呈现的模型。

形而下的用例是将商品放入购物车。 我有两个观点,一个简单的HTML视图和更丰富的Ajax的视图。 在我的梦中情景两种观点作出相同的URI请求,打在我的控制器的唯一方法:

@Controller
public class ShoppingCartController {

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

}

我的观点阿贾克斯发送到/添加请求?的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-要求,与XMLHttpRequest的=)。

Answer 1:

ContentNegotiatingViewResolver与配置MappingJackson2JsonView为默认视图似乎帮助。 它比阅读文档更多的试验和错误。 加上我读它不是那么intuitiv设置默认视图JSON。 我不知道你们如何在Spring 3.2之前,解决了这一常见的情况。



文章来源: How to create one Controller which returns same Model to arbitrary view (HTML-Form or Ajax)?
标签: spring-mvc