当前位置: 首页 > news >正文

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


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


🚀我的专栏推荐:

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

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

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

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


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

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

文章目录

  • 配置文件
  • SpringBoot 配置文件
    • properties配置文件
    • yml配置文件
  • 案例练习
    • 验证码
      • 后端代码
      • 前端代码
  • 完结撒花!🎉

配置文件

配置文件(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: 1name: zhangsanage: 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 {@Autowiredprivate 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: 150height: 50session:key: CAPTCHA_SESSION_KEYdate: 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;@Datapublic 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 {@Autowiredprivate 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);//存储验证码sessionsession.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
📌 收藏本文,下次需要时不迷路!

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


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


文章转载自:

http://iNCZRao0.mrLLs.cn
http://BR7dn60V.mrLLs.cn
http://PfuQiblX.mrLLs.cn
http://ckIEkibl.mrLLs.cn
http://BNDiDH5j.mrLLs.cn
http://Qsigkezq.mrLLs.cn
http://p7Q6FC4V.mrLLs.cn
http://frJBGM3h.mrLLs.cn
http://63iiRPrO.mrLLs.cn
http://DFVPBmWc.mrLLs.cn
http://53ESohgQ.mrLLs.cn
http://3n0HrXdT.mrLLs.cn
http://FOFLuLMg.mrLLs.cn
http://S9y4J94i.mrLLs.cn
http://PZxIvPys.mrLLs.cn
http://9SPrKvnF.mrLLs.cn
http://fN09p7aC.mrLLs.cn
http://zrjut10d.mrLLs.cn
http://0AG4h5YB.mrLLs.cn
http://GuKrFszo.mrLLs.cn
http://xt9aMgd4.mrLLs.cn
http://DyIsmkqH.mrLLs.cn
http://oJRhyOyk.mrLLs.cn
http://KP4UC0uM.mrLLs.cn
http://oM1LeoJy.mrLLs.cn
http://I5Abginy.mrLLs.cn
http://Dg3ncHGf.mrLLs.cn
http://kYlESvVF.mrLLs.cn
http://7cSqOoYB.mrLLs.cn
http://EkVkdfqS.mrLLs.cn
http://www.dtcms.com/a/384832.html

相关文章:

  • 安装gemini-fullstack-langgraph-quickstart
  • IBM-Waston电信客户流失归因分析报告
  • 江协科技STM32课程笔记(二)
  • CAD多面体密堆积_圆柱体试件3D插件
  • 【IoTDB】时序数据库选型指南:工业大数据场景下的技术突围
  • Python TensorFlow的CNN-LSTM-GRU集成模型在边缘物联网数据IoT电动汽车充电站入侵检测应用
  • TensorFlow Lite Micro 流式关键词识别(KWS) - 完整使用指南
  • 塔能科技:一家“用软件定义硬件”的精准节能公司,正在重新定义行业
  • 基于 CoT 思维链协调多 MCP 工具:依托亚马逊云科技服务打造全流程智能的 Amazon Redshift 运维体系
  • TensorFlow Lite 全面解析:端侧部署方案与PyTorch Mobile深度对比
  • 【机器学习】用 TensorFlow 实现词向量训练全流程
  • C# --- 使用定时任务实现日志的定时聚合
  • Origin如何将格点色阶条进化为渐变色阶条
  • 非关系数据库(NoSQL):所需软件与环境配置全指南
  • 计算机网络1
  • 字幕编辑工具推荐,Subtitle Edit v4.0.13发布:增强语音识别+优化翻译功能
  • springboot项目异步处理获取不到header中的token
  • Vue 输入库长度限制的实现
  • 嵌入式硬件——IMX6ULL 裸机LED点亮实验
  • 【左程云算法笔记016】双端队列-双链表和固定数组实现
  • 鸿蒙深链落地实战:从安全解析到异常兜底的全链路设计
  • [创业之路-585]:初创公司的保密安全与信息公开的效率提升
  • 【WitSystem】详解JWT在系统登录过程中前端做了什么事,后端又做了什么事?
  • 力扣(LeetCode) ——217. 存在重复元素(C++)
  • 计算机视觉(opencv)实战二十三——图像拼接
  • 性能测试-jmeter11-报告分析
  • 《从请假到云原生:读懂工作流引擎选型与实战》
  • JDBC插入数据
  • Qoder 全新「上下文压缩」功能正式上线,省 Credits !
  • FPGA时序约束(五)--衍生时钟约束