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
例]