【Java EE进阶 --- SpringBoot】SpringBoot配置文件


🚀 欢迎来到我的优快云博客:Optimistic _ chen
一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏内容特色适合人群
🔥C语言从入门到精通系统讲解基础语法、指针、内存管理、项目实战零基础新手、考研党、复习
🔥Java基础语法系统解释了基础语法、类与对象、继承Java初学者
🔥Java核心技术面向对象、集合框架、多线程、网络编程、新特性解析有一定语法基础的开发者
🔥Java EE 进阶实战Servlet、JSP、SpringBoot、MyBatis、项目案例拆解想快速入门Java Web开发的同学
🔥Java数据结构与算法图解数据结构、LeetCode刷题解析、大厂面试算法题面试备战、算法爱好者、计算机专业学生

🚀我的承诺:
✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

配置文件

配置文件(Configuration File)是一种用于存储程序运行所需参数设置的文件。它通常以纯文本形式存在,允许用户通过编辑文件内容来调整程序的行为,而无需修改程序代码

作用:配置文件的主要功能是提供灵活性和可定制性。它可以定义程序的运行参数、存储路径、网络设置、用户偏好等。配置文件有多种格式,常见的是:*.config, *.xml等等

具体体现在解决硬编码 (硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中, 也就是参数固定) 问题, 把可能会改变的信息,放在一个集中的地方,启动程序后,从配置文件中读取数据并加载运行。

举个例子:手机设置里有很多可以设置的项目,比如,屏幕翻转、字体大小等等。用户根据不同的习惯设置不同的大小,当手机启动时,读取配置,以⽤⼾设置的字体⼤⼩来显⽰。

SpringBoot 配置文件

SpringBoot支持并定义了配置文件的格式,很多项目的配置信息也放在配置文件中:比如,项目的启动端口、数据库的连接信息、依赖的配置等等。

在SpringBoot创建项目时,就已经创建好了配置文件:
在这里插入图片描述
我们SpringBoot集成了Tomcat服务器,默认端口号8080,启动程序:
在这里插入图片描述
SpringBoot创建的配置文件一般都是application.properties,上图显示的application.yml是我修改后的文件,只需要改一下后缀即可。

解释:理论上说,.properties和.yml可以并存于一个项目中,两个配置文件都会加载,如果有冲突,以.properties为主。但是尽可能的还是使用一种配置文件更好。

properties配置文件

properties 配置⽂件是最早期的配置⽂件格式,也是创建SpringBoot项⽬默认的配置⽂件

语法:properties是以键值对的形式配置的,Key=Value

#配置项目端口号
server.port=8080

读取配置文件:项目中,想要主动读取配置文件中的内容,可以使用 @Value注解来实现。
properties配置:

my.key=10

@Controller
@ResponseBody
public class PropertiesController {
    @Value("${my.key}")
    private Integer myKey;
    
    @RequestMapping("/key")
    public String key(){
        return "读取到值:"+myKey;
    }
}

在这里插入图片描述
我们知道,properties配置是以Key-Value形式配置的,那么不可避免的会有很多冗余的信息,所以就出现了yml文件来解决这个问题。

yml配置文件

语法:yml是树形结构的配置文件,Key: Value

注意:Key和Value之间使用英文冒号+空格的方式组成

对比一下两种配置文件连接数据库的对比:
在这里插入图片描述
yml读取配置的⽅式和properties相同,使⽤@Value 注解即可。
还可以在yml中配置对象:

person:
  id: 1
  name: zhangsan
  age: 12

这个时候就不能⽤@Value 来读取配置中的对象了,此时要使⽤另⼀个注解@ConfigurationProperties 来读取,

@Configuration
@Data
@ConfigurationProperties(prefix = "person")//从配置文件获取对象值
public class Person {
    private Integer id;
    private String name;
    private Integer age;
}

调用类:

@ResponseBody
@Controller
public class PersonController {
    @Autowired
    private Person person;

    @RequestMapping("/person")
    public String person(){
        return person.toString();
    }
}

在这里插入图片描述
总结:可读性高,支持多种数据类型,支持更多编程语言

案例练习

验证码

页面生成验证码,输入验证码,点击提交,验证用户输入验证码是否正确

引入一个Hutool的工具:Hutool是⼀个Java⼯具包类库,对⽂件、流、加密解密、转码、正则、线程、XML等JDK⽅法进⾏封装,组成各种Util⼯具类。

后端代码

导入依赖

<dependency>
		<groupId>cn.hutool</groupId>
		<artifactId>hutool-captcha</artifactId>
		<version>5.8.36</version>
</dependency>

把配置项写到配置问件中application.yml

spring:
  application:
    name: spring-captcha-demo
captcha:
    width: 150
    height: 50
    session:
      key: CAPTCHA_SESSION_KEY
      date: CAPTCHA_SESSION_DATE

配置项对应的Java对象

package com.zc.captcha.model;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@ConfigurationProperties(prefix = "captcha")
@Configuration
@Data
public class CaptchaProperties {
    private Integer width;
    private Integer height;
    private Session session;

    @Data
    public static class Session{
        private String key;
        private String date;
    }
}

Controller层
实现验证码

package com.zc.captcha.Controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.captcha.ShearCaptcha;
import com.zc.captcha.model.CaptchaProperties;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Date;
@RequestMapping("/captcha")
@RestController
public class CaptchaController {
    @Autowired
    private CaptchaProperties captchaProperties;
    // 验证码有效时间30分钟
    private final static Long VALID_TIME=30*60*1000L;

    //生成验证码
    @RequestMapping("/getCaptcha")
    public void getCaptcha(HttpSession session, HttpServletResponse response){
        response.setContentType("image/jpeg");//设置响应类型为JPEG图片
        response.setHeader("Pragma","No-cache");//禁止缓存
        //生成验证码
        try {
            ShearCaptcha captcha=CaptchaUtil.createShearCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());//设置验证码干扰项
            
            String code=captcha.getCode();//获取验证码文本
            
            session.setAttribute(captchaProperties.getSession().getKey(),code);//存储验证码session
            
            session.setAttribute(captchaProperties.getSession().getDate(),new Date());//存储验证码生成时间

            captcha.write(response.getOutputStream());//输出图片
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

校验验证码

    //校验验证码
    @RequestMapping("/check")
    public boolean check(String captcha,HttpSession session){
        if(!StringUtils.hasLength(captcha)){ // 检查输入是否为空
            return false;
        }
        //session中获取存储的验证码和生成时间
        String code=(String) session.getAttribute(captchaProperties.getSession().getKey());
        Date date=(Date) session.getAttribute(captchaProperties.getSession().getDate());

        //忽略大小写比较且未过期
        if(captcha.equalsIgnoreCase(code)&&System.currentTimeMillis()-date.getTime()<VALID_TIME){
            return  true;
        }
        return  false;
    }
}

在这里插入图片描述

前端代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta http-equiv="Cache-Control" content="no-cache,no-store,must-revalidate"/>
  <meta http-equiv="Pragma" content="no-cache"/>
  <meta http-equiv="Expires" content="0"/>

  <title>验证码</title>
  <style>
    #inputCaptcha {
      height: 30px;
      vertical-align: middle; 
    }
    #verificationCodeImg{
      vertical-align: middle; 
    }
    #checkCaptcha{
      height: 40px;
      width: 100px;
    }
  </style>
</head>

<body>
  <h1>输入验证码</h1>
  <div id="confirm">
    <input type="text" name="inputCaptcha" id="inputCaptcha">
    <img id="verificationCodeImg" src="/captcha/getCaptcha" style="cursor: pointer;" title="看不清?换一张" />
    <input type="button" value="提交" id="checkCaptcha">
  </div>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script>
    
    $("#verificationCodeImg").click(function(){
      $(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();
    });

    $("#checkCaptcha").click(function () {
        $.ajax({
          type:"post",
          url:"/captcha/check",
          data:{
            captcha:$("#inputCaptcha").val()
          },
          success:function(result){
            if(result){
              location.href="success.html";
            }else{
              alert("验证码错误,请重新输入");
            }
          }
        });
    });

  </script>
</body>

</html>

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>验证成功页</title>
</head>
<body>
    <h1>验证成功</h1>
</body>
</html>

在这里插入图片描述

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen
📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中……


悄悄说:点击主页有更多精彩内容哦~ 😊

评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Optimistic _ chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值