Web入门
Spring 官网 https://spring.io/
Spring 发展到今天 形成了一个开发生态圈,Spring 提供了若干个子项目,每个项目用于完成特定的功能。
SpringBoot 可以快速开发出来一个应用程序,简化开发提供效率
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.
一 请求
1 简单参数的
1>原始方式:通过HttpServletRequest 对象手动获取
package org.example.skwebtest.controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import jakarta.servlet.http.HttpServletRequest;
@RestController
public class RequestController {
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request) {
// 获取请求参数
String name = request.getParameter("name");
String idStr = request.getParameter("id");
int id = Integer.parseInt(idStr);
System.out.println( "name:---"+name + ":id---" + id);
return "Hello World!";
}
}
// 打印控制台打印出接收到的参数.
2> Springboot 方式 简单快捷
只需要确保参数名和形参名相同
@RequestMapping("/simpleParam2")
public String simpleParam2(String name ,Integer id) {
// 获取请求参数
System.out.println( "name:---"+name + ":id---" + id);
return "Spirngboot方式 获取参数";
}
3 > 如果方法参数名称与请求参数名称不相同 可以使用@RequestParam 完成映射
@RequestMapping("/simpleParam3")
public String simpleParam3(@RequestParam(name = "name") String username , Integer id) {
// 获取请求参数
System.out.println( "username:---"+username + ":id---" + id);
return "Spirngboot方式 RequestParam 获取参数";
}
2 实体参数
请求参数名与形参对象属性名相同即可
@RequestMapping("/simplePojo")
public String simplePojo(User user) {
System.out.println( user);
return "Spirngboot方式 接收pojo参数";
}
public class User {
private String name;
private int age;
}
3 数组集合参数
http://localhost:8080/listParam?hobby=swim\&hobby=run\&hobby=sing
// 数组形式
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby) {
System.out.println(Arrays.toString(hobby));
return "接收数组参数";
}
// 集合形式
@RequestMapping("/listParam")
public String listParam(@RequestParam java.util.List<String> hobby) {
System.out.println(hobby);
return "集合形式接收参数";
}
4 日期参数
@RequestMapping("/dateParam")
// DateTimeFormat 设置接收时间的格式
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
System.out.println(updateTime);
return "接收日期参数";
}
5 json 参数
请求但参数
{
"name":"fibo",
"age":35,
"address":{
"province":"henan",
"city":"pds"
}
}
// json 参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user) {
System.out.println(user);
return "接收json参数";
}
6 路径参数
通过请求URL 直接传递参数,使用{...}来标识该路径参数,需要使用PathVariable 进行标注
http://localhost:8080/pathParam/55
// 路径参数
@RequestMapping("/pathParam/{id}")
public String pathParam(@PathVariable("id") Integer id) { // 路径参数
System.out.println(id);
return "接收路径参数";
}
二 响应
响应设置一个统一的响应结果
@ResponseBody 将方法返回值直接响应,若返回值类型是实体对象或者集合,转JSON 格式响应
// 字符串类型
@RequestMapping(value = "/hello1")
public Result getString() {
return new Result(200, "hello world", "success");
}
// 对象类型
// 返回的对象 默认是会被转为json格式
@RequestMapping(value = "/address")
public Result getAddress() {
Address address = new Address();
address.setProvince("广东");
address.setCity("深圳");
return new Result(200, address, "success");
}
// 数组类型
@RequestMapping(value = "/listAddress")
public Result getListAddress() {
List<Address> list = new ArrayList<>();
Address address1 = new Address();
address1.setProvince("广东");
address1.setCity("广州");
list.add(address1);
Address address2 = new Address();
address2.setProvince("江苏");
address2.setCity("南京");
list.add(address2); // 省份为空
return new Result(200, list, "success");
}
三 三层架构模式
controller : 控制层,接收前端发送的请求,对请求进行处理,并相应数据。
service: 业务逻辑层,处理具体的业务逻辑
dao: 数据访问层(Data Access Object)(持久层 ),负责数据访问操作,包括数据的增删改查
四 分层解耦 IOC 和 DI
1 基本概念
内聚:软件中各个功能模块内部的功能联系
耦合: 衡量软件中各个层/模块之间的依赖,关联的程度
软件设计原则:高内聚低耦合
控制反转: Inversion Of Control ,简称IOC,对象的创建控制权由程序自身转移到外部(容器),这种思想称之为控制反转
依赖注入:Dependency Injection ,简称DI 。容器为应用程序 提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:IOC 容器中创建,管理的对象,称之为bean
类之前 @Component ,将当前类交给IOC容器管理,成为IOC 容器之中的bean
@Autowired 运行时 ,IOC 容器会提供该类型的bean对象,并赋值给该变量,这就是依赖注入
2 IOC 详解
@Component 通用类组件注解,该类被注解,IOC容器启动时实例化此类对象
@Controller 注解控制器类
@Service 注解业务逻辑类
@Respository 注解和数据库操作的类,如DAO类
前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan 扫描
这个注解默认是在@SpringBootApplication中,默认扫描范围是启动类所在包及其子包
3 DI 详解
@Autowired 注解,默认是按照类型进行,如果存在多个相同类型的bean,将会出现报错
无法自动装配。存在多个 'EmpService' 类型的 Bean。
通过一下几种方案来解决:
@Primary 是用来设置bean 的优先级,要想让哪个bean 生效,在其上方加此注解
@Qualifier 配合autowired 进行制定 @Qualifier("empServiceA")
@Resource 这个是jdk 提供的,单独使用直接制定名字也可以 @Resource(name = "empServiceA")