这里主要简单说明一下几个Controller相关的注解,Controller即是MVC的C层,主要负责接收和返回请求这一交互逻辑,所以主要在于接口的创建功能。
这是一个最简单的controller:
@RestController注解相当于@ResponseBody(返回JSON数据)以及@Controller注解的合体。
当你的项目接口为restful,且架构为前后端分离(后端仅提供数据,不做页面渲染(Thymeleaf:相当于以前的jsp)时,直接用RestController即可,他会将你接口的返回值自动转化为json数据。
也可以变式的写为:
image.png
但是如果你在一个Controller内既有纯json数据接口,又含有html返回的话(注意,返回html需要先添加模板依赖,implementation('org.springframework.boot:spring-boot-starter-thymeleaf')):
image.png
如上图所示,我们在HelloController中有两种接口返回,json的/hello以及html的/helloHtml。这里的index是我们在templates目录下创建的html文件
image.png
接下来我们看一下@GetMapping,@PostMapping,@RequestMapping这三个注解
其实GetMapping以及PostMapping相当于就是RequestMapping的子类,同时我们可以使用RequestMapping注解在Controller类上,直接为整个Controller的接口增加地址前缀
我们点击进入这三个注解源码还能看到默认的value字段是允许接收数组变量的,这也就意味着我们可以有多个名称访问同一个功能的接口:
image.png
同时如果我们使用RequestMapping但是不给method,那么即意味着此方法又可以post访问又可以get访问。。甚至比如delete等等均可,一般不建议这么做;
最后是接口参数相关的注解:
@PathVariable:pathvariable就如字面意思,添加的参数在path路径内:..../byid/3
@RequestParam:而requestpara则是:.../byid?id=3
image.png
当然如果我们接口需要传入的参数过多,每一个都写一次@RequestParam就显得过于长了,这时候我们可以用一个实体类来替代参数接收:
@GetMapping("/test")
public Person findPerson(Person person){
System.out.println("收到传递的:"+person);
return person;
}
public class Person {
private Integer id;
private String name;
private String age;
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
//省略get/set...
}
可以看到我们构建的Person对象替代作为了参数接收,这时候访问接口:/test?id=&name=即可,如果某个属性没传入,那么Controller这里获取到的person对象对应的字段值就为null。
有时候前端/移动端开发在调用我们的接口时可能会传来一些不符合需求的参数值,我们同样可以对接口参数进行校验:
@Component
public class Person {
private Integer id;
private String name;
@Min(value =15,message ="年龄不能小于15")//我们校验age作为参数传递过来不允许小于15
private String age;
@Override
}
@GetMapping("/test")
public Person findPerson(@Valid Person person, BindingResult bindingResult){
//我们使用注解Valid对Person进行验证,验证的结果会保存在BindingResult对象之中
if (bindingResult.hasErrors()){
String errorMsg=bindingResult.getFieldError().getDefaultMessage();
System.out.println(errorMsg);
return null;
}
System.out.println("收到传递的:"+person);
return person;
}
网友评论