昨日回顾
1.打包方式
jar
2.parent解决版本冲突
->parent标签中的version
->修改version中的内容,版本随之改变
3.@SpringBootApplication注解
聚合注解
@Configuration
@EnableAutoConfiguration
@ComponentScan
4.关于自动配置的原理
(1)聚合注解
通过@SpringBootApplication中聚合的注解@EnableAutoConfiguration来执行自动配置
(2)配置的目标
所有依赖中包含MWTA-IINF中的配置文件spring.factories
(3)设置路径
在spring.factories中设置了被自动配置的类的完整路径:com.mysql.cj.jdbc.Driver
学习目标
1.springboot的配置文件
yml和properties
2.在springboot中实现mvc的操作流程
1.get
2.post
3.参数传递
4.json传递
5.restful风格
今日所学
更新项目目录
1.关于配置文件(resources文件夹下)
(1)springboot中存在的默认配置
8080端口
(2)springboot提供了两种配置文件
Application.properties:键值形式
优点:简单直接key=value
缺点:缺少层级关系,阅读性较差
#设置端口号
#springboot程序启动的时候,会先加载配置文件中的配置
server.port=8081
#配置数据源(连接数据的四个标准配置)
#url / diver-class-name / usernamn / password
#mysql的8.0的服务器版本:com.mysql.cj.jdbc.Driver
#mysql的5.X的服务器版本:com.mysql.jdbc.Driver
spring.datasource.diver-class-name=com.mysql.cj.jdbc.Driver
#协议://地址:端口/数据库名称?参数1&参数2
#设置时区:Asia/Shanghai等价于GMT+8 表示中国时区
spring.datasource.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC / GMT+8 / Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=你的数据库的密码
解决com.mysql.cj.jdbc.Driver报红的问题:
提前配置数据库连接驱动依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
Application.yml
不能与application.properties文件同时直接存在resources文件夹下
Springboot官方推荐的配置文件格式
yml被称为yaml,是一种介于properties和xml之间的一种配置形式
传统的xml
优点:结构清晰
缺点:内容特别多
<bean id="datasource" class="javax.sql.DataSource">
<property name="url" value="jdbc:mysql://localhost:3306/mysql?
characterEncoding=UTF-8&serverTimezone=Asia/Shanghai" />
<property name="driver-class-name" value="com.mysql.cj.jdbc.Driver" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
yml
结合properties和xml的优点
#yml使用注意事项:
#1.通过缩进表现层级关系,缩进必须是两个空格,不能是四个空格
#2.如果有子级不能赋值(参考server)
#3.赋值时用:隔开,且还要多一个空格
#修改端口号
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mysql?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
自定义配置项
#自定义配置项
name: zhang
作用
可以让成员字段(变量)通过@value直接读取配置文件中的自定义属性
注意事项
1.当前成员字段所在的类必须被spring管理
2.通过${}spring-e表达形式来加载配置文件中的配置项
3.加载的格式:父属性.子属性…子属性.值
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class User {
@Value("${name}")
private String value;
}
配置文件的多版本选择
#在主配置文件中配置激活版本
#dev表示本地开发版本
#test表示服务器端测试版本
#pro表示服务器端的正式版本
spring:
profiles:
active: dev/test/pro
2.实现Spring MVC的访问
(1)控制器的类
A.设计实体类
设计实体类的规范
实现序列化接口Serializable
字段类型都用封装类型
驼峰命名
属性封装
通过Lombok注解(首先配置依赖)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private Integer id;
private String name;
private String phone;
private String pwd;
}
字段(field)和属性(property)的区别
- 字段(Field):
- 字段是类或对象中的一个变量,用于存储数据。
- 字段通常被定义为类的成员变量,可以包含基本数据类型(如 int、double 等)或引用类型(如对象引用)。
- 字段通常使用访问修饰符(如 private、public、protected)来控制访问权限。
- 直接访问字段可以带来更高的性能,但可能会导致不良的编程实践,如破坏封装性。
- 属性(Property):
- 属性是通过 getter 和 setter 方法来访问和修改字段的一种方式。
- 属性通常被用于封装字段,提供了更好的封装性和安全性。
- 属性可以在 getter 和 setter 方法中添加逻辑,如数据验证、计算属性等。
- 属性可以控制字段的访问权限,如只提供 getter 方法而不提供 setter 方法,实现只读属性。
实体类的性质
pojo:用于和数据表建立直接的映射关系
dto:数据传输对象,接收来自前端的参数,成员一般比pojo少
vo:视图对象,给前端传递的数据,成员一般比pojo多,所以可以继承或聚合pojo
public class UserVo {
private String token;
private User user;//聚合形式
}
B.设计控制器的类
a.普通的访问
代码实现
import com.gax.agriculture.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
@Slf4j
public class UserController {
@GetMapping("/getByid")
public User getByid(){
System.out.println("111");//测试方法是否被调用
log.info("{}方法被访问了","getByid");//记录日志:打印信息在控制台(状态),还可以输出在日志文件
return null;
}
}
@Controller
:Spring MVC 中的注解,用于标识这个类是一个控制器(Controller)。控制器类负责接收来自客户端的请求,并处理请求,通常会返回相应的视图或数据。@RequestMapping("/user")
:Spring MVC 中的注解,用于映射请求路径和控制器方法。在这里,@RequestMapping
注解指定了控制器处理的请求路径为/user
,即所有以/user
开头的请求都会由这个控制器类处理。@GetMapping("/getByid")
:Spring MVC 中的注解,是@RequestMapping
注解的一个缩写形式,专门用于处理 HTTP GET 请求。在这里,@GetMapping
注解指定了处理 GET 请求路径为/user/getbyid
的请求。- @Slf4j是Lombok提供的一个日志门面实现类型,使用的时候直接通过log对象完成日志输出info(普通信息)、warn(警告)、error(错误)
访问路径(此处应该写getByid,因为当时b忘记大写了)
执行效果
b.单个参数的访问
方法一
//注意id参数名必须和前端访问参数一致
@GetMapping("/getByid")
public User getByid(Integer id){
log.info("{}方法被访问了,id的值是{}","getByid",id);
return null;
}
方法二
//通过@RequestParam将访问路径中的i转变成id
@GetMapping("/getByid")
public User getByid(@RequestParam("i") Integer id){
log.info("{}方法被访问了,id的值是{}","getByid",id);
return null;
}
c.多个参数的访问
方法一
@GetMapping("/login")
public User getByid(String phone, String pwd){
log.info("电话:{},密码:{}",phone,pwd);
return null;
}
方法二
public class UserDto implements Serializable {
private String phone;
private String pwd;
}
@GetMapping("/login")
public User getByid(UserDto dto){
log.info("用户信息:",dto);
return null;
}
d.设置返回值
@ResponseBody:响应给前端的数据body,body特指json
可以添加在方法或类上,在类声明的时候适用于所有方法
@RestController:添加在类中,聚合@Controller和@ResponseBody
@ResponseBody
@GetMapping("/getByid")
public User getByid(Integer id){
log.info("{}方法被访问了,id的值是{}","getByid",id);
//声明一个User对象,并返回给前端
User user = new User();
user.setId(id);
user.setName("张三丰");
user.setPhone("123");
user.setPwd("12345");
return user;
}
@ResponseBody
@GetMapping("/login")
public UserVo login(UserDto dto){
log.info("该用户的信息:{}",dto);
UserVo uv = new UserV0();
uv.setId(id);
uv.setName("张三丰");
uv.setPhone("123");
uv.setPwd("12345");
//使用UUID来快速生成一个给前端颁发的token串
String token = UUID.randomUUID().toString().replaceAll("-","");
uv.setToken(token);
return uv;
}
使用swagger进行接口测试,swagger是一个测试接口的一个小工具
添加依赖
//核心功能
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
//UI界面
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.gxa.agriculture.controller"))
.paths(PathSelectors.any())
.build()
.ignoredParameterTypes(Timestamp.class)
.securitySchemes(security())
.securityContexts(securityContexts());
}
// 指定每次访问携带token
private List<ApiKey> security(){
List<ApiKey> apiKeyList = new ArrayList<>();
apiKeyList.add(new ApiKey("token","token","header"));
return apiKeyList;
}
private List<SecurityContext> securityContexts() {
List<SecurityContext> securityContextList = new ArrayList<>();
List<SecurityReference> securityReferenceList = new ArrayList<>();
securityReferenceList.add(new SecurityReference("token", scopes()));
securityContextList.add(SecurityContext
.builder()
.securityReferences(securityReferenceList)
.forPaths(PathSelectors.any())
.build()
);
return securityContextList;
}
private AuthorizationScope[] scopes() {
return new AuthorizationScope[]{new AuthorizationScope("global", "accessAnything")};
}
public ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("智慧农业后台接口测试文档")
.description("如果没能一次成功,那就叫它1.0版吧")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}
访问post接口
@PostMapping("/register") //注意是PostMapping,不是GetMapping
public User register(UserDto dt
User user = new User();
user.setName(dto.getName());
user.setPhone(dto.getPhone());
user.setPwd(dto.getPwd(
return user;
}
C.控制器类的作用
充当类型
完成和数据库/表的映射
redis中会用到实体类的json形式
3.拓展
(1)Spring MVC的访问流程
处理器(handler)就是控制器(Controller)
在流程中,处理器映射器(HandlerMapping)负责根据请求的URL映射到对应的处理器(Controller),而处理器适配器(HandlerAdapter)负责调用处理器(Controller)进行具体的业务处理。通过这两个组件的配合,实现了请求的分发和处理,最终将处理结果渲染到视图中返回给客户端。
(2)get和post的区别(学好框架的前提是学好Java EE,学好Java EE前提是学好HTTP)
A.参数传递方式:
- GET请求:通过URL参数传递数据,参数会显示在URL中。
- POST请求:通过请求体传递数据,参数不会显示在URL中,而是包含在请求体中。
B.数据大小限制:
- GET请求:由于参数显示在URL中,有长度限制,一般在2KB左右。
- POST请求:由于参数在请求体中,一般没有明确的限制,但受服务器和浏览器的限制。
C.安全性:
-
GET请求:参数在URL中明文显示,不适合传输敏感信息,如密码等。
对服务器资源的请求是只读的,不会对服务器资源产生任何影响。
-
POST请求:参数在请求体中,相对安全,适合传输敏感信息。
对服务器资源的请求可能会对服务器资源产生影响,如修改数据、删除数据等。
D.缓存:
- GET请求:可以被浏览器缓存,且会被浏览器历史记录保留。
- POST请求:不会被浏览器缓存,也不会被浏览器历史记录保留。