Spring MVC Controller 实现返回XML格式的数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Pnoter/article/details/52218363

项目框架使用的是Spring MVC框架,在Controller中返回的数据格式一直用的是Json,但是最近项目需求需要返回XMl格式的数据,于是借助万能的互联网,找到了一些方法,一下方法为我经验总结。

项目环境

  • Spring 4.0.5.RELEASE
  • JDK 1.7
  • Eclipse
  • Maven

pom.xml添加依赖库

<properties>
    <spring.version>4.0.5.RELEASE</spring.version>
</properties>
<dependencies>
    <!-- Spring 4 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>

创建实体类JavaBean

在com.mybatis.model中创建一个简单的实体类,Coffee.java,添加JAXB注解(@XmlRootElement,@XmlElement),它会自动转换成XML,JAXB已经包含在JDK1.6中了,不需要额外添加依赖库,只需要使用注解,Spring会自动转换成XML

package com.mybatis.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(){

    }
}

JAXB Annotation说明:
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。

创建Controller类

在com.controller中创建一个Controller类,XMlController.java

package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.mybatis.model.Coffee;

@Controller
@RequestMapping("/coffee")
public class Xmlcontroller {

    @RequestMapping("/xml")
    public @ResponseBody Coffee getCoffeeinXML(@RequestParam String name){
        Coffee coffee = new Coffee(name,100);
        return coffee;
    }
}

测试连接

http://localhost:8080/CMP/coffee/xml.do?name=zhang
这里写图片描述

其他方法说明

  • 在spring的配置中启用mvc:annotation-driven注解
<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-4.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <mvc:annotation-driven />

    <!-- 自动扫描controller包下的所有类,如果@Controller注入为bean -->
    <context:component-scan base-package="com.controller" />
</beans>
  • 添加spring-oxm.jar依赖,并用以下的MarshallingView处理转换,使用这种方法,你可以不用在方法中使用@ResponseBody注解
<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.mybatis.model.Coffee</value>
                </list>
            </property>
          </bean>
        </constructor-arg>
    </bean>

猜你喜欢

转载自blog.csdn.net/Pnoter/article/details/52218363