Spring 3 MVC ContentNegotiatingViewResolverの例

Spring 3 MVC ContentNegotiatingViewResolverの例

Spring 3、ContentNegotiatingViewResolverは興味深いビューリゾルバーであり、同じリソース(コンテンツまたはデータ)をJSPXMLRSSなどの異なるタイプのビューに出力できます。 s、JSONなど。 簡単に言うと、次のWeb要求URLを参照してください。URLはさまざまなビューで返されます。

  1. http://www.example.com/fruit/banana.rss、RSSファイルとして返されます。

  2. http://www.example.com/fruit/banana.xml、XMLファイルとして返されます。

  3. http://www.example.com/fruit/banana.json、JSONファイルとして返されます。

  4. http://www.example.com/fruit/banana、デフォルトのビューリゾルバに戻ります。

Note
このContentNegotiatingViewResolverは、最初に「ファイル拡張子で返すビューリゾルバー」を決定します。一致するビューがない場合は、デフォルトのビューリゾルバーを使用します。 このSpring documentationを読んで、それがどのように機能するかを調べてください。

このチュートリアルでは、ContentNegotiatingViewResolverの使用方法を示します。 このチュートリアルの最後に、要求されたファイル拡張子に基づいて、同じモデルが異なるビュー(XML、JSON、RSS、JSP)で返されます。

使用される技術:

  1. Spring 3.0.5.RELEASE

  2. ジャクソン1.7.1

  3. ローマ1.0.0

  4. JDK 1.6

  5. メーベン3

  6. Eclipse 3.6

Note
JAXBはJDK1.6にバンドルされているため、手動で含める必要はありません。

1. プロジェクトの依存関係

Mavenpom.xmlファイルで次の依存関係を宣言します。

    
        3.0.5.RELEASE
    

    

        
        
            org.springframework
            spring-core
            ${spring.version}
        

        
            org.springframework
            spring-web
            ${spring.version}
        

        
            org.springframework
            spring-webmvc
            ${spring.version}
        

        
        
            org.codehaus.jackson
            jackson-mapper-asl
            1.7.1
        

        
        
            net.java.dev.rome
            rome
            1.0.0
        

    

2. モデル

XMLファイルで出力できるように、JAXBアノテーションが付けられたPojo。 また、後でこのモデルを使用してさまざまなビューで表示します。

package com.example.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ビューを出力するには、追加の作業を行う必要はありません。SpringMVCは変換を自動的に処理します。 このSpring MVC and XMLSpring MVC and JSONの例を読んでください。

4. RSSビュー

RSSビューを出力するには、AbstractRssFeedViewを拡張する必要があります。 このSpring 3 MVC and RSS exampleを読んで、どのように機能するかを確認してください。

package com.example.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.example.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 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 buildFeedItems(Map model,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        Fruit fruit = (Fruit) model.get("model");
        String msg = fruit.getName() + fruit.getQuality();

        List items = new ArrayList(1);
        Item item = new Item();
        item.setAuthor("example");
        item.setLink("http://www.example.com");

        Content content = new Content();
        content.setValue(msg);

        item.setContent(content);

        items.add(item);

        return items;
    }
}

5. JSPビュー

モデルデータを表示するJSPページ。

ファイル:list.jsp



    

Spring @MVC ContentNegotiatingViewResolver

Fruit Name : ${model.name}
Fruit Quality : ${model.quality}

6. コントローラ

「フルーツ」モデルを生成して返すスプリングコントローラー。

package com.example.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.example.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ページを返します。



    

    

    
      
      
        
           
           
           
        
      

      
        
          
          
          

          
          

          
          
            
                
                   
                    
                       com.example.common.model.Fruit
                    
                   
                
            
          
         
      
      

    

    
    
        
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

8. Demo

同じモデルで、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

ソースコードをダウンロード