Spring Boot 基础

Spring Boot 基础

请求

注解

  • controller 上面 @RestController 注解
  • controller 类中 函数 上面 @RequestMapping("/path")

不同请求方法注解

@RequestMapping(value = "/depts", method = RequestMethod.GET)
或者

@GetMapping("/depts")

GetMappingPutMappingDeleteMappingPatchMapping PostMapping

接受简单参数

package org.hzl.controller;  

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

//要加 RestController 才行  
@RestController  
public class Controller {  
    @RequestMapping("/hello")  
    public String hello() {  
        return "hello world";  
    }  
//    @RequestMapping("/simpleParam")  
//    public String simpleParam(HttpServletRequest request){  
//        String name = request.getParameter("name");  
//        String ageStr = request.getParameter("age");  
//        int age = Integer.parseInt(ageStr);  
//        System.out.println(name+":"+age);  
//        return "收到";  
//    }  

    //springboot 方式: 形参名字和参数保持一致, 自动类型转换.  
    //http://localhost:8080/simpleParam?name=Tom&age=19   参数key是name, 下面的形参也得是name才行.  
    @RequestMapping("/simpleParam")  
    //如果不想用name接受, 使用RequestParameter注解 
    public String simpleParam(String name, Integer age) {  
        System.out.println(name+":"+age);  
        return "收到";  
    }  

// 将原始的 image 数据用 age 重命名接受
    public String simpleParam(String name, @RequestParam("image") Integer age) { 
        System.out.println(name+":"+age);  
        return "收到";  
    }

}

接受实体参数

// 如果url携带参数是name1, 那么这里的user.name会是null  
@RequestMapping("/simplePojo")  
public String simplePojo(User user){  
    System.out.println(user);  
    return "收到User";  
}  


@RequestMapping("/complexPojo")  
public String complexPojo(User user){  
    System.out.println(user);  
    return "收到User";  
}

数组集合

@RequestMapping("/arrayParam")  
public String arrayParam(String[] hobby){  
    System.out.println(Arrays.toString(hobby));  
    return "收到Hobby";  
}

@RequestMapping("/listParam")  
public String listParam(@RequestParam List<String> hobby){  
    System.out.println(hobby);  
    return "收到Hobby";  
}
  • ids = 1, 2,3, spring会自动处理, 要加 @RequestParam
  • deleteMapping 中不需要加路径
@DeleteMapping  
public Result delete(@RequestParam List<Long> ids){  
    return Result.success();  
}

日期

@RequestMapping("/dateParam")  
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){  
    System.out.println(updateTime);  
    return "收到日期";  
}

json

@RequestMapping("/jsonParam")  
public String jsonParam(@RequestBody User user){  
    System.out.println(user);  
    return "收到json";  
}

接受path参数

@RequestMapping("/path/{id}")  
public String pathParam(@PathVariable Integer id){  
    System.out.println(id);  
    return "收到path";  
}  

@RequestMapping("/path/{id}/{name}")  
public String pathParam2(@PathVariable Integer id, @PathVariable String name){  
    System.out.println(id+name);  
    return "收到多个path";  
}

响应

统一结构Result

为了使接口的返回值有统一的规范, 使用Result作为接口的返回值.

// 由于返回值的多样性, 设置Result类统一规范, 所有接口都返回Result对象.  
public class Result {  
    private Integer code;  
    private String msg;  
    private Object data;  
    public Result(Integer code, String msg, Object data) {  
        this.code = code;  
        this.msg = msg;  
        this.data = data;  
    }  
    public static Result success(){  
        return new Result(1, "success", null);  
    }  
    public static Result success(Object data){  
        return new Result(1, "success", data);  
    }  
    public static Result error(String msg){  
        return new Result(0, msg, null);  
    }
@RequestMapping("/getAddress")  
public Result getAddress() {  
    return Result.success(new Address("hebei","shijiazhuang"));  
}  

@RequestMapping("/getList")  
public Result getList() {  
    ArrayList<String> arr = new ArrayList<>();  
    Collections.addAll(arr,"han","liu","zhu","fang","LOL");  
    return Result.success(arr);  
}  

@RequestMapping("/getError")  
public Result error() {  
    return Result.error("not found");  
}

返回文件

三层架构

  • EmpDao 是接口, EmpDaoA是一个实现类(当前是从xml文件中读取数据, 如果改为从数据库中读取数据, 只需实现另一个类 EmpDaoB即可.)
  • EmpService 是接口, Service实现数据转换, 当前是 1表示男性, 0表示女性, 如果改为 其他规则, 只需实现另一个类 EmpServiceB即可.

接口使得程序扩展和修改维护变得容易.

EmpDao empDao = new EmpDaoA() 接口的多态特性.

这里的Service 还是用到了 EmpDaoA, 存在耦合.

解耦合

  • Component 可以换成 Service(对应上面的Service层, 处理逻辑, 数据转换.) repository
  • Component等注解要被扫描才能生效 ioc 注解

Service 实现类有多个

  • 当 Service(或Component) 修饰的EmpService接口的子类有多个时, 报错 , 因为 Autowired 是按照类型生效的 , 两个会冲突.
    • @Primary 加在@Service 上面, 指定默认那个生效.
    • @Qualifier 在@Autowried下面 @Qualifier("empServiceA") 指定 A生效
    • @Autowried 换成 @Resource(name = “empServiceA”)

每个实体对应一个 Service, 和;一个实现类, 每个实体对应一个 controller

常见操作

获取Resource资源


InputStream excelStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板");