開発者ドキュメント

Spring 3 MVC ContentNegotiatingViewResolverの例

Spring 3、

ContentNegotiatingViewResolver

は、

JSP



XML



RSS



JSON

などのような異なるタイプのビューに同じリソース(コンテンツまたはデータ)を出力できる興味深いビューリゾルバです。簡単に言えば、次のWeb要求URLを参照してください。

  1. `//fruit/banana.rss`がRSSファイルとして返されます.

  2. `//fruit/banana.xml`がXMLファイルとして返されます.

  3. `//fruit/banana.json`がJSONファイルとして返されます.

  4. `//fruit/banana`がデフォルトのviewリゾルバに返されます.

このチュートリアルでは、 `ContentNegotiatingViewResolver`の使い方を紹介します。このチュートリアルの最後では、同じモデルが要求されたファイル拡張子に基づいて、XML、JSON、RSS、およびJSPのさまざまなビューで返されます。

使用される技術:

  1. Spring 3.0.5.RELEASE

  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.モデル

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

例]

モバイルバージョンを終了