-
处理HTTP请求的注解
-
使用@Controller声明控制器类
- 被@Controller标注的类称为控制器类,控制器类在SpringBoot项目中发挥的作用是处理用户发送的HTTP请求
- @Controller注解本身被@Component注解标注,所以控制器类属于组件,项目启动时,控制器类会被扫描器自动扫描到
-
使用@RequestMapping映射URL地址
-
该注解可以标注类和方法,被标注的类或者方法就能够处理用户通过@RequestMapping注解映射的URL地址发送的请求
-
@RequestMapping注解的属性
-
value属性
-
默认属性,用于指定映射的URL地址,单独使用时,可以被隐式调用
@RequestMapping("/test") @RequestMapping(value="/test")
-
映射的地址也可以是多层的
@RequestMapping("/test/demo/page")
-
允许一个方法同时映射多个URL地址
@RequestMapping(value={"/address1","address2",...})
-
-
method属性
-
能够指定用户通过@RequestMapping注解映射的URL地址发送的请求的类型
-
能够让不同的方法处理相同URL地址发送的不同类型的请求
-
示例
@RestController public class TestController { @RequestMapping(value = "/test",method = RequestMethod.GET) public String get() { return "这是一个GET请求哦"; } @RequestMapping(value = "/test",method = RequestMethod.POST) public String post() { return "这是一个POST请求哦"; } }
-
-
params属性
-
能够指定在用户通过@RequestMapping注解映射的URL地址发送的请求中须包含哪些参数
-
类型是字符串数组,故而能够指定多个参数
-
示例
@RestController public class TestController { @RequestMapping(value = "/test",params = {"name","id"}) public String havaParams(){ return "你传递了参数了"; } @RequestMapping(value = "/test") public String noParams(){ return "你没有传递参数哦"; } }
-
-
headers属性
-
能够指定用户通过@RequestMapping注解映射的URL地址发送的请求中须包含哪些指定的请求头
@RequestMapping(headers={"键1=值1","键2=值2",...})
-
Cookie
- Cookie是某些网站为了辨别用户身份,进行Session跟踪而存储在用户本地终端上的数据。Cookie会被暂时性或者永久地保存在用户客户端计算机中
-
示例
@RestController public class TestController { @RequestMapping(value = "/test") public String noCookie(){ return "请重新登录"; } @RequestMapping(value = "/test",headers = {"Cookie=ID=12345"}) public String havaCookie(){ return "欢迎回来"; } }
-
-
consumes属性
-
能够指定用户通过@RequestMapping注解映射的URL地址发送的请求的数据类型
-
示例
@RestController public class TestController { @RequestMapping("/test") public String formatError(){ return "数据格式错误"; } @RequestMapping(value = "/test",consumes = "application/json") public String hello(){ return "成功进入接口"; } }
-
-
-
包含映射层级关系的URL
-
示例
@RestController @RequestMapping("/shop") public class TestController { @RequestMapping("/book") // 拼接后的地址:"/shop/book" public String book() { return "book"; } @RequestMapping("/clothes") // 拼接后的地址:"/shop/book" public String clothes() { return "clothes"; } }
-
-
-
@ResponseBody的作用及其用法
-
该注解的作用是把方法的返回值转换为页面数据
- 如果是字符串,那就返回字符串
- 如果是其他数据类型,会先被自动封装成JSON格式的字符串,再返回(这才是最主要的功能)
-
示例
public class User { private int id; private String name; private int age; public User(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } // Getter和Setter }
@RestController public class TestController { @RequestMapping("/user") @ResponseBody public User user() { return new User(1,"kaiven",20); } }
其实你发现不加这个注解,它也能返回json格式的数据,原因就在于@RestController注解上
-
-
@RestController
- 本质上是@Controller和@ResponseBody两个注解的综合体(少些点代码啦,也是我们经常使用的)
-
-
重定向URL地址
-
概念
- 简单来说就是该URL暂时性或者永久性拒绝访问,给客户端一个新的请求地址自行去访问
-
使用“redirect:”前缀
@Controller public class TestController { @RequestMapping("/db") public String db() { return "redirect:http://www.baidu.com"; } }
当方法没有被@ResponseBody标注,且返回值类型是字符串时,那么这个方法默认就是实现跳转功能。
如果在即将跳转的URL地址的前面加上“redirect:”,就表示用户通过原始的URL地址发送的请求指向了这个URL地址。
@RestController被@ResponseBody标记了,所以这里使用的是@Controller
-
使用response对象
-
概念
- response对象指的是HttpServletResponse对象,可用于实现重定向URL的功能
-
示例
@Controller public class TestController { @RequestMapping("/db") public void db(HttpServletResponse resp) { try{ resp.sendRedirect("http://www.baidu.com"); } catch(IOException e){ e.printStackTrace(); } } }
如果需要这样操作,而且方法还有返回值,将导致这个返回值失效,所以将返回值类型设置为void
-
-
-
解析URL地址中的参数
-
自动解析URL地址中的参数
-
概念
- SpringBoot能够自动解析URL地址中的参数,并将这些参数的值注入某个方法的参数中
- 想要获取这些URL地址中的参数的值,只需在这个方法中设置同类型的、同名的参数即可
-
示例
@RestController public class TestController { @RequestMapping("/test") public String test(String name){ return name; } }
-
注意
- 各种类型的请求参数都可以被识别
- 参数名区分大小写
- 参数没有顺序要求,参数名时唯一的识别条件
- 方法参数的类型不应该采用基本数据类型
- 如果方法参数没有被注入值,则采用默认值
-
-
使用@RequestParam标注方法参数
-
基本示例
@RequestMapping("/test") public String test(@RequestParam String value1 , @RequestParam String value2){ return ""; }
-
属性
-
value和name
-
作用
- 用于指定请求参数的名称,一种参数名称的映射
-
示例
@RestController public class TestController { @RequestMapping("/test") public String test(@RequestParam(value = "token") String tk){ return "你小子发送过来的token值是:"+tk; } }
由于name属性和value属性的作用及其用法是一样的,这里就不多做赘述
-
-
required
-
作用
- 指定被@RequestParam注解标注的方法参数是否必须被注入值
- 默认为true,如果没有对应的参数的话,就会抛出异常
-
示例
@RestController public class TestController { @RequestMapping("/test") public String test(@RequestParam(value = "token",required = false) String tk){ return "你小子发送过来的token值是:"+tk; } }
其实,如果没有value进行参数的映射的话,单纯的“required = false”毫无意义,反而还多写了几个单词
-
-
defaultValue
-
作用
- 指定方法参数的默认值,如果没有对应的请求参数的话
-
示例
@RestController public class TestController { @RequestMapping("/test") public String test(@RequestParam(defaultValue = "男") String gender) { return "你的性别是:"+gender; } }
-
-
-
-
使用@RequestBody封装json数据
-
作用
- 解析请求体中的JSON数据,封装到对应的实体类中去
-
示例
实体类Person:
public class Person { private String name; private Integer age; // Getter和Setter一定要提供 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
controller:
@RestController public class HandleJsonController { @RequestMapping("/json") public String handleJson(@RequestBody Person someone) { System.out.println(someone); return "Hello World"; } }
这里需要注意的是,客户端发送过来的json数据格式一定要和实体类的字段名匹配,不然就是注入默认值。参数值注入到实体类中时,会自动转成对应的字段类型,类型转换不成功会抛出异常
更复杂的实体类:
public class Address { private String province; private String city; // Getter和Setter一定要写 @Override public String toString() { return "Address{" + "province='" + province + '\'' + ", city='" + city + '\'' + '}'; } }
public class Person { private String name; private Integer age; private Address address; // Getter和Setter @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", address=" + address + '}'; } }
controller不变的情况下,客户端的json数据应该是酱紫的:
{ "name":"kaiven", "age":20, "address":{ "province":"贵州省", "city":"贵阳市" } }
-
-
获取request response和session对象的方式
-
3个对象的各自作用
- request对象用于从用户通过URL地址发送的请求中接收数据
- response对象用于对已经接收到的数据做出相应
- session对象用于保存用户通过URL地址发送的请求,并跟踪这个请求的操作状态
-
3个对象的获取方式
-
注入属性
-
概念
- SpringBoot会自动创建request对象和response对象的Bean,控制器类可以直接注入这个两个Bean
- request对象的类型是HttpServletRequest,response对象的类型是HttpServletResponse
-
代码示例
@RestController public class HandleJsonController { @Autowired private HttpServletRequest request; @Autowired private HttpServletResponse response; @RequestMapping("/test") public String test() { HttpSession session = request.getSession(); System.out.println(session.getId()); return "Hello World"; } }
-
-
注入参数
-
概念
- 就是方法上的参数上做手脚喽
-
示例
@RestController public class HandleJsonController { @RequestMapping("/test") public String test(HttpServletRequest req, HttpServletResponse resp,HttpSession session) throws Exception { return "test"; } }
由于方法参数的注入是按照类型的,所以也可以与其他参数类一起使用,没有顺序要求
-
-
-
-
-
使用RESTful风格映射动态URL地址
-
RESTful风格
- 一种软件架构规则,表述性状态传递,可以简单理解为“让HTTP请求用最简洁、最直观的方式表达自己想要做什么”
- 就像说话一下,有说的人,和听的人。客户端(说的人)发送请求(动作+资源路径)到服务端(听的人)
- 动作,即请求方式:GET(查询资源) / POST(创建资源) / PUT(更新资源) / PATCH(只更新资源中一部分内容) / DELETE(删除资源)
- 资源路径,都是名词(一个句子中怎么会有两个谓语动词呢?)
-
不同请求类型对应的枚举及其注解
以前的示例中,我们要控制资源访问的请求方法时,是这样做的:
@RequestMapping(value="/test",method = RequestMethod.GET)
其实,有更方便的注解来简化代码:
@GetMapping(value="/test")
当然,其他的请求类型也是这样的,就不一一列举了
-
映射动态URL地址
-
概念
- 针对一些有规律的URL地址,我们会去用一个“占位符”去表示URL的这个位置是动态改变的
- 我们可以使用@PathVariable注解参数实现对于“占位符”位置参数的获取
-
示例
@RestController public class HandleJsonController { @RequestMapping("/test/{name}") public String test(@PathVariable String name) { return "Hello " + name; } }
当然,你还以创建参数映射:
@RestController public class HandleJsonController { @RequestMapping("/test/{name}") public String test(@PathVariable("name") String name_) { return "Hello " + name_; } }
“占位符”参数有多少个,@PathVariable就可注解几个(放心,不会很多的)
-
-