0

我正在用 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 过滤器来丰富 ModelAndView 仅针对 text/html mimetype?但是,您正在为所有可能不受欢迎的 html 请求执行此操作?

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

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

4

1 回答 1

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 {}

    }
}
于 2013-07-24T08:40:08.353 回答