本篇整理下Spring、SpringBoot的Controller中,获取提交的参数的方式
普通接收get或post的参数(Url Parameter)
如http://www.example.com/test?id=1&cat=xxx
@RequestMapping(value = "/test", method = RequestMethod.GET) public @ResponseBody String test(@RequestParam(value = "id", required = true) long id, @RequestParam(value = "cat", defaultValue = "") String cat) { return "id="+id+",cat="+cat; }
使用原生的Servlet对象
Spring的Controller中还可以直接使用HttpServeltRequest, HttpServletResponse, HttpSession对象,也可以使用这些对象, 直接获取原生Servlet的方法来获取参数,或者获取header:
@RequestMapping(value = "/test", method = RequestMethod.GET) //如果你需要HttpServletRequest就把HttpServletRequest request写上,不需要可以不写,后面还可以继续跟RequestParam参数 public @ResponseBody String test(HttpServletRequest request, HttpServletResponse response, HttpSession session, @RequestParam(value = "id", required = true) long id) { // request.getHeader("User-Agent"); String cat = request.getParameter("cat"); return "id="+id+",cat="+cat; }
接收get的路径中的uri
如 http://www.example.com/10001.jpg, 10001是某个用户的ID,Spring需要动态接收用户ID,来产生用户头像图片。可以使用@PathVariable
@RequestMapping(value = "/{id}.jpg", method = RequestMethod.GET, headers = "Accept=image/*", produces = "image/jpg") public @ResponseBody BufferedImage userImage(@PathVariable("id") String id) { //TODO 得到id参数,返回用户头像数据 }
接收前端的提交的Body,使用@RequestBody
@RequestMapping(value = "/test") public @ResponseBody String test(@RequestBody String string) { System.out.println(string); }
接收一个前端JsonObject,收到后转换成Java的Object
Spring自动把前端发送过来的JSON转换成后端定义好的Object
如定义一个User
public class User implements Serializable { private Long id; @NotBlank(message = "姓名不能为空") @Length(max = 100, message = "姓名不能超过100个字") private String name; @Range(min = 1, max = 200, message = "请填写正确年龄") private Integer age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
前端假设用axios提交,示例:
var user = {id: 1, name: '张三',age: 21} axios.post('test', Qs.stringify(user)) .then(function (response) { // console.log(response.data) }) .catch(function (error) { });
Controller中接收User:
@RequestMapping(value = "/test") public @ResponseBody String saveUser(@Valid @ModelAttribute("user") User user, BindingResult result) { if (result.hasErrors()) { // 如果前端提交的User有问题,比如姓名为空(这部分,请看User.java里限制的定义),返回错误给前端 } //TODO 保存User }
接收整个JSON,直接转成自由的Java(Jackson)
如果使用的是Spring,非SpringBoot,需要在pom.xml中加入jaskson支持:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.12.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-joda</artifactId> <version>2.12.1</version> </dependency>
前端提交示例:
var user = {id: 1, name: '张三',age: 21} axios.post('test', user, { headers: { 'Content-Type': 'application/json' } }) .then(function (response) { // console.log(response.data) }) .catch(function (error) { });
后端接收的示例:
@RequestMapping("/test") publicb @ResponseBody String saveRegister(@RequestBody JsonNode jsonObject) { return "OK"; }
接收前端上传的文件
使用 @RequestParam(value = "file") MultipartFile file
@RequestMapping("/upload") public @ResponseBody String upload(@RequestParam(value = "id", required = true) int id, @RequestParam(value = "file") MultipartFile file) { // 可以使用的file的一些方法示例: file.getOriginalFilename();//得到文件名 file.getBytes();//得到文件的bytes file.getInputStream();//得到InputStream }
文章评论