空夜

SpringMVC处理请求+接收数据
在web应用中,经常需要处理HTTP请求,请求通常会携带指定格式的数据,包括普通格式的数据,如表单、AJAX默认格...
扫描右侧二维码阅读全文
06
2018/12

SpringMVC处理请求+接收数据

在web应用中,经常需要处理HTTP请求,请求通常会携带指定格式的数据,包括普通格式的数据,如表单、AJAX默认格式的数据,也有json这样更复杂的数据格式。对于不同类型的数据,有着不同的接收方式。

本文主要介绍普通类型(表单域对象、AJAX默认格式数据)的接收方式,以及json数据的接收方式。


普通数据的接收方式(默认)

这里说的普通数据主要指如下类型:表单提交、get形式的链接请求、非json格式的AJAX请求。

<!-- 表单 -->
<form method="POST" action="/login">
  姓名:<input type="text" name="username" />
  密码:<input type="password" name="password" />
  <button type="submit">提交</button>
</form>
<!-- url形式 -->
<button click="submit('myName','234')">提交</button>
<script>
function submit(name, pass){
  window.location.href = "/login?username="+name+"&password="+pass;
}
</script>
<!-- ajax形式 -->
var myData = {"username":"myName", "password":"123"}; //非json
$().ajax({
  url: "/login",
  method: "POST",
  async:true,
  data: myData,
  dataType: "json", //返回数据的格式,而不是data的格式
  success:function(data){
    //...
  }
});

对于普通形式的数据,介绍两种接收方式:

1.利用spring的反射机制,直接映射到参数

@RestController
public Class UserController{
  @PostMapping(value = "/login")
  public Map login(String username, String password){
    Map<String, Object> map = new HashMap<>();
    if (username!=null && password!=null){
      User user = new User(username, password);
      //...
    } else {
      map.put("success", false);
      map.put("msg", "参数错误");
    }
    
    return map;
  }
}

2.使用HTTPServletRequest

@RestController
public Class UserController{
  @PostMapping(value = "/login")
  public Map login(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    Map<String, Object> map = new HashMap<>();
    if (username!=null && password!=null){
      User user = new User(username, password);
      //...
    } else {
      map.put("success", false);
      map.put("msg", "参数错误");
    }
    
    return map;
  }
}

json格式数据的接收

ajax请求指定content-type为application/json这样的形式。使用HTTPServletRequest是无法接受到数据的,必须使用@RequestBody注解。

@RestController
public Class UserController{
  @PostMapping(value = "/login")
  public Map login(@RequestBody User user){
    Map<String, Object> map = new HashMap<>();
    if (user.getUsername()!=null && user.getPassword()!=null){
      //...
    } else {
      map.put("success", false);
      map.put("msg", "参数错误");
    }
    
    return map;
  }
}

class User{
  private String username;
  private String password;
  //省略get和set
}

对于上面的@RequestBody注解,需要注意的事,我们将请求的body中携带的数据全部给了这个注解后的参数。也就是说,一个方法只会有一个@RequestBody。
问题出现了,如果我要接收的是一个复杂的数据怎么办,比如不仅有username,password,还有List<Skills> skillList这样包含了Skill对象的的List数据。解决办法很简单,直接将这个list也作为一个参数封装到User类中,又或者重新定义一个XXXForm类来包含所有的数据。

---

 public class UserSaveForm{
     private User user;
     private List<Skill> skillList;
     //省略get和set
 }
@RestController
public Class UserController{
  @PostMapping(value = "/login")
  public Map login(@RequestBody UserSaveForm userSaveForm){
    Map<String, Object> map = new HashMap<>();
    if (userSaveForm.getUser()!=null && userSaveForm.getSkillList()!=null){
      //...
    } else {
      map.put("success", false);
      map.put("msg", "参数错误");
    }
    
    return map;
  }
}
Last modification:December 6th, 2018 at 09:30 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment