• 第05章 SpringBoot Web开发(二)


    序言

    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 userList = new ArrayList(); 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页面

       

      用户列表查询

      •  

    • 执行程序,观察运行情况


    第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依赖

       

      com.alibaba fastjson 1.2.35

    • 编程JsonController.java

       

      @RestController @RequestMapping("/user") public class JsonController { @ResponseBody @RequestMapping(value="/queryAll",method = RequestMethod.GET) public String getData(){ //封装查询结果 Map map = new HashMap(); try{ map.put("status",200); //查询的用户列表数据 List userList = new ArrayList(); 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定时器方式

      • 引入依赖
       

      org.quartz-scheduler quartz 2.3.2

      • 定义需要定时执行的方法类,实现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); } }

  • 相关阅读:
    pytorch中对nn.BatchNorm2d()函数的理解
    浅谈ProForm中的数据转化
    副业教程之如何通过出售API赚取美元含数据集和训练教程
    机器学习分类
    蓝桥杯[OJ 1621]挑选子串-CPP-双指针
    java毕业设计Web产品管理系统源码+系统+数据库+lw文档+调试运行
    【SpringBoot+MyBatisPlus】利用线程特性与ThreadLocal来解决公共字段自动填充问题
    星环科技数据安全管理平台 Defensor重磅发布
    sklaern-1.1.4多任务套索
    10000m3d城镇生活污水处理工艺设计
  • 原文地址:https://blog.csdn.net/a1234556667/article/details/126447096