Spring 3 MVC ContentNegotiatingViewResolver пример

Spring 3 MVC ContentNegotiatingViewResolver пример

Spring 3,ContentNegotiatingViewResolver, представляет собой интересный преобразователь представлений, который позволяет выводить один и тот же ресурс (контент или данные) в представления разного типа, напримерJSP,XML,RSS,JSON и т. д. Проще говоря, см. Следующий 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. Весна 3.0.5. ВЫПУСК

  2. Джексон 1.7.1

  3. Рим 1.0.0

  4. JDK 1.6

  5. Maven 3

  6. Затмение 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. модель

Pojo, снабженный аннотацией JAXB, чтобы он мог выводиться в XML-файле. Кроме того, позже мы будем использовать эту модель для отображения в разных видах.

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 View

Для вывода представлений в формате JSON и XML вам не нужно выполнять никаких дополнительных работ, Spring MVC автоматически выполнит преобразование. Прочтите эти примерыSpring MVC and XML иSpring MVC and JSON.

4. RSS Просмотр

Для вывода RSS View вам нужно расширить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 View

Страница JSP для отображения данных модели.

Файл: list.jsp



    

Spring @MVC ContentNegotiatingViewResolver

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

6. контроллер

Контроллер Spring, чтобы сгенерировать «фруктовую» модель и вернуть ее.

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» (порядок = 1) для возврата подходящего представления (на основе расширения файла, объявленного в свойстве «mediaTypes»), если не соответствует, то используйте «InternalResourceViewResolver» (порядок = 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

Скачать исходный код