发布于 

优雅的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
/**
* 1.直接把表单的参数写在Controller相应的方法的形参中
* @param username
* @param password
* @return
*/
@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
/**
* 2、通过HttpServletRequest接收
* @param request
* @return
*/
@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
   /**
* @param username
* @param password
* @return
*/
@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;
// getter setter
}

//Student是另一单独的对象
public class Student {
String clas;
int age;
// getter setter
}