0

我有一个用于 RESTful 资源 ( ServiceDirectoryController) 的 Spring MVC 控制器,我想同时为 HTML(网页)和非 HTML(Web 服务)表示提供服务。我想使用视图名称和 JSP 来生成 HTML 表示,但HttpMessageConverters 用于其他表示。我怎么做?

我已经为非 HTML 表示实现了请求处理方法。我的内部(域模型)表示是ThingNames,我有合适的消息转换器,所以请求处理方法很简单:

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
 @ResponseBody
 public ThingNames retrieveThings() {
    ...
 }

现在我想为 JSP 页面添加请求处理方法。所以我需要一个指示视图名称并提供合适模型的方法。所以,显而易见的事情是:

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
 public String retrieveThings(Map< String, Object > model) {
    ...
 }

以视图名称作为返回值。

但这会奏效吗?Spring 是否足够聪明地计算出 HTML 表示应该由第二种方法处理,而对所有其他表示使用第一种方法?如果没有,我该如何处理 JSP/HTML 和非 JSP/HTML 表示?

4

1 回答 1

2

根据Paul Chapman 的 Spring 博客文章,如果我设置了PPA 内容协商策略,我的控制器将按原样工作。也就是说,如果我将 Spring 配置为按照以下偏好降序考虑有关所需内容类型的线索:

  1. 路径扩展(.htm,.tsv等)
  2. 请求参数 ( ?format=htm, ?format=xls)
  3. 接受标头(正确的 HTTP 内容协商,遗憾的是它在 HTML 浏览器中效果不佳)。

更重要的是,提供的 SpringContentNegotiationManagerFactoryBean就是按照这个顺序运行的。


此外,您必须在控制器中注释处理程序方法,以便 Spring 知道这些方法应该使用注释的consumesproduces值来处理 HTML 内容。@RequestMapping也就是说,而不是简单地写

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
 @ResponseBody
 public String retrieveThings(Map< String, Object > model) {
    ...
 }

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET,
    produces = MediaType.TEXT_HTML_VALUE)
 @ResponseBody
 public String retrieveThings(Map< String, Object > model) {
    ...
 }
于 2013-06-14T12:49:57.720 回答