SpringMVC返回客户端Json/XML数据

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

1. HttpMessageConverter
它是Spring的一个接口,它负责将请求信息转为一个对象(类型为T),将对象(类型为T)输出为响应信息。
DispatcherServlet默认安装了RequestMappingHandlerAdapter作为HandlerAdapter的组件实现类,HttpMessageConverter即由RequestMappingHandlerAdapter使用,将请求信息转为对象,或将对象转为响应信息。RequestMappingHandlerAdapter默认装配了一下的转换器:

StringHttpMessageConverter : 用途为将请求转为字符串,T为String类型,可读取所有媒体的请求信息,响应信息的媒体类型为text/plain。
ByteArrayHttpMessageConverter : 用途为读/写二进制数据,T为byte[]类型,响应信息为application/octet-stream。
SourceHttpMessageConverter : 用于读/写javax.xml.stransfrom.Source类型的数据,可读取text/xml和application/xml类型的请求,响应为text/xml或application/xml类型。
AllEncompassingFormHttpMessageConverter

需要其他类型的HttpMessageConverter,可在Spring的配置文件中定义一个RequestMappingHandlerAdapter,如果显示定义RequestMappingHandlerAdapter,则会覆盖默认的RequestMappingHandlerAdapter。

<!--配置HttpMessageConverter-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" p:messageConverters-ref="messageConverters"/>
    <util:list id="messageConverters">
        <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>
    </util:list>

2. 使用HttpMessageConverter

使用@RequestBody/@ResponseBody对处理方法进行注解.
使用HttpEntity/ResponseEntity作为处理方法的入参或者返回值。
@RequestBody将HTTP请求正文转换为适合的HttpMessageConverter对象
@ResponseBody 返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。

@RequestMapping("/handle1")
public String handle1(@ReqeustBody String requestBody){
    //@RequestBody将请求报问题转为字符串绑定到requestBody中
    System.out.println(requestBody);
    return "index";
}

@RequestMapping("/handle2")
@ResponseBody//@ResponseBody使方法返回一个字节流
public byte[] handle2(@PathVariable("imageId") String imageId){
    Resource res=new ClassPathResource("/image.jpg");
    byte[] fileData=FileCopyUtils.copyToByteArray(res.getInputStream());
    return fileData;
}

2.1 处理XML
使用org.springframework.http.converter.xml.MarshallingHttpMessageConverter这个类。
(1). Spring配置文件
需要添加的依赖项:com.thoughtworks.xstreamorg.springframework.oxm

<!--配置HttpMessageConverter-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" p:messageConverters-ref="messageConverters"/>
    <util:list id="messageConverters">
        <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter p:marshaller-ref="xmlMarshaller" p:unmarshaller-ref="xmlMarshaller"/>
     </util:list>
<bean id="xmlMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="streamDriver">
            <bean class="com.thoughtworks.xstream.io.xml.StaxDriver"/>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>entity.User</value>
            </list>
        </property>
    </bean>

(2) User类

@XmlRootElement//这个标注必须
public class User {
    private String userName;
    private String password;
    private int age;
    private LocalDate birthday;
    /*Getter and Setter*/
}

(3). Controller方法

@RequestMapping(value="/testxml")
    public @ResponseBody
    User getUsers(){
        User user=new User("zhangsan","1231",23);
        return user;
    }

2.2 返回Json数据
需要的依赖项:jackson-databind
(1). Spring配置文件

<mvc:annotation-driven /> 
<mvc:resources location="/js/" mapping="/js/**"/>//静态js文件。
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" p:messageConverters-ref="messageConverters"/>
        <util:list id="messageConverters">
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
         </util:list>

(2). Controller方法

@RequestMapping("/testJson")
    public ResponseEntity<User> testJson(HttpEntity<User> requestEntity){//这里使用ResponseEntity和HttpEntity作为参数和返回值
        User user=requestEntity.getBody();
        user.setAge(28);
        System.out.println(user);
        return new ResponseEntity<User>(user, HttpStatus.OK);
    }

(3). html页面请求

<input type="button" value="testJson" id="button1"/>
$("#button1").click(function(){
               $.ajax({
                   url:"testJson",
                   data:'{"userName":"张三","password":"1230"}',
                   type:"post",
                   headers:{'Content-Type':'application/json'}//Content-type必加,不然会报错
                   success:function(data){
                       console.log(data);
                   }
               });
            });

**几点说明:
1.在返回XML数据时,如果返回的是一个集合,会有意想不到的情况发生,可能是我没有把转换器设置好的缘故。
2.当实体Bean加上了@XmlRootElement注解后,如果还想返回json数据,可以设置控制器方法的produces属性。**

@RequestMapping(value="/testXML",produces = {"application/json;charset=utf-8"})

猜你喜欢

转载自blog.csdn.net/liouyi250/article/details/79074760
今日推荐