文章目录

  • 前言
  • 创建springboot项目
  • 封装controller层输入输出
    • rest api 的json输出
    • 返回页面
  • 集成mybatis
  • 集成redis
    • 下载虚拟机和centos
    • 下载redis.tar.gz
    • 上传redis.tar.gz 到虚拟机

前言

今天开始记录学习秒杀系统-课程是基于慕课上的搜索秒杀系统的课程,老师讲解非常好。这系列的笔记更多可能会记录我学习的疑问点和遇到的问题,一些环境配置并没有系统的介绍。环境配置有问题可以单独搜索相关

创建springboot项目

我用的是idea2024专业版,创建springboot项目非常方便。最大的问题可能是怎样下载专业版(大家自行百度)
项目创建完成后 我们创建以下包和目录
在这里插入图片描述
这里说明以下为什么要在org.example.miaosha_1创建包 因为springboot扫描bean的路径已经不用xml配置了,所以扫描路径必须规定好要在启动程序同级或者下级。

创建完后我们直接进入正题配置以下依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

封装controller层输入输出

controller 里边的方法根据返回类型分为两大类 1.返回json 2.返回页面 。对于两种不同的信息,我们要对其封装。为什么封装?因为不封装会显得很乱格式各样的数据都有,我们需要集中把返回信息定义在一个类中。其实最繁琐的就是第一类。

rest api 的json输出

一般服务端会给客户端做接口的约定
什么样子呢{"code": 错误码 "msg":错误信息 "data":成功时返回的数据 }
所以在根目录下创建一个包result,在创建一个Result类 封装输入输出结果。定义好后,我们发现在controller层需要写很多凌乱的代码 比如对于每个错误信息我们都需要在这里定义,然后调用Result构造函数。其实没什么问题,但是很难看,因为我们错误信息很多啊比如各种验证,各种访问策略。假如都写在controller,就会显得本末倒置,也让错误信息满天飞,一会定义一个一会定义一个。

public class Result<T> {private int code;private String msg;private T data;private Result(CodeMsg codeMsg) {this.code = codeMsg.getCode();this.msg = codeMsg.getMsg();}public static <T> Result<T> success(T data) {return new Result<T>(data);}public static <T>Result<T> error(CodeMsg codeMsg) {return new Result<T>(codeMsg);}private Result(T data) {this.data = data;this.code = 0;this.msg = "success";}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Result(int code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}
}

这里记录一下我多年的疑问1.为什么要让构造方法成为private方法 ,不能变为public吗 。这是因为我们外部用此对象时 我们只能success和error去调用构造函数 防止很混乱。
2.为什么这两种方法要设置static方式呢 ,static方式的作用是让此方法变为这个类的,而不是这个对象的。注意对象和类有本质区别,对象是new出来的。我们不加static的话每次用都需要先new 一个对象然后使用此方法。 而加了之后我们直接使用即可
比如

Tool tool = new Tool(); // 必须先 new
tool.sayHi();           // 然后才能调用Tool.sayHello(); // 直接通过类名调用!不需要 new!

此外 由于构造器设置了private你没法通过new 来初始化。

再在此目录下创建一个类

