Spring 3, ContentNegotiatingViewResolver是一个有趣的视图解析器,它允许您将相同的资源(内容或数据)输出到不同类型的视图,例如JSP , XML , RSS , JSON等。简单地说,请参见以下Web请求的URL,这将返回不同的视图。
-
http://www.mkyong.com/fruit/banana.rss
,以RSS文件形式返回。 -
http://www.mkyong.com/fruit/banana.xml
,以XML文件形式返回。 -
http://www.mkyong.com/fruit/banana.json
,以JSON文件形式返回。 -
http://www.mkyong.com/fruit/banana
,返回到您的默认视图解析器。
注意
该ContentNegotiatingViewResolver首先确定“哪个视图解析器应通过文件扩展名返回”,如果没有匹配的视图,则使用默认的视图解析器。 阅读此Spring文档以研究其工作原理。
在本教程中,我们向您展示如何使用ContentNegotiatingViewResolver
。 在本教程的最后,将根据请求的文件扩展名,以不同的视图返回同一模型-XML,JSON,RSS和JSP。
使用的技术:
- Spring 3.0.5。发布
- 杰克逊1.7.1
- 罗马1.0.0
- JDK 1.6
- Maven 3
- Eclipse 3.6
注意
JAXB捆绑在JDK1.6中,因此,您无需手动将其包括在内。
1.项目依赖
在您的Maven pom.xml
文件中声明以下依赖项。
<properties>
<spring.version>3.0.5.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Jackson JSON Mapper -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.7.1</version>
</dependency>
<!-- RSS -->
<dependency>
<groupId>net.java.dev.rome</groupId>
<artifactId>rome</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
2.型号
一个Pojo,带有JAXB批注,以便可以在XML文件中输出。 此外,稍后我们将使用此模型以不同的视图显示。
package com.mkyong.common.model;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "fruit")
public class Fruit {
String name;
int quality;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public int getQuality() {
return quality;
}
@XmlElement
public void setQuality(int quality) {
this.quality = quality;
}
public Fruit(String name, int quality) {
this.name = name;
this.quality = quality;
}
public Fruit() {
}
}
3. JSON和XML视图
要输出JSON和XML视图,您不需要做任何额外的工作,Spring MVC将自动处理转换。 阅读本Spring MVC和XML以及Spring MVC和JSON示例。
4. RSS视图
要输出RSS视图,您需要扩展AbstractRssFeedView
。 阅读此Spring 3 MVC和RSS示例以了解其工作原理。
package com.mkyong.common.rss;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.feed.AbstractRssFeedView;
import com.mkyong.common.model.Fruit;
import com.sun.syndication.feed.rss.Channel;
import com.sun.syndication.feed.rss.Content;
import com.sun.syndication.feed.rss.Item;
public class RssFeedView extends AbstractRssFeedView {
@Override
protected void buildFeedMetadata(Map<String, Object> model, Channel feed,
HttpServletRequest request) {
feed.setTitle("Sample Title");
feed.setDescription("Sample Description");
feed.setLink("http://google.com");
super.buildFeedMetadata(model, feed, request);
}
@Override
protected List<Item> buildFeedItems(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Fruit fruit = (Fruit) model.get("model");
String msg = fruit.getName() + fruit.getQuality();
List<Item> items = new ArrayList<Item>(1);
Item item = new Item();
item.setAuthor("mkyong");
item.setLink("http://www.mkyong.com");
Content content = new Content();
content.setValue(msg);
item.setContent(content);
items.add(item);
return items;
}
}
5. JSP视图
一个JSP页面,用于显示模型数据。
文件:list.jsp
<html>
<body>
<h1>Spring @MVC ContentNegotiatingViewResolver</h1>
Fruit Name : ${model.name} <br />
Fruit Quality : ${model.quality}
</body>
</html>
6.控制器
Spring控制器,用于生成“水果”模型并将其返回。
package com.mkyong.common.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.mkyong.common.model.Fruit;
@Controller
@RequestMapping("/fruit")
public class FruitController {
@RequestMapping(value="{fruitName}", method = RequestMethod.GET)
public String getFruit(@PathVariable String fruitName, ModelMap model) {
Fruit fruit = new Fruit(fruitName, 1000);
model.addAttribute("model", fruit);
return "list";
}
}
7. ContentNegotiatingViewResolver示例
该代码应该是不言自明的。 但是,您必须定义“ order ”属性,其中较低的值具有较高的优先级。 在这种情况下,当请求URL时,Spring MVC将使用“ ContentNegotiatingViewResolver
”(order = 1)返回合适的视图(基于“ mediaTypes”属性中声明的文件扩展名),如果不匹配,则使用“ InternalResourceViewResolver
”( order = 2)返回默认的JSP页面。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.mkyong.common.controller" />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
<entry key="rss" value="application/rss+xml" />
</map>
</property>
<property name="defaultViews">
<list>
<!-- JSON View -->
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
</bean>
<!-- RSS View -->
<bean class="com.mkyong.common.rss.RssFeedView" />
<!-- JAXB XML View -->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.mkyong.common.model.Fruit</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
<!-- If no extension matched, use JSP view -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="2" />
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
8.演示
相同的模型,并通过ContentNegotiatingViewResolver
在不同的视图中显示。
http:// localhost:8080 / SpringMVC / fruit / banana.xml ,显示为XML文件。
http:// localhost:8080 / SpringMVC / fruit / banana.json ,显示为JSON文件。
http:// localhost:8080 / SpringMVC / fruit / banana.rss ,显示为RSS文件。
http:// localhost:8080 / SpringMVC / fruit / banana ,显示为JSP页面。
下载源代码
下载它– SpringMVC-ContentNegotiatingViewResolver-Example.zip (10 KB)
参考文献
- Spring ContentNegotiatingViewResolver JavaDoc
- 使用Spring MVC的ContentNegotiatingViewResolver进行内容协商
- 另一个ContentNegotiatingViewResolver示例
- Spring 3 MVC和RSS feed示例
- Spring 3 MVC和XML示例
- Spring 3 MVC和JSON示例
翻译自: https://mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/