美文网首页
SpringMVC参数接收不到

SpringMVC参数接收不到

作者: feiyingmm | 来源:发表于2018-06-27 20:48 被阅读0次
  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,你要了解的内容

首先,明确下<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代码:

<html lang="zh-CN">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <%-- 如果不写enctype,则默认enctype=application/x-www-form-urlencoded --%>
        <form method="post" action="/form/submit1">
            <input name="username1" value="" type="text">
            <input name="username2" value="" type="text">
            <input type="submit" value="submit">
        </form>
    </body>
</html>

后台接收代码:

@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提交的方式。 前台代码:

<html lang="zh-CN">
<head>
    <meta charset="utf-8">
</head>
<body>
    <form method="post" enctype="multipart/form-data" action="/form/submit2">
        <input name="username1" value="" type="text">
        <input name="username2" value="" type="text">
        <input type="file" name="image">
        <input type="submit" value="submit">
    </form>
</body>
</html>

后台代码:

@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时,需要在配置文件中对文件上传的要求进行配置

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="104857600"/>
        <property name="maxInMemorySize" value="4096"/>
</bean>

或者我们可以使用最原始的方法,获取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]

前台代码:

<html lang="zh-CN">
<head>
    <meta charset="utf-8">
</head>
<body>
<script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script>
    data = {};
    data["username1"] = "haha";
    data["username2"] = "hahafdf";
    $.ajax({
        "url": "/form/submit3",
        "type": "POST",
        "data": JSON.stringify(data),
        "dataType":"json",
        "contentType":"application/json;charset=UTF-8",
        "success": function () {
            alert("success");
        },
        "error": function () {
            alert("error");
        }
    });
</script>
</body>
</html>

需要注意的地方是,需要写上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参数接收不到

      本文链接:https://www.haomeiwen.com/subject/bdqiyftx.html