Spring 3 MVC ContentNegotiatingViewResolver示例

Spring 3, ContentNegotiatingViewResolver是一个有趣的视图解析器,它允许您将相同的资源(内容或数据)输出到不同类型的视图,例如JSPXMLRSSJSON等。简单地说,请参见以下Web请求的URL,这将返回不同的视图。

  1. http://www.mkyong.com/fruit/banana.rss ,以RSS文件形式返回。
  2. http://www.mkyong.com/fruit/banana.xml ,以XML文件形式返回。
  3. http://www.mkyong.com/fruit/banana.json ,以JSON文件形式返回。
  4. http://www.mkyong.com/fruit/banana ,返回到您的默认视图解析器。

注意
ContentNegotiatingViewResolver首先确定“哪个视图解析器应通过文件扩展名返回”,如果没有匹配的视图,则使用默认的视图解析器。 阅读此Spring文档以研究其工作原理。

在本教程中,我们向您展示如何使用ContentNegotiatingViewResolver 。 在本教程的最后,将根据请求的文件扩展名,以不同的视图返回同一模型-XML,JSON,RSS和JSP。

使用的技术:

  1. Spring 3.0.5。发布
  2. 杰克逊1.7.1
  3. 罗马1.0.0
  4. JDK 1.6
  5. Maven 3
  6. 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文件。

spring mvc and xml demo

http:// localhost:8080 / SpringMVC / fruit / banana.json ,显示为JSON文件。

spring mvc and json demo

http:// localhost:8080 / SpringMVC / fruit / banana.rss ,显示为RSS文件。

spring mvc and RSS demo

http:// localhost:8080 / SpringMVC / fruit / banana ,显示为JSP页面。

spring mvc and JSP demo

下载源代码

下载它– SpringMVC-ContentNegotiatingViewResolver-Example.zip (10 KB)

参考文献

翻译自: https://mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值