优雅的java controller实现(一)
本系列预计分为三篇文章,本篇文章主要介绍java参数接收
前言
本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:1. 接口地址(也就是URL地址)、2. 请求方式(一般就是get、post,当然还有put、delete)、3. 请求数据(request,有head跟body)、4. 响应数据(response)。
本篇文章主要从参数接收,参数校验,统一响应和异常处理四个方面进行介绍。
Controller参数接收
常见的请求无非是post和get两种,这里直接使用代码说明
1 2 3 4 5 6 7 8 9 10 11 12
| @RestController @RequestMapping("/product/product-info") public class ProductInfoController {
@Autowired ProductInfoService productInfoService;
@GetMapping("/findById") public ProductInfoQueryVo findById(Integer id) { ... } }
|
注解说明
- @RestController : @Controller + @ResponseBody,加上这个注解,springboot就会吧这个类当成controller进行处理,然后把所有返回的参数放到ResponseBody中
- @RequestMapping:接受所有请求类型,参数为目录
- @PostMapping/@GetMapping:对应POST/GET请求,参数为目录
参数接收
上述代码中介绍了直接接收参数的一种方法,在函数签名中写入变量即可进行处理,下面具体介绍:
通过Controller的方法的形参接收
适用于get, post方式提交,post方式的时候编码方式需设置为:x-www-form-urlencoded转换为键值对形式,参数名必须完全相同才能映射到,不可以实现别名转换。
1 2 3 4 5 6 7 8 9 10 11 12
|
@RequestMapping("/addUser1") public String addUser1(String username,String password) { System.out.println("username is:"+username); System.out.println("password is:"+password); return "demo/index"; }
|
通过HttpServletRequest接收
post方式和get方式都可以, 但不能接收json, post方式的时候编码方式需设置为:x-www-form-urlencoded转换为键值对。
在使用本方法时应注意,如果获取的参数不存在可能会抛出空指针异常
1 2 3 4 5 6 7 8 9 10 11 12 13
|
@RequestMapping("/addUser2") public String addUser2(HttpServletRequest request) { String username=request.getParameter("username"); String password=request.getParameter("password"); System.out.println("username is:"+username); System.out.println("password is:"+password); return "demo/index"; }
|
通过javabean接收
post方式和get方式都可以。参数?key1=val1&key2=val2的方式加在url后面即可。post方式不想让参数拼接在url后面的话,可以将参数放在body中,编码方式需设置为:x-www-form-urlencoded。
1 2 3 4 5 6 7 8 9 10 11 12
| @RequestMapping("/doLogin") public User doLogin(User u) {
logger.info("name: " + u.getName()); logger.info("pswd: " + u.getPswd());
User user = new User(); user.setName(u.getName()); user.setPswd(u.getPswd());
return user; }
|
通过javabean接收json
1 2 3 4 5 6
| @RequestMapping("/doLogin") public @ResponseBody User doLogin(@RequestBody User u) { logger.info("name: " + u.getName()); logger.info("pswd: " + u.getPswd()); return u; }
|
通过map接收json
1 2 3 4 5 6 7 8 9 10 11 12
| @RequestMapping("/doLogin") public @ResponseBody User doLogin(@RequestBody Map<String, String> u) {
logger.info("name: " + u.get("name")); logger.info("pswd: " + u.get("pswd"));
User user = new User(); user.setName(u.get("name")); user.setPswd(u.get("pswd"));
return user; }
|
注意Controller上标注了@RestController,这样相当于Controller的所有方法都标注了@ResponseBody,但是接收参数的@RequestBody还是需要手动协商
通过@PathVariable获取参数
1 2 3 4 5 6 7 8 9 10 11
|
@RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET) public String addUser4(@PathVariable String username,@PathVariable String password) { System.out.println("username is:"+username); System.out.println("password is:"+password); return ""; }
|
用注解@RequestParam绑定请求参数到方法入参
post方式的时候编码方式需设置为:x-www-form-urlencoded, 不能接受json
1 2 3 4 5 6 7 8 9
| @RequestMapping("/doLogin") public User doLogin(@RequestParam(value="name") String username, @RequestParam(value="pswd") String password) { logger.info("name: " + username); logger.info("psed: " + password); User user = new User(); user.setPswd(password); user.setName(username); return user; }
|
更多
对于复杂的参数接收,可以采用不同实体类嵌套的方法进行解析,举例说明:
参数
1 2 3 4 5
| { "s": {"clas": "s1", "age": "11"}, "name" : "susq", "pswd" : 1233 }
|
实体类
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class User { Student s; String name; String pswd; }
public class Student { String clas; int age; }
|