package org.example.miaosha_1.result;public class CodeMsg {private int code;private String msg;//通用异常public static CodeMsg SUCCESS = new CodeMsg(0, "success");public static CodeMsg ERROR = new CodeMsg(1, "error");//登录模块5002XX//商品模块//订单模块//订单模块 5005XXpublic CodeMsg(int code, String msg) {this.code = code;this.msg = msg;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

这样我们的错误信息可以只在CodeMsg类下定义了。代码更优雅

返回页面

(1)配置 在applications.properties文件下,输入

spring.thymeleaf.cache=false
spring.thymeleaf.content-type=text/html
spring.thymeleaf.enabled=true
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.mode=HTML5
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

其中后两行的含义是当我们在controller层,想要返回页面时,我们只需返回一个字符串。随后在resources 目录下新建templates文件夹,在此文件下创建对应的html文件 ,我们就可以返回。比如在controller层方法如下

    @RequestMapping("/theymeleaf")public String theymeleaf(Model model){return "hello";}

我们需要“在resources 目录下新建templates文件夹,在此文件下创建hello.html文件 ” 。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>hello</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'hello:'+${name}" ></p>
</body>
</html>

文件复制以上内容。 其中th代表一个别名,th 是这个命名空间的前缀,用于标识与Thymeleaf相关的属性和指令。可以理解为没有th的块,你用不了thymeleaf。 比如我们在

p标签用了 th,我们就可以使用在后台属性注入。修改后的contraoller方法时
  @RequestMapping("/theymeleaf")public String theymeleaf(Model model){model.addAttribute("name","Bendong");return "hello";}

**可能的问题:**这里记录一个问题 假如你在controller方法类前边加的是RestController 注解你使用了 @RestController 而不是 @Controller
@RestController = @Controller + @ResponseBody
所以哪怕你没加 @ResponseBody,它自动加了!
于是返回的 “hello” 被当作纯字符串响应给浏览器了,而不是视图名。 所以要想返回视图名字直接加 controller

集成mybatis

首先 配置依赖

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency>

在打开applications.properties配置

mybatis.type-aliases-package=org.example.miaosha_1.domains
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=3000
mybatis.mapperLocations = classpath:org/example/miaosha_1/dao/*.xml

配置说明:第一行代表,你数据库表中对应的等值对象
第二行:将下划线转化为驼峰
三四行不用管
第五行代表,用配置文件查询时去哪扫描

这里稍微解释一下第一行,其实它的作用是让 MyBatis 自动扫描 org.example.miaosha_1.domains 包下的所有类,并为每个类注册一个 类型别名(Type Alias)。注册别名后,在你的 XML 映射文件(如 UserMapper.xml)中就可以使用简短的类名来表示 Java 类型,而不需要写完整的包名。例如:

<!-- 不用别名写法 -->
<resultMap id="userMap" type="org.example.miaosha_1.domains.User"><!-- 用了别名后 -->
<resultMap id="userMap" type="User">

随后配置mysql,这里注意一定要和自己电脑下载的mysql server的版本一致 一般是8和5,我用的8。
还是一样的配置依赖

    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.14</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>

配置applications.properties

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/miaoshademo?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.filters=stat
spring.datasource.maxActive=2
spring.datasource.initialSize=1
spring.datasource.maxWait=60000
spring.datasource.minIdle=1
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20

前三行换成自己电脑的配置,随后自行测试有没有成功。如果版本是5第三行去掉cj

集成redis

下载虚拟机和centos

详情右转至 VMware-workstation安装教程–超详细(附带安装包)附带安装CentOS系统教程

下载redis.tar.gz

这里直接附上链接 https://pan.baidu.com/s/15zRDtzgB1_sSZYDhxhzXTg 提取码 blwy

上传redis.tar.gz 到虚拟机

我用的较为简单的方式 即共享文件夹
在这里插入图片描述

打开虚拟机设置 点击选项
在这里插入图片描述
添加 选择你安装redis安装包的文件夹
进入虚拟机 打开终端输入命令 cd /mnt/hgfs ls
查看是否共享成功
在这里插入图片描述
输入命令 tar -zvxf redis-6.2.1.tar.gz 解压后
分别输入以下命令 1.切换到root(升级权限) 2.移动文件夹
在这里插入图片描述
切换到 /usr/local/redis
直接编译 输入make(这一步可能会失败,因为你没有安装gcc编译环境)
安装gcc编译环境 yum -y install gcc automake autoconf libtool make
还有可能失败 ,因为你没的虚拟机不能访问网络 具体去搜一下吧
编译完成后
输入 vi redis.conf
在这里插入图片描述
注意进入你想要修改 则进入编辑模式 按i ,进入命令模式 按esc 默认是esc
然后输入:/bind 这句代码是查找bind的位置 ,然后改为0.0.0.0 就是所有主机都可以访问
在这里插入图片描述

退出编辑模式 输入:/dae 将no改为yes

随后配置好后 导入依赖

redis.clients
jedis


com.alibaba
fastjson
1.2.38

配置linux的主机
redis.host=xxxxxx
redis.port=6379
redis.timeout=3
redis.password=123456
redis.poolMaxTotal=10
redis.poolMaxIdle=10
redis.poolMaxWait=3
随后环境配置完成,然后自行测试一下。

如果觉得繁琐可以直接用windows安装的redis,前边也用不到很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913658.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913658.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913658.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32达到什么程度叫精通?

STM32达到什么程度叫精通&#xff1f;一个十年老兵的深度反思 前言&#xff1a;精通二字&#xff0c;重如泰山 每次有人问我"STM32达到什么程度叫精通"这个问题&#xff0c;我都会沉默很久。 不是因为这个问题难回答&#xff0c;而是因为"精通"这两个字太重…

微软上线Deep Research:OpenAI同款智能体,o3+必应双王炸

今天凌晨&#xff0c;微软在官网宣布&#xff0c;Azure AI Foundry中上线Deep Research公开预览版。这是支持API和SDK的OpenAI 高级智能体研究能力产品&#xff0c;并且Azure 的企业级智能体平台完全集成。Deep Research是OpenAI在今年4月25日发布的最新产品&#xff0c;能够像…

Spring Batch终极指南:原理、实战与性能优化

&#x1f31f; Spring Batch终极指南&#xff1a;原理、实战与性能优化单机日处理10亿数据&#xff1f;揭秘企业级批处理架构的核心引擎&#xff01;一、Spring Batch 究竟是什么&#xff1f;Spring batch是用于创建批处理应用程序&#xff08;执行一系列作业&#xff09;的开源…

【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化

文章目录《VR 360全景视频开发》专栏Part 3&#xff5c;Unity VR眼镜端播放器开发与优化第一节&#xff5c;基于Unity的360全景视频播放实现方案第二节&#xff5c;VR眼镜端的开发适配与交互设计第三节&#xff5c;Unity VR手势交互开发与深度优化第四节&#xff5c;高分辨率V…

TCP/IP协议基础

TCPIP协议基础 网络模型 -OSI参考模型 -OSI参考模型各层功能 -TCP/IP网络模型 -TCP/IP协议栈OSI参考模型 – 为了解决网络设备之间的兼容性问题&#xff0c;国际标准化组织ISO于1984年提出了OSI RM&#xff08;开放系统互连参考模型&#xff09;。 OSI参考模型一共有七层&#…

【Nginx】Nginx代理WebSocket

1.websocketWebSocket 是一种网络通信协议&#xff0c;它提供了在单个 TCP 连接上进行全双工&#xff08;双向&#xff09;通信的能力假设需求&#xff1a;把 ws://192.168.0.1:8088/ws-api/websocket/pushData代理到ws://192.168.0.156:8888/websocket/pushData&#xff1b;同…

Spring AI Alibaba Graph使用案例人类反馈

1、Spring AI Alibaba Graph 是社区核心实现之一&#xff0c;也是整个框架在设计理念上区别于 Spring AI 只做底层原子抽象的地方&#xff0c;Spring AI Alibaba 期望帮助开发者更容易的构建智能体应用。基于 Graph 开发者可以构建工作流、多智能体应用。Spring AI Alibaba Gra…

本地部署jenkins持续集成

一、准备环境&#xff08;jdk版本跟Tomcat版本要匹配&#xff09; java jdk 环境(版本是11.0.21) jenkins war包(版本是2.440.3) Tomcat (版本是 9.0.84) 二、安装步骤 1、安装jdk环境 1&#xff09;先安装java环境&#xff0c;安装完成后配置环境变量&#xff0c;参考上…

基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(1)搭建框架基本雏形

本次框架使用Maven作为代码构建管理&#xff0c;引用了PO模式&#xff0c;将整体的代码分成了页面层、用例层、业务逻辑层。框架搭建流程&#xff1a;1、在pom.xml中引入依赖&#xff1a;<!-- https://mvnrepository.com/artifact/io.appium/java-client --> <depende…

从零构建MCP服务器:FastMCP实战指南

引言&#xff1a;MCP协议与FastMCP框架 Model Context Protocol&#xff08;MCP&#xff09;是连接AI模型与外部服务的标准化协议&#xff0c;允许LLM&#xff08;如Claude、Gemini&#xff09;调用工具、访问数据。然而&#xff0c;直接实现MCP协议需要处理JSON-RPC、会话管理…

基于FPGA的智能小车设计(包含代码)/ 全栈FPGA智能小车:Verilog实现蓝牙/语音/多传感器融合的移动平台

首先先声明一下&#xff0c;本项目已经历多轮测试&#xff0c;可以放心根据我的设计进行二次开发和直接套用&#xff01;&#xff01;&#xff01; 代码有详细的注释&#xff0c;方便同学进行学习&#xff01;&#xff01; 制作不易&#xff0c;记得三连哦&#xff0c;给我动…

Object.defineProperties 详解

Object.defineProperties 详解 Object.defineProperties 是 JavaScript 中用于在一个对象上定义或修改多个属性的方法。它是 Object.defineProperty 的复数版本&#xff0c;允许你一次性定义多个属性。 基本语法 Object.defineProperties(obj, props)obj&#xff1a;要在其上定…

MyBatis-Plus:深入探索与最佳实践

MyBatis-Plus作为MyBatis的增强版&#xff0c;已经在Java开发中得到了广泛应用。它不仅继承了MyBatis的所有功能&#xff0c;还提供了许多强大的扩展功能&#xff0c;帮助开发者提升开发效率和代码质量。本文将深入探讨MyBatis-Plus的高级特性及其在实际项目中的最佳实践。一、…

劳斯莱斯数字孪生技术:重构航空发动机运维的绿色革命

在航空工业迈向智能化的浪潮中&#xff0c;劳斯莱斯以数字孪生技术为核心&#xff0c;构建了发动机全生命周期管理的创新范式。这项技术不仅重新定义了航空发动机的维护策略&#xff0c;更通过数据驱动的决策体系&#xff0c;实现了运营效率与生态效益的双重突破。本文将从技术…

NPM组件 querypilot 等窃取主机敏感信息

【高危】NPM组件 querypilot 等窃取主机敏感信息 漏洞描述 当用户安装受影响版本的 querypilot 等NPM组件包时会窃取用户的主机名、用户名、工作目录、IP地址等信息并发送到攻击者可控的服务器地址。 MPS编号MPS-2kgq-v17b处置建议强烈建议修复发现时间2025-07-05投毒仓库np…

创业商业融资计划书PPT模版

创业商业融资计划书PPT模版&#xff1a;https://pan.quark.cn/s/25a043e4339e

解决GitHub仓库推送子文件夹后打不开的问题

从你描述的情况来看&#xff0c;IELTS_AI_Assessment 很可能被识别为了 Git 子模块&#xff08;submodule&#xff09;&#xff0c;而不是普通文件夹&#xff0c;这会导致在 GitHub 上无法直接打开查看内容。以下是具体原因和解决办法&#xff1a;为什么文件夹无法打开&#xf…

Web后端开发-请求响应

文章目录概述请求Postman简单参数原始方式SpringBootRequestParam注解小结实体参数数组集合参数日期参数Json参数路径参数总结响应响应-案例概述 请求 Postman 简单参数 原始方式 // 1. 简单参数 // 原始方式RequestMapping("/simpleParam")public String …

Javascript基础内容回顾—变量提升、事件循环和闭包等内容

以下是前端面试中 JavaScript 基础易错问题的详解&#xff0c;结合常见考点和易混淆概念进行解析&#xff1a; ⚠️ 一、变量作用域与提升 var vs let/const ◦ 变量提升&#xff1a;var 声明的变量会提升到作用域顶部&#xff08;值为 undefined&#xff09;&#xff0c;而 …