关于SpringMVC传递数据的一些思考

213 阅读2分钟

Ⅰ:前言

前面一篇文章主要学习了利用SpringMVC传递与返回数据、现在大多不采用jsp而使用前后台分离的方式,重点掌握利用SpringMVC与前台基于json数据的交互。

上文例子中前台发送给后台的是json数据、后台返回给前台的是json数据。灵活性较差,每一次都需要将表单元素序列化并封装为json对象在转为json字符串给服务器端。我觉得前台发送给服务器端的数据类型应该灵活些,前后台分离重点应该是服务器端向后台返回json数据。

Ⅱ:content-Type

MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。

常见媒体格式如下:

  • text/html : HTML格式
  • text/plain :纯文本格式
  • text/xml : XML格式
  • image/gif :gif图片格式
  • image/jpeg :jpg图片格式
  • image/png:png图片格式

以application开头的媒体格式

  • application/xhtml+xml :XHTML格式
  • application/xml : XML数据格式
  • application/atom+xml :Atom XML聚合格式
  • application/json : JSON数据格式
  • application/pdf :pdf格式
  • application/msword : Word文档格式
  • application/octet-stream : 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded : form中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)


form表单用action进行post/get提交的content-Type格式都为application/x-www-form-urlencoded,ajax提交至服务器的默认编码也为application/x-www-form-urlencoded。那我们可以不使用@RequestBody注解来进行开发提升灵活性。默认情况下,@RequestBody注解会将请求体中的内容解析为字符串。

Ⅲ:使用AJAX默认的Content-Type进行交互

该种方式可以大大提高前台发送数据、后台获取数据的灵活性
    <form id="testForm">
        用户名:<input type="text" name="username"/><br/>
        性别:<input type="text" name="sex"/><br/>
        年龄:<input type="text" name="age"/><br/>
        <input type="button" value="提交" id="submit">
    </form>
    $("#submit").click(function () {
        var jsonObject = $("#testForm").serializeObject();
        //console.log(JSON.stringify(jsonObject));
        $.ajax({
            type: "post",
            url: "test/demo5",
            data: jsonObject,
            dataType: 'json',
            success: function(data) {
                //如果返回的是json字符串、需要在前台解析为json对象
                var object = $.parseJSON(data);
                alert(object.statusCode);
            }
        });
    });
    @RequestMapping("/demo5")
    public  @ResponseBody String getUserInfo(HttpServletRequest request,User user,String username,String age) {
        System.out.println(request.getMethod());
        System.out.println(request.getContentType());
        System.out.println(user.toString());
        System.out.println(username);
        System.out.println(age);
        //业务逻辑处理
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("statusCode","200");
        return jsonObject.toString();
    }

后台已接收到参数并映射进去

前台也已接收到返回的json字符串

前台发送数据可以为$("#testForm").serialize或者$("#testForm").serializeArray或者表单数据的json对象都可以。
后台接收数据可以一一对应、可以用JavaBean、可以@RequestParam

相关链接:

juejin.cn/post/684490… juejin.cn/post/684490…