序言
1.内容介绍
本章介绍了SpringBoot控制器类型分类,对于路由的组成、作用进行了详细的描述,同时对于SpringBoot Controller如何实现参数传递进行了详细的说明和实现,为了实现轻量级的数据结果返回,本章引入了SpringBoot对于JSON的集成实现,对于定时任务的处理主要讲解了三种定时器进行实战操作演练。
2.理论目标
- 了解Controller类型分类
- 掌握SpringBoot路由分类
- 掌握参数传递的常用方式
- 了解JSON的数据结构
- 掌握定时器的常用分类
3.实践目标
- 熟练操作Controller分类,能根据实际业务情况使用@Controller、@RestController
- 熟练进行各种参数传递,达到灵活接收客户端数据的目的
- 熟练操作JSON 格式的返回,为前后端分离做铺垫
- 熟练进行定时业务操作,为复杂的时间调度业务做准备
4.实践案例
- SpringBoot路由实战
- SpringBoot参数传递实战
- SpringBoot集成fastjson,实现json数据格式传递
- SpringBoot集成定时器,实现定时任务处理
5.内容目录
- 1.SpringBoot Controller
- 2.SpringBoot返回JSON
- 3.SpringBoot集成定时器
第1节 SpringBoot Controller
1. Controller类型分类
- Controller主要分为两类,一种是传统的Web Controller,另一种是REST类型的Controller
- @Controller:通常是被使用服务于web 页面的。默认@Controller方法返回的是一个string 串,是表示要展示哪个模板页面。
- @RestController:专门用在编写API的时候,主要用在返回JSON或者XML等数据格式。方法返回的是可以是一个对象,是一个可以被序列化的对象。
2. 路由详解
- 路由指的是http method
- 在SpringBoot中,http method可以被类似"Mapping"的格式来表示
- @RequestMapping:RequestMethod,value
- @GetMapping:等同于@RequestMapping(method = RequestMethod.GET)
- @PostMapping:等同于@RequestMapping(method = RequestMethod.POST)
- @PutMapping:等同于@RequestMapping(method = RequestMethod.PUT)
- @DeleteMapping:等同于@RequestMapping(method = RequestMethod.DELETE)
3. SpringBoot路由实战
-
编写HelloController.java
@RestController @RequestMapping("/user") public class HelloController { @GetMapping(value = "/get") public String testGet(){ return "测试GetMapping...."; } @PostMapping(value = "/post") public String testPost(){ return "测试PostMapping....."; } @PutMapping(value = "/put") public String testPut(){ return "测试PutMapping....."; } @DeleteMapping(value = "/del") public String testDelete(){ return "测试DeleteMapping....."; } @PatchMapping (value = "/patch") public String testPatch(){ return "测试PatchMapping....."; } @RequestMapping (value = "/req",method = RequestMethod.GET) public String testRequest(){ return "测试RequestMapping....."; } }
-
采用Postman进行API测试
- 选择Http Method、输入url、输入参数,点击"Send",观察执行效果
4. 参数传递详解
- @RequestParam:将请求参数绑定到你控制器的方法参数上
- 语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=" ")
- value:参数名
- required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
- defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
- @PathVaraible:用来处理动态的URL,URL的值可以作为控制器中处理方法的参数
- @PathVariable 映射 URL 绑定的占位符
- 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义
- 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中
- URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中
5. SpringBoot参数传递实战
-
编写ParamController.java
@RestController @RequestMapping("/user") public class ParamController { //账户验证 @RequestMapping(value="/login",method=RequestMethod.POST) public String login(@RequestParam String loginId,@RequestParam String pwd){ return "接收的账号:"+loginId+",密码:"+pwd; } //根据姓氏查询用户列表信息 @RequestMapping(value="/query") public String queryUsers(@RequestParam(value="uname",required = false,defaultValue = "张") String userName){ return "参数:"+userName; } //根据id查询用户详情 @RequestMapping(value="/detail/{id}",method= RequestMethod.GET) public String queryDetail(@PathVariable String id){ return "接收到的参数是:"+id; } }
-
采用Postman进行测试
6. 返回值详解
- 返回页面模板
- 注解采用@Controller
- request method返回类型为String
- 返回字符串数据
- 注解采用@RestController
- request method返回类型为String
- 返回模板页面
- 注解采用@Controller
- request method返回类型为ModelAndView
- 返回Json数据
7. 返回页面模板并传参
-
编写ResponseController.java
@Controller public class ResponseController { @RequestMapping(value="/query",method = RequestMethod.GET) public ModelAndView queryUser(ModelAndView mv){ List<UserInfo> userList = new ArrayList<UserInfo>(); userList.add(new UserInfo(1001,"admin")); userList.add(new UserInfo(1002,"jains")); userList.add(new UserInfo(1003,"tony")); //查询结果存储 mv.addObject("users",userList); // 封装结果视图 mv.setViewName("userList");//templates/userList.html return mv; } }
-
在templates目录下创建userList.html页面
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>用户列表查询</title> </head> <body> <ul> <li th:each="user : ${users}"> <span th:text="*{user.userId}"/> <span th:text="*{user.userName}"/> </li> </ul> </body> </html>
-
执行程序,观察运行情况
第2节 SpringBoot返回JSON
1. JSON概述
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
- 是存储和交换文本信息的语法,类似 XML。
- JSON比 XML 更小、更快,更易解析。
2. JSON数据结构
- JSON数据整体是键值对的集合,主要有两种格式
-
对象
- 对象是一个无序的“‘名称/值’对”集合
- 一个对象以“{”(左括号)开始,“}”(右括号)结束
- 每个“名称”后跟一个“:”(冒号)
- “‘名称/值’ 对”之间使用“,”(逗号)分隔
- 比如描述1个用户信息:{“name”:“张三”,“age”:20}
-
数组
- 数组是值(value)的有序集合
- 一个数组以“[”(左中括号)开始,“]”(右中括号)结束
- 值之间使用“,”(逗号)分隔
-
- 比如描述多个用户信息
[ {"name":"张三","age":20}, {"name":"李四","age":22}, {"name":"王五","age":19} ]
3. SpringBoot返回Json方式
- Jackson、fastjson区别
- 上手难以程度:fastjson(容易)、Jackson(中等)
- 高级特性支持:fastjson(中等)、Jackson(丰富)
- 官方文档支持:fastjson(中文)、Jackson(英文)
- 处理JSON速度:fastjson(略快)、Jackson(快)
4. SpringBoot集成fastjson
-
pom.xml引入library依赖
<!--引入fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.35</version> </dependency>
-
编程JsonController.java
@RestController @RequestMapping("/user") public class JsonController { @ResponseBody @RequestMapping(value="/queryAll",method = RequestMethod.GET) public String getData(){ //封装查询结果 Map<String,Object> map = new HashMap<String,Object>(); try{ map.put("status",200); //查询的用户列表数据 List<UserInfo> userList = new ArrayList<UserInfo>(); userList.add(new UserInfo(1001,"admin")); userList.add(new UserInfo(1002,"jains")); userList.add(new UserInfo(1003,"tony")); map.put("data",userList); }catch (Exception ex){ map.put("status",500); map.put("data",null); } return JSON.toJSONString(map); } }
-
运行程序,观察执行效果
- 输入url地址:http://localhost:8080/user/queryAll
-
执行效果是:
{"data":[ {"userId":1001,"userName":"admin"}, {"userId":1002,"userName":"jains"}, {"userId":1003,"userName":"tony"}, ], "status":200 }
第3节 SpringBoot集成定时器
1. 实现定时器主要采用三种方式
- TimerTask类提供的定时方法
- Quartz定时器
- Scheduled注解方式
2. TimerTask、Schedule、Quartz三者区
3. 定时器实战
-
需求:每隔1秒显示当前服务器时间
-
TimerTask方式
//方式1:采用Timer方式 public static void testTimer(){ TimerTask task = new TimerTask() { @Override public void run() { System.out.println("当前时间是:"+TimeUtils.getNowTime()); } }; Timer timer = new Timer(); timer.schedule(task, 0, 1000); // 0标识 1000指延迟的时间1000毫秒 }
-
Quartz定时器方式
- 引入依赖
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency>
- 定义需要定时执行的方法类,实现Job接口
public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // TODO Auto-generated method stub //需要定时执行的方法 System.out.println("当前的时间是:"+ TimeUtils.getNowTime()); } }
- 调用Job,执行定时操作
//方式2:采用Quartz public static void testQuartz()throws Exception{ // TODO Auto-generated method stub // 创建工作 JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withDescription("工作的描述") .withIdentity("工作的名称", "工作的组") .build(); // 创建触发器 Trigger trigger = TriggerBuilder.newTrigger() .withDescription("触发器的描述") .withIdentity("触发器的名称", "触发器的组") .withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")) .startAt(new Date())// 不设置,默认为当前时间 .build(); // 创建调度器,粘合工作和触发器 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.scheduleJob(jobDetail, trigger); // 启动调度器 scheduler.start(); }
-
@Scheduled注解方式
- 定义Scheduler类
@Component public class Scheduler{ //每隔2秒执行一次 @Scheduled(fixedRate = 2000) public void testTasks() throws Exception{ System.out.println("定时任务执行时间:" + TimeUtils.getNowTime()); } //每天2:01执行 @Scheduled(cron = "0 01 02 ? * *") public void testTasks2() { System.out.println("定时任务执行时间:" + TimeUtils.getNowTime()); } }
- 在启动类上加上@EnableScheduling注解
@SpringBootApplication @EnableScheduling public class SpringbootWebApplication { public static void main(String[] args) { SpringApplication.run(SpringbootWebApplication.class, args); } }
、