Spring 3 Exemple MVC ContentNegotiatedViewResolver

Spring 3 MVC ContentNegotiatedViewResolver, exemple

Spring 3,ContentNegotiatingViewResolver, est un résolveur de vue intéressant, qui vous permet de sortir une même ressource (contenu ou données) vers différents types de vues commeJSP,XML,RSS,JSON et etc. En termes simples, voir l'URL suivante demandée sur le Web, qui reviendra dans différentes vues.

  1. http://www.example.com/fruit/banana.rss, renvoyé sous forme de fichier RSS.

  2. http://www.example.com/fruit/banana.xml, renvoyé sous forme de fichier XML.

  3. http://www.example.com/fruit/banana.json, renvoyé sous forme de fichier JSON.

  4. http://www.example.com/fruit/banana, renvoyé à votre résolveur de vue par défaut.

Note
CeContentNegotiatingViewResolver détermine d'abord «quel résolveur de vue doit renvoyer par extension de fichier», si aucune vue ne correspond, puis utilisez le résolveur de vue par défaut. Lisez ceSpring documentation pour étudier son fonctionnement.

Dans ce didacticiel, nous vous montrons comment utiliserContentNegotiatingViewResolver. À la fin de ce didacticiel, un même modèle sera renvoyé dans différentes vues - XML, JSON, RSS et JSP, en fonction de l'extension de fichier demandée.

Technologies utilisées:

  1. Spring 3.0.5.RELEASE

  2. Jackson 1.7.1

  3. Rome 1.0.0

  4. JDK 1.6

  5. Maven 3

  6. Eclipse 3.6

Note
JAXB est intégré au JDK1.6, vous n'avez donc pas besoin de l'inclure manuellement.

1. Dépendance du projet

Déclare les dépendances suivantes dans votre fichier 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. Modèle

Un Pojo, annoté avec une annotation JAXB, afin qu'il puisse sortir en fichier XML. En outre, plus tard, nous utilisons ce modèle pour afficher dans différentes vues.

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. Vue JSON et XML

Pour générer des vues JSON et XML, vous n'avez pas besoin de faire de travaux supplémentaires, Spring MVC gérera la conversion automatiquement. Lisez ces exemples deSpring MVC and XML etSpring MVC and JSON.

4. RSS Voir

Pour afficher la vue RSS, vous devez étendreAbstractRssFeedView. Lisez ceSpring 3 MVC and RSS example pour savoir comment cela fonctionne.

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. Vue JSP

Une page JSP pour afficher les données du modèle.

Fichier: list.jsp



    

Spring @MVC ContentNegotiatingViewResolver

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

6. Manette

Contrôleur à ressort, pour générer un modèle «fruit» et le renvoyer.

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. Exemple ContentNegotiatorViewResolver

Le code doit être explicite. Cependant, vous devez définir la propriété «order», où une valeur inférieure obtient une priorité plus élevée. Dans ce cas, lorsqu'une URL est demandée, Spring MVC utilisera «ContentNegotiatingViewResolver» (order = 1) pour renvoyer une vue appropriée (basée sur l'extension de fichier déclarée dans la propriété «mediaTypes»), si elle ne correspond pas, puis utilisez «InternalResourceViewResolver» (order = 2) pour renvoyer une page JSP par défaut.



    

    

    
      
      
        
           
           
           
        
      

      
        
          
          
          

          
          

          
          
            
                
                   
                    
                       com.example.common.model.Fruit
                    
                   
                
            
          
         
      
      

    

    
    
        
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

8. Demo

Même modèle et affichage dans différentes vues, viaContentNegotiatingViewResolver.

http://localhost:8080/SpringMVC/fruit/banana.xml, afficher sous forme de fichier XML.

spring mvc and xml demo

http://localhost:8080/SpringMVC/fruit/banana.json, afficher sous forme de fichier JSON.

spring mvc and json demo

http://localhost:8080/SpringMVC/fruit/banana.rss, afficher sous forme de fichier RSS.

spring mvc and RSS demo

spring mvc and JSP demo

Télécharger le code source