实训Day02

昨日回顾

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)的区别
  1. 字段(Field):
  • 字段是类或对象中的一个变量,用于存储数据。
  • 字段通常被定义为类的成员变量,可以包含基本数据类型(如 int、double 等)或引用类型(如对象引用)。
  • 字段通常使用访问修饰符(如 private、public、protected)来控制访问权限。
  • 直接访问字段可以带来更高的性能,但可能会导致不良的编程实践,如破坏封装性。
  1. 属性(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;
    }
}
  1. @Controller:Spring MVC 中的注解,用于标识这个类是一个控制器(Controller)。控制器类负责接收来自客户端的请求,并处理请求,通常会返回相应的视图或数据。
  2. @RequestMapping("/user"):Spring MVC 中的注解,用于映射请求路径和控制器方法。在这里,@RequestMapping 注解指定了控制器处理的请求路径为 /user,即所有以 /user 开头的请求都会由这个控制器类处理。
  3. @GetMapping("/getByid"):Spring MVC 中的注解,是 @RequestMapping 注解的一个缩写形式,专门用于处理 HTTP GET 请求。在这里,@GetMapping 注解指定了处理 GET 请求路径为 /user/getbyid 的请求。
  4. @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请求:不会被浏览器缓存,也不会被浏览器历史记录保留。
  • 63
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言万年历的实训报告,供您参考: 一、实训目的 本次实训的主要目的是通过编写一个简单的C语言万年历程序,巩固C语言基本语法和编程思想,提高编程能力和解决问题的能力。 二、实训要求 1、能够使用C语言基本语法和控制语句编写程序。 2、能够使用数组来存储和操作数据。 3、能够使用函数来实现模块化编程。 4、能够使用指针来操作内存中的数据。 5、能够使用文件来读取和写入数据。 三、实训内容 1、程序功能 本程序实现了一个简单的万年历功能,可以通过输入年份和月份来显示该月的日历。 2、程序实现 以下是本程序的主要代码实现: ```c #include <stdio.h> // 判断是否为闰年 int is_leap_year(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 1; } else { return 0; } } // 获取某个月份的总天数 int get_days(int year, int month) { int days[] = {31, 28 + is_leap_year(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return days[month - 1]; } // 获取某个日期是星期几 int get_weekday(int year, int month, int day) { if (month == 1 || month == 2) { year--; month += 12; } int c = year / 100; int y = year % 100; int w = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1; w = (w % 7 + 7) % 7; return w; } // 显示日历 void show_calendar(int year, int month) { int days = get_days(year, month); int weekday = get_weekday(year, month, 1); printf(" 日 一 二 三 四 五 六\n"); int i; for (i = 0; i < weekday; i++) { printf(" "); } for (i = 1; i <= days; i++) { printf("%2d ", i); if ((weekday + i) % 7 == 0) { printf("\n"); } } if ((weekday + days) % 7 != 0) { printf("\n"); } } int main() { int year, month; printf("请输入年份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); if (month < 1 || month > 12) { printf("月份输入错误!\n"); return 1; } printf(" %d年%d月\n", year, month); show_calendar(year, month); return 0; } ``` 四、实训总结 通过本次实训,我学会了如何使用C语言来编写一个简单的万年历程序,巩固了C语言基本语法和编程思想,加强了对函数、数组、指针、文件等概念和用法的理解,提高了编程能力和解决问题的能力。同时,我也意识到在编程过程中需要注重代码的规范、可读性和可维护性,这对于日后的开发工作非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值