Springboot和postman的使用

1.入门

    • Spring Boot : 快速方便地构建出一个Spring程序
    • Spring Framework :Spring框架,最底层最基础的框架
    • Spring Data : 封装了一系列访问数据库的技术
    • Spring Cloud : 用来构建微服务项目
    • Spring Security : 安全框架

2.创建项目

  • 1.
  • 2
  • 3.创建好后,有些文件可以删除

3.HTTP

  • http协议概述

  • 响应协议
    • web服务器

      • Tomcat介绍

      • 启动

      • 打开tomcat出现的问题:

      • 双击startup.bat闪退的解决方法

4.请求响应


  • 工具:postman
  • 安装步骤:可按照该步骤进行
    • 创建项目:


  • 更改别名,文件夹设置

5.简单参数的接收

  • 简单参数
  • springboot方式
package ***.example.springboot_web_start.controller;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
    //springmvc方式
//    @RequestMapping("simpleParam")
//    public String simpleParam(HttpServletRequest request){
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("name");
//        int age = Integer.parseInt(ageStr);
//        System.out.println(name + " " + age);
//        return "su***ess";
//    }
    //#################################################
    //springboot方式
//    @RequestMapping("simpleParam")
//    public String simpleParam(String name, Integer age){
//
//        System.out.println(name + " " + age);
//        return "su***ess";
//    }
    //#################################################
    //当方法形参名称和请求参数名称不匹配的时候,使用@RequestParam注解
    @RequestMapping("simpleParam")
    public String simpleParam(@RequestParam(name="name") String username, Integer age){

        System.out.println(username + " " + age);
        return "su***ess";
    }
}

6.实体参数的接收

  • 规则:请求参数名和形参对象属性名相同
  • 简单实体参数
package ***.example.springboot_web_start.pojo;

public class User {
    private String name;
    private int age;

   


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
///////////////////////////////////////////////////////////////////////////////////////////
package ***.example.springboot_web_start.controller;

import ***.example.springboot_web_start.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
    //2.实体参数
    @RequestMapping("simplePojo")
    public String simplePojo(User user){
        System.out.println(user);
        return "su***ess";
    }
}

  • 复杂实体参数
package ***.example.springboot_web_start.pojo;

public class Address {
    private String address;
    private String city;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}
//////////////////////////////////////////////////////////////////////////////////////////

package ***.example.springboot_web_start.pojo;

public class User {
    private String name;
    private int age;

    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package ***.example.springboot_web_start.controller;

import ***.example.springboot_web_start.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
       //复杂实体参数
    @RequestMapping("***plexPojo")
    public String ***plexPojo(User user){
        System.out.println(user);
        return "su***ess";
    }
}

7.数组集合参数

  • 数组:请求参数名和形参中的数组变量名相同,可以直接使用数组封装
  • 请求参数名和形参中集合变量名相同,通过@RequestParam绑定参数关系
  //3.数组参数
    @RequestMapping("arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "su***ess";
    }
    //集合参数
    @RequestMapping("listParam")
    public String listParam(@RequestParam(name="hobby") List<String> hobby){
        System.out.println(hobby);
        return "su***ess";
    }

8.日期参数

 //4.日期时间参数
    @RequestMapping("dateParam")//指定请求路径
    public String dateParam(@DateTimeFormat(pattern ="yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "su***ess";
    }

9.JSON参数

//JSON参数
    @RequestMapping("jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "su***ess";
    }

10.路径参数

  • 一个参数
  • 多个参数
//6.路径参数
    @RequestMapping("pathVariable/{id}")//指定请求路径
    public String pathVariable(@PathVariable Integer id){
        System.out.println(id);
        return "su***ess";
    }
    //多个参数
    @RequestMapping("pathVariable/{id}/{name}")//指定请求路径
    public String pathVariable(@PathVariable Integer id, @PathVariable String name){
        System.out.println(id + " " + name);
        return "su***ess";
    }
  • 总结

11.响应

  • @ResponseBody
    • 位置:Controller类上/方法上
    • 作用:将方法返回值直接响应,若返回值类型是 实体对象/集合 转JSON格式
  • 响应回去的数据没有规范:不方便管理
package ***.example.springboot_web_start.controller;

import ***.example.springboot_web_start.pojo.Address;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class ResponseController {
    //返回字符串
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("hell");
        return "hello";
    }
    //返回对象
    @RequestMapping("/getAddr")
    public Address getAddr(){
        Address address = new Address();
        address.setCity("北京");
        address.setAddress("长安街");
        return address;
    }
    //返回list集合
    @RequestMapping("/getAddrList")
    public List<Address> getAddrList(){
        List<Address> addressList = new ArrayList<>();
        Address address1 = new Address();
        address1.setCity("北京");
        address1.setAddress("长安街");
        addressList.add(address1);

        Address address2 = new Address();
        address2.setCity("上海");
        address2.setAddress("南京路");
        addressList.add(address2);

        return addressList;
    }
}

  • 方法:同一响应结果
  • Result(code ,msg ,data)
package ***.example.springboot_web_start.pojo;
/*
统一响应结果封装类
*/
public class Result {
   private Integer code;//1 成功 0 失败
   private String msg;//提示信息
   private Object data;//返回数据
   public Result() {

   }
   public Result(Integer code, String msg, Object data) {
       this.code = code;
       this.msg = msg;
       this.data = data;
   }

   public Integer getCode() {
       return code;
   }

   public void setCode(Integer code) {
       this.code = code;
   }

   public String getMsg() {
       return msg;
   }

   public void setMsg(String msg) {
       this.msg = msg;
   }

   public Object getData() {
       return data;
   }

   public void setData(Object data) {
       this.data = data;
   }

   public static Result su***ess(Object data){
       return new Result(1,"操作成功",data);
   }
   public static Result error(Object data){
       return new Result(0,"操作失败",null);
   }
   public static Result error(String msg,Object data){
       return new Result(0,msg,null);
   }
   @Override
   public String toString() {
       return "Result{" +
               "code=" + code +
               ", msg='" + msg + '\'' +
               ", data=" + data +
               '}';
   }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//返回字符串
@RequestMapping("/hello")
public Result hello(){
   System.out.println("hell");
//    return new Result(1,"su***ess","hello");
   return Result.su***ess("hello");
}
   //返回对象
   @RequestMapping("/getAddr")
   public Result getAddr(){
       Address address = new Address();
       address.setCity("北京");
       address.setAddress("长安街");
       return Result.su***ess(address);
   }
   //返回list集合
   @RequestMapping("/getAddrList")
   public Result getAddrList(){
       List<Address> addressList = new ArrayList<>();
       Address address1 = new Address();
       address1.setCity("北京");
       address1.setAddress("长安街");
       addressList.add(address1);

       Address address2 = new Address();
       address2.setCity("上海");
       address2.setAddress("南京路");
       addressList.add(address2);

       return Result.su***ess(addressList);
   }
  • 统一响应案例

12.分层解耦

  • 分层后代码
  • 内聚:软件中各个功能模块内部的功能联系
  • 耦合:衡量软件中各个层/模块之间的依赖,关联的程度
  • 软件设计原则:高内聚低耦合
    • 高内聚:模块内部的功能联系越紧密越好(在一个模块中只存放与该模块有关的相关处理)
    • 低耦合: 降低层与层之间/模块与模块之间的依赖关联
  • IOC 与 DI入门
  • 解耦例子
    • @***ponent(控制反转) //将当前类交给IOC容器管理,成为IOC容器中的 bean
    • @Autowired(依赖注入) //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量
  • IOC详解
    • 指将对象的控制权交给IOC容器,由IOC容器来创建及管理这些对象,ioc中的对象也称为bean对象,@***ponent可以用来声明一个bean对象
    • @Controller,@Service,@Repository 分别对应Controller,Service,Dao层的注解;@***ponent用于不属于这三个在内的
  • DI详解

13.配置优先级

命令行参数 > java系统属性 > application.properties > application.yml > application.yaml

  • 在项目打包后如何制定java属性和命令行参数(优先级高于java属性参数)
    • 在右侧Maven中 --> 点击Lifecycle --> package双击 – > 左侧target目录下-- > Open in – > Explorer – > 在文件中找到jar包 – > 在路径输入cmd,进入命令行–> (设置java属性,命令行参数在args里设置)java[options] - jar<jar 文件名>[args]

14.Bean管理

  • 获取bean
    • 会把其中的bean创建好,会受到作用域及延迟初始化影响,这里主要针对于默认的单例非延迟加载的bean而言
  • bean作用域
      • 案例
    • 单例
    • 非单例

  • 第三方bean
    • 启动类里的声明注释掉

    • 配置类

    • -AliasFor是别名

    • 可以通过注解的name/value属性指定bean的名称,未指定的话还是使用默认方法名saxReader

      • 如果第三方bean需要依赖其他bean对象,直接zaibean定义方法中设置形参即可,容器会根据类型自动匹配
    • 另一种配置注入

  • @***ponent 及衍生注解与@Bean注解使用场景
    • 项目中自己定义的使用@***ponent及其衍生注解
    • 项目中引入第三方的,使用@Bean注解

15.Springboot原理

  • 前提:引入依赖,版本必须匹配
  • 自动配置
    • Springboot只能扫描启动类所在包及其子包

    • 原理

      • 方案一缺点:使用繁琐,性能低

      • 案例:扫描两个包

        • 1.普通类

        • 2.配置类

        • 3.ImportSelector

        • 4.@EnableXxx注解

        • //ctrl+f 搜索,两次shift看原码

        • 自动配置原理
          • (@EnableAutoConfiguration)AutoConfigureImportSelector里面实现了selectImports这个方法,String数组封装的是要导入spring ioc容器的类的全类名

          • 注意是按条件装配(@ConditionalMissBean)

          • 1.

          • 2.
            //该类型指的是声明的类型,没有这个bean才会声明这个类型



//在该文件中存在name的值才会将bean加入ioc容器中


      • - 案例
        • 步骤:
          • 1.创建两个模块(starter依赖管理;autoconfigure自动配置):autoconfigure修改版本为2.7.5,依赖只剩下spring-boot-starter,只留下src与.iml文件,src文件里启动类和.properties还有测试类都删掉,作为第三方模块

          • 2.在starter文件中添加autoconfigure依赖

            • 3.在autoconfigure里定义AliOSSProperties工具类

            • 添加依赖

            • 阿里云工具类

            • 4.创建配置类

            • 5.创建resources下的文件

            • 6.创建测试类

            • 添加starter依赖

            • 配置.yml文件

            • 测试方法

16.总结

  • web开发基于三层架构

    • Controller层负责接收请求
    • Service层具体业务逻辑处理
    • Dao层(数据访问层也叫持久层)用来处理数据访问操作 ,对数据库的数据进行增删改查
    • 流程:前端发出请求,Controller调用service进行逻辑处理,service调用daoceng完成数据访问操作
    • 执行具体业务处理之前的一些通用操作,需要借助java -web中三大组件之一的过滤器filter/或者拦截器intercepter
    • 实现三层架构之间的解耦,需要使用IOC(控制反转:将对象创建的控制权由应用程序自身交给外部容器’ioc容器 / spring容器’ ,声明为spring容器中的bean对象) 和 DI(依赖注入 : 指容器为程序提供运行时所需的资源)
  • 拦截器和全局异常处理属于Spring framework-web ,springMVC属于Spring framework

转载请说明出处内容投诉
CSS教程网 » Springboot和postman的使用

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买