我有一个用于RESTful资源(ServiceDirectoryController
)的Spring MVC控制器,我想要同时提供HTML(网页)和非HTML(Web服务)表示。我想使用视图名称和JSP来生成HTML表示,但HttpMessageConverter
用于其他表示。我该怎么做?
我已经为非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表示?
答案 0 :(得分:1)
根据a Spring blog post by Paul Chapman,如果我设置 PPA内容协商策略,我的控制器将以书面的形式工作。也就是说,如果我按照以下降序排列顺序,请将Spring配置为考虑所需内容类型的线索:
.htm
,.tsv
等)?format=htm
,?format=xls
)更重要的是,Spring提供的ContentNegotiationManagerFactoryBean
按此顺序运行。
此外,您必须在控制器中注释处理程序方法,以便Spring知道这些方法应使用consumes
注释的produces
和@RequestMapping
值来处理HTML内容。也就是说,而不是简单地写
@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) {
...
}