Spring 3 MVC ContentNegotiatingViewResolverの例
Spring 3、
ContentNegotiatingViewResolver
は、
JSP
、
XML
、
RSS
、
JSON
などのような異なるタイプのビューに同じリソース(コンテンツまたはデータ)を出力できる興味深いビューリゾルバです。簡単に言えば、次のWeb要求URLを参照してください。
-
`//fruit/banana.rss`がRSSファイルとして返されます.
-
`//fruit/banana.xml`がXMLファイルとして返されます.
-
`//fruit/banana.json`がJSONファイルとして返されます.
-
`//fruit/banana`がデフォルトのviewリゾルバに返されます.
このチュートリアルでは、 `ContentNegotiatingViewResolver`の使い方を紹介します。このチュートリアルの最後では、同じモデルが要求されたファイル拡張子に基づいて、XML、JSON、RSS、およびJSPのさまざまなビューで返されます。
使用される技術:
-
Spring 3.0.5.RELEASE
-
ジャクソン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.モデル
XMLファイルで出力できるように、JAXBアノテーションでアノテーションされたPojo。また、後でこのモデルを使用してさまざまなビューで表示します。
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/spring-3-mvc-and-xson-example/[Spring MVC and XML]、リンク://spring-mvc/spring-3-mvc-and-json-example/[Spring MVCとJSON]の例
4. RSSビュー
RSS Viewを出力するには、 `AbstractRssFeedView`を拡張する必要があります。どのように動作するかを知るには、//spring-mvc/spring-3-mvc-and-rss-feed-example/[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("/");
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>
コントローラ
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は “mediaTypes”プロパティで宣言されたファイル拡張子に基づいて適切なビューを返すために “ContentNegotiatingViewResolver`”(order = 1)を使用します。一致しない場合は ” 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ファイルとして表示します。
「spring-mvc-contentneg-json」、width = 556、height = 315]
http://localhost:8080/SpringMVC/fruit/banana.rss
、RSSファイルとして表示します。

http://localhost:8080/SpringMVC/fruit/banana
、JSPページとして表示します。

ソースコードをダウンロードする
ダウンロードする –
SpringMVC-ContentNegotiatingViewResolver-Example.zip
(10 KB)
参考文献
ContentNegotiatingViewResolver JavaDoc]**
http://www.jroller.com/eyallupu/entry/content
negotiation
using
spring
mvc[Content
Spring MVCのContentNegotiatingViewResolverを使用したネゴシエーション]**
http://blog.anthonychaves.net/2010/02/01/spring-3-0-web-mvc-and-json/
[Another
ContentNegotiatingViewResolverの例]** link://spring-mvc/spring-3-mvc-and-rss-feed-example/[Spring 3 MVCと
RSSフィードの例]** link://spring-mvc/spring-3-mvc-and-xml-example/[Spring 3 MVCとXML
例]** link://spring-mvc/spring-3-mvc-and-json-example/[Spring 3 MVCとJSON
例]