SpringMVC的JSON数据交互(七)-@Response,@RestController,@RequestBody用法

1.@RequestBody   (自动将请求的数据封装为对象)

作用:

@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。

传统的请求参数:

itemEdit.action?id=1&name=zhangsan&age=12

现在的请求参数:

使用POST请求,在请求体里面加入json数据

{

"id": 1,

"name": "测试商品",

"price": 99.9,

"detail": "测试商品描述",

"pic": "123456.jpg"

}

2.@ResponseBody

作用:

@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

 

 

总结:

  在controller中我们可以在方法上面添加@ResponseBody注解,这样我们返回实体对象或者字符串时,就会自动转换成json对象传给前端。在spring4.0后,@ResponseBody又可以加在类上,表示该类中的所有方法都加有@ResponseBody,很方便。另一种方式是使用@RestController注解在类上,作用等于@Controller与@ResponseBody同时加在类上,这也是最方便的一种方式。要让@ResponseBody在类上也起作用,需要在springmvc配置文件中加上<mvc:annotation-driven />这一行配置才可以。而@ResponseBody使用在方法上,则不用添加该配置也可以使用。也就是说springmvc默认只支持@ResponseBody在方法上使用,不支持在类上的使用。

  在实际项目中,我们可能会将后台管理项目与app的后台放在一个项目里面,这样就等于是两个后台共用一套springmvc的配置文件。但是app后台的controller都是返回json信息的,而后台管理是用来返回jsp界面的,会有点混乱。这种情况下,我们需要同时配置<mvc:annotation-driven />和viewResolver,这样的话,app后台的controller都加上@RestController即可,而后台管理的controller则不要@ResponseBody和@RestController,只返回字符串格式的jsp文件名即可。这样就可以两不耽误,两个项目合在一起开发了。

查看RestController的源码:  (是一个组合注解)

/*
 * Copyright 2002-2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.bind.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Controller;

/**
 * A convenience annotation that is itself annotated with {@link Controller @Controller}
 * and {@link ResponseBody @ResponseBody}.
 * <p>
 * Types that carry this annotation are treated as controllers where
 * {@link RequestMapping @RequestMapping} methods assume
 * {@link ResponseBody @ResponseBody} semantics by default.
 *
 * @author Rossen Stoyanchev
 * @author Sam Brannen
 * @since 4.0
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any
     * @since 4.0.1
     */
    String value() default "";

}

 

 

例如:

package cn.xm.jwxt.controller.common;

import cn.xm.jwxt.bean.common.Dictionary;
import cn.xm.jwxt.service.common.DictionaryService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLException;
import java.util.List;

/**
 * 字典controller
 */

@RequestMapping("/dictionary")//基本的映射路径
//@ResponseBody//所有方法返回都是以JSON形式返回
//@Controller//控制层代码
@RestController//这个注解等于@ResponseBody+@Controller
public class DictionaryController {
    @Autowired
    private DictionaryService dictionaryService;
    private Logger logger = Logger.getLogger(DictionaryController.class);

    @RequestMapping("/getDictionaryTree")
    public List<Dictionary> getDictionaryTrees() {
        List<Dictionary> dictionaryTree = null;
        try {
            dictionaryTree =  dictionaryService.getDictionaryTree();
        } catch (SQLException e) {
            logger.error("查询字典树出错!",e);
        }
        return dictionaryTree;
    }


}

 

 

3.请求json,响应json实现:
3.1. 加入jar包

如果需要springMVC支持json,必须加入json的处理jar

我们使用Jackson这个jar,如下图:

 

3.1 JSP页面ajax请求

<script type="text/javascript">

$(function(){
    var param='{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';
    $.ajax({
        url:"${pageContext.request.contextPath }/json.action",
        async:true,
        type:"POST",
        data:param,
        contentType : "application/json;charset=UTF-8",//发送数据的格式
        success: function(data){
              alert(data.name);
            },
        error:function(){
            alert("请求失败");
            },
        dataType:"json"    //回掉数据格式
    });
    
})
</script>

 

3.2.处理ajax请求的controller

@RequestMapping(value = "/json.action")
    public    @ResponseBody Items json(@RequestBody Items items){
//        设置@RequestBody后子发动将ajax请求封装为对象
        System.out.println(items);
        
//        设置@ResponseBody后自动将返回的数据封装为ajax
        return items;
    }
    

 

3.3 配置json转换器

如果不使用注解驱动<mvc:annotation-driven />,就需要给处理器适配器配置json转换器,参考之前学习的自定义参数绑定。

 

在springmvc.xml配置文件中,给处理器适配器加入json转换器:

<!--处理器适配器 -->

   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

      <property name="messageConverters">

      <list>

      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>

      </list>

      </property>

   </bean>

 

转载于:https://www.cnblogs.com/qlqwjy/p/7246450.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值