Spring Boot 基础
请求
注解
- controller 上面 @RestController 注解
- controller 类中 函数 上面 @RequestMapping("/path")
不同请求方法注解
@RequestMapping(value = "/depts", method = RequestMethod.GET)
或者
@GetMapping("/depts")
GetMapping、PutMapping、DeleteMapping、PatchMapping 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/运营数据报表模板");