zoukankan      html  css  js  c++  java
  • 使用SpringBoot做Javaweb时,数据交互遇到的问题

    有段时间没做过javaweb了,有点生疏了,js也忘记得差不多,所以今天下午做前后端交互的时候,传到后台的参数总是为空,前端控制台了报一个String parameter “xxx” is not present的错误。

    贴一下代码

    前端代码
      $.ajax({
            type: 'GET',
            url: '/weibo/list',
            cache: 'false',
            data: {
                "startdt": formData['startdt'],
                "enddt": formData['enddt'],
    			"provinceName": formData['provinceName']
            },
            dataType: 'json',
    		//contentType : 'application/x-www-form-urlencoded;charset=UTF-8',
         headers : {
    		'Content-Type' : 'application/json;charset=utf-8'
    	},
            success: function (result) {...}
    后端代码 @RequestMapping("/list") @ResponseBody public List<Object> getWeiboAndCellList(@RequestParam("startdt") String date1, @RequestParam("enddt") String date2, @RequestParam("provinceName") String province) {...}

      之前出错是因为我没有加@RequestParam注解,它的作用等同于HttpServletRequest request,request.getParameter("")。但是这里有个细节,如果Content-Type设置为“application/x-www-form-urlencoded;charset=UTF-8”无论是POST请求还是GET请求都是可以通过这种方式成功获取参数,但是如果设置为“application/json;charset=utf-8”,会报上述错误。ajax传JSON时设置的contenttype 如果是application/json或者text/json时,JAVA中request.getParameter("")怎么也接收不到数据。这是因为,Tomcat的HttpServletRequest类的实现类为org.apache.catalina.connector.Request(实际上是org.apache.coyote.Request)。

      当$.ajax content-Type是json时,可以用@RequestBody这个注解来解决。

    前端代码 
    var obj ={};
    obj[
    "user"] = JSON.stringify(this.update); obj["classRoomId"] = this.classRoomid; $.ajax({ type: 'POST', url: url, dataType: 'json', cache: false, headers : { 'Content-Type' : 'application/json;charset=utf-8' }, data: JSON.stringify(obj), success: function (result) {...}
    }); 后端代码 @RequestMapping(
    "/updateUser") @ResponseBody public User updateUser(@RequestBody Map<String, Object> map){...}

    原因:@RequestParam 底层是通过request.getParameter方式获得参数的,也就是说,@RequestParam 和request.getParameter是同一回事。因为使用request.getParameter()方式获取参数,可以处理get 方式中queryString的值,也可以处理post方式中 body data的值,所以,@RequestParam可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST。

      @RequestBody接受的是一个json对象的字符串,而不是Json对象,在ajax请求时往往都是Json对象,用JSON.stringify(data)的方式就能将对象变成json字符串。@RequestBody接收的是一个字符串,返回的参数可以是一个Map对象。

  • 相关阅读:
    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析
    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析
    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析
    PAT 1152 Google Recruitment
    PAT 1092 To Buy or Not to Buy
    PAT 1081 Rational Sum
    PAT 1084 Broken Keyboard
    PAT 1077 Kuchiguse
    PAT 1073 Scientific Notation
  • 原文地址:https://www.cnblogs.com/shirandedan/p/7727326.html
Copyright © 2011-2022 走看看