1. 程式人生 > >Spring 梳理 - View - JSON and XML View

Spring 梳理 - View - JSON and XML View

  1. To output JSON and XML views, you don’t need to do any extra works, Spring MVC will handle the conversion automatically. Read this Spring MVC and XML, and Spring MVC and JSON examples.
  2. XML example

    1.     <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> </dependencies>

       

    2. A simple POJO model and annotated with JAXB annotation, later convert this object into XML output.
      1. package com.mkyong.common.model;
        
        import javax.xml.bind.annotation.XmlElement;
        import javax.xml.bind.annotation.XmlRootElement;
        
        @XmlRootElement(name = "coffee
        ") public class Coffee { String name; int quanlity; public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } public int getQuanlity() { return quanlity; } @XmlElement public void setQuanlity(int quanlity) { this.quanlity = quanlity; } public Coffee(String name, int quanlity) { this.name = name; this.quanlity = quanlity; } public Coffee() { } }

         

    3. Controller

      1. package com.mkyong.common.controller;
        
        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.PathVariable;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RequestMethod;
        import org.springframework.web.bind.annotation.ResponseBody;
        import com.mkyong.common.model.Coffee;
        
        @Controller
        @RequestMapping("/coffee")
        public class XMLController {
        
            @RequestMapping(value="{name}", method = RequestMethod.GET)
            public @ResponseBody Coffee getCoffeeInXML(@PathVariable String name) {
        
                Coffee coffee = new Coffee(name, 100);
                
                return coffee;
        
            }
            
        }

         

    4. mvc:annotation-driven

      1. <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 />
        
        </beans>

         

    5. Alternatively
      1. Alternatively, you can declares “spring-oxm.jar” dependency and include following MarshallingView, to handle the conversion. With this method, you don’t need annotate @ResponseBody in your method.
        
        <beans ...>
            <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
            
            <bean id="xmlViewer" 
                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.Coffee</value>
                        </list>
                    </property>
                  </bean>
                </constructor-arg>
            </bean>
        </beans>

         

  3. JSON example

    1. pom.xml
      1. <project xmlns="http://maven.apache.org/POM/4.0.0" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                http://maven.apache.org/maven-v4_0_0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>com.mkyong.common</groupId>
            <artifactId>SpringMVC</artifactId>
            <packaging>war</packaging>
            <version>1.0-SNAPSHOT</version>
            <name>SpringMVC Json Webapp</name>
            <url>http://maven.apache.org</url>
        
            <properties>
                <spring.version>3.2.2.RELEASE</spring.version>
                <jackson.version>1.9.10</jackson.version>
                <jdk.version>1.6</jdk.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>${jackson.version}</version>
                </dependency>
        
            </dependencies>
        
            <build>
                <finalName>SpringMVC</finalName>
                <plugins>
                  <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-eclipse-plugin</artifactId>
                    <version>2.9</version>
                    <configuration>
                        <downloadSources>true</downloadSources>
                        <downloadJavadocs>false</downloadJavadocs>
                        <wtpversion>2.0</wtpversion>
                    </configuration>
                  </plugin>
                  <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <configuration>
                        <source>${jdk.version}</source>
                        <target>${jdk.version}</target>
                    </configuration>
                  </plugin>
                </plugins>
            </build>
        
        </project>

         

    2. Model

      1. A simple POJO, later output this object as formatted JSON data.
      2. package com.mkyong.common.model;
        
        public class Shop {
        
            String name;
            String staffName[];
        
            //getter and setter methods
            
        }

         

    3. Controller

      1. Add @ResponseBody as return value. Wen Spring sees
        
            Jackson library is existed in the project classpath
            The mvc:annotation-driven is enabled
            Return method annotated with @ResponseBody
        
        Spring will handle the JSON conversion automatically.
        
        
        
        package com.mkyong.common.controller;
        
        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.PathVariable;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RequestMethod;
        import org.springframework.web.bind.annotation.ResponseBody;
        import com.mkyong.common.model.Shop;
        
        @Controller
        @RequestMapping("/kfc/brands")
        public class JSONController {
        
            @RequestMapping(value="{name}", method = RequestMethod.GET)
            public @ResponseBody Shop getShopInJSON(@PathVariable String name) {
        
                Shop shop = new Shop();
                shop.setName(name);
                shop.setStaffName(new String[]{"mkyong1", "mkyong2"});
                
                return shop;
        
            }
            
        }

         

    4. mvc:annotation-driven

      1. <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 />
        
        </beans>