SpringMVC参数接收不到

  1. 后台直接接收或通过getRequestParmeter()获取,前端用contentType: application/x-www-form-urlencoded
var data = {id:7,audit_content:"123"};
$.ajax({
    type: "POST",
    url: "/method",
    data:data,
    contentType: "application/json;charset=utf-8",
    success: function (result) {
        $("#my_result").html(JSON.stringify(result));
    },
    error: function () {
        console.log("shibai")
    }
});
  1. 后台不是接收单个字符串,而是一个实体类@RequestBody Body body,前端用contentType: "application/json;charset=utf-8"
    这样java后台会得到一个有id和show_status属性的Body类,注意一定要JSON.stringify(data),不能直接传data
var data = {"id": i, "show_status":0};
        $.ajax({
            type: "POST",
            url: "/method2",
            data: JSON.stringify(data),
            contentType: "application/json;charset=utf-8",
            success: function (result) {
                $("#my_result").html(JSON.stringify(result));
            },
            error: function () {
                console.log("shibai")
            }
        });

当后台通过JavaBean对象接收参数时,必须制定method参数.

关于Form,你要了解的内容

首先,明确下

标签的属性。最重要的有三个属性:methodenctypeaction

  1. 关于method,通常取值为GETPOST。默认GET
  2. 关于action,为表单提交到的服务器地址
  3. 关于enctype,通常取值为:application/x-www-form-urlencodedmultipart/form-datatext/plain。默认application/x-www-form-urlencoded

application/x-www-form-urlencoded

当我们的表单中只包含文本数据,并且采用默认形式的enctype的时候,采用GETPOST的差别仅在于请求内容的存放位置。而请求内容均为根据form中所有表单控件的name值与value构成的key1=value1&key2=value2这样的形式。

当采用GET提交的方式。GET请求会附加在URL中。POST请求则附加在请求体中。

如果是中文内容的请求,还需注意编码问题。在Tomcat7中URL会默认编码为ISO8859-1,而在Tomcat8中则默认为UTF-8,这也是曾经踩过的一个坑。

前台Html代码:


    
        
    
    
        <%-- 如果不写enctype,则默认enctype=application/x-www-form-urlencoded --%>
        
            
            
            
        
    


后台接收代码:

@RequestMapping(value = "/submit1", method = RequestMethod.POST)
@ResponseBody
public String submit1_Get(User user) {
    System.out.println(user.getUsername1());
    System.out.println(user.getUsername2());
    return "ok";
}

关于后台的接收,我们可以采用@RequstParam接收,或者直接用Java Pojo接收,更复杂的接收情况,可以参考这篇博文: [Spring MVC] - SpringMVC的各种参数绑定方式

multipart/form-data

当我们需要上传文件的时候,必须使用这个属性。

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

上述代码为一个请求的例子。首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 –boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。关于 mutipart/form-data 的详细定义,请前往 rfc1867 查看。

由于涉及到文件上传操作,所以我们采用POST提交的方式。 前台代码:



    


    

后台代码:

@RequestMapping(value = "/submit2", method = RequestMethod.POST)
@ResponseBody
public String submit2(User user, @RequestParam("image") MultipartFile file) {
    System.out.println(user.getUsername1());
    System.out.println(user.getUsername2());
    System.out.println(file.getSize());
    return "ok";
}

当我们使用SpringMVC提供的MultipartFile时,需要在配置文件中对文件上传的要求进行配置


        
        


或者我们可以使用最原始的方法,获取HttpServletRequest进行操作,将request转为MultipartHttpServletRequest

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
multipartRequest.getParameter("image");

更复杂的情况是:关于前台上传的数据不是简单的表单控件的value值,可能需要拼接、转换操作,这时我们可以使用HTML5中的FormData解决,具体用法,大家可自行Google解决

application/json

由于ajax 的大行其道,越来越多的请求带有该形式,表示向服务器发送一个Json,例如:

POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8

{"title":"test","sub":[1,2,3]

前台代码:



    







需要注意的地方是,需要写上contentType,以及Json对象必须转为字符串格式 后台代码:

@RequestMapping(value = "/submit3", method = RequestMethod.POST)
@ResponseBody
public String submit3(@RequestBody User user) {
    System.out.println(user.getUsername1());
    System.out.println(user.getUsername2());
    return "{}";
}

SpringMVC中接收一个Json采用RequestBody,不能是RequestParam这一点非常重要,也就是说这两个注解不能同时存在。

以上。

Code Github

Reference

http://tim-fly.iteye.com/blog/2340858

http://www.cnblogs.com/HD/p/4107674.html

你可能感兴趣的:(SpringMVC参数接收不到)