文章目錄
- 前言
- 創建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,前邊也用不到很多。