在Spring-MVC控制器中支持多种内容类型


问题内容

Rails控制器使支持多种内容类型变得非常容易。

respond_to do |format|
  format.js { render :json => @obj }
  format.xml
  format.html
end

美丽。在一个控制器动作中,我可以轻松灵活地对多种内容类型做出响应,以灵活呈现自己想要呈现的内容,例如模板,对象的序列化形式等。

我可以在Spring-
MVC中做类似的事情吗?在Spring中支持多种内容类型的标准是什么?我已经看到了涉及视图解析器的解决方案,但是这看起来很难管理,尤其是如果我想在xhtml和xml之外还支持JSON时。

任何建议都将受到赞赏,但更简单,更优雅的解决方案将受到更多;)

编辑

如果我认为视图解析器难以管理不正确,请随时纠正我并提供示例。最好是可以返回xml,xhtml和JSON的代码。


问题答案:

在Spring
3中,您想使用org.springframework.web.servlet.view.ContentNegotiatingViewResolver

它需要一个媒体类型和列表ViewResolvers。从Spring文档中

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="mediaTypes">
    <map>
      <entry key="atom" value="application/atom+xml"/>
      <entry key="html" value="text/html"/>
      <entry key="json" value="application/json"/>
    </map>
  </property>
  <property name="viewResolvers">
    <list>
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
      </bean>
    </list>
  </property>
  <property name="defaultViews">
    <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
  </property>
</bean>
<bean id="content" class="com.springsource.samples.rest.SampleContentAtomView"/>

控制器:

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class BlogsController {

    @RequestMapping("/blogs")
    public String index(ModelMap model) {
        model.addAttribute("blog", new Blog("foobar"));
        return "blogs/index";
    }    
}

您还需要包括Jackson JSONjar。