查看不同输出格式时的内容协商

时间:2013-07-24 07:12:23

标签: java javascript spring-mvc content-negotiation

我正在使用spring mvc进行一些练习编程,我决定做一个关于内容协商的例子。

我开始使用uri“/ products”:

  • 当我要求/products.json时,它会返回json,我很高兴
  • 当我要求/products.xml时,它会返回正确的xml,我很高兴
  • 当我要求html视图(/ products)时,目前我只为产品显示一个简单的html表,但如果我想为html页面添加额外的动态内容,如标签云或类似产品,该怎么办? (与产品无关的东西)?

以下是我的控制器方法代码。

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getAllProducts(){
        ModelAndView result = new ModelAndView("index");
        GenericListElementWrapper<Product> products = new GenericListElementWrapper<Product>();

        products.setList(productDao.getAll());
        ModelMap modelMap = new ModelMap();
        modelMap.addAttribute("products",products);
        result.addAllObjects(modelMap);

        return result;
    }

我想要实现的目标如下:

  • 一种保持我的单一控制器方法但html视图会有额外内容的方法

我的想法是:

  • 也许只使用servlet过滤器来为文本/ html mimetype丰富ModelAndView?但是,你这样做是为了所有可能不受欢迎的html请求吗?

  • 目前我解释自己的方式感觉就像我想要将完全呈现的html视图发送给客户端。也许我正在错误地看待这个问题,我应该考虑通过javascript加载页面后检索额外的内容?

那么有可能实现我的预期解决方案吗?另一部分是我的预期解决方案在实践中是否真正需要:P

1 个答案:

答案 0 :(得分:1)

可能是添加拦截器并将其映射到您选择的路径。执行控制器上的处理程序后, interceptor.postHandle 可以访问ModelAndView。可以添加一些额外的。

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/my/path"/>
        <ref bean="enhancedContentInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

@Component
public class EnhancedContentInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        return true;
    }

    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        if (request.getContentType().equals("text/html")) {
            modelAndView.addObject("tags", tagProvider.getTags());
        }
    }

    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {}

    }
}