一、介紹:
1. 框架
ssm
2. 開發環境
構建工具:Apache Maven
集成開發工具: IntelliJ IDEA
數據庫:MySQL、Redis
應用服務器:Apache Tomcat
版本控制工具:Git
3. Spring MVC
三層架構:表現層、業務層、數據訪問層
MVC
-Model:模型層
-View:視圖層
-Controller:控制層
核心組件:
前端控制器:DispatcherServlet
4. 創建maven項目
可在 https://start.spring.io/ 創建maven項目
5. MyBatis
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。
核心組件
--SqlSessionFactory: 用於創建SqlSession的工廠類
--SqlSession:MyBatis的核心組件,用於面向數據庫執行SQL
--主配置文件:XML配置文件,可以對MyBatis的底層行爲做出詳細的配置
--Mapper接口:Dao接口,在MyBatis中習慣稱爲Mapper
--Mapper映射器:用於編寫SQL,並將SQL和實體類映射的組件,採用XML、註解均可實現
6. 版本控制工具 - Git
二、開發社區登錄模塊
1. 發送郵件
郵箱設置:
——啓用客戶端SMTP服務
Spring Email:
——導入jar包
——郵箱參數配置
——使用javaMailSend發送郵件
模板引擎:
——使用Thymeleaf發送HTML郵件
2. 註冊功能
訪問註冊頁面:
——點擊鏈接,打開註冊頁面
提交註冊數據:
——通過表單提交數據
——服務端驗證賬號是否已存在,郵箱是否已註冊
——服務端發送激活郵件
激活註冊賬號:
——點擊郵件中的鏈接,訪問服務端的激活服務。
3. 會話管理
HTTP基本性質:
——HTTP是簡單的、可擴展的、無狀態的、有會話的
Cookie:
——是服務器發送到瀏覽器,並保存在瀏覽器端的一塊數據。
——瀏覽器下次訪問該服務器時,會自動攜帶該塊數據,並將其發送服務器
Session
——是JavaEE的標準,用於在服務器端記錄客戶端信息。
——數據存放在服務器端更加安全,但是也會增加服務端的內存壓力。
4. 生成驗證碼
kaptcha:
——導入jar包(pom添加依賴)
——編寫Kaptcha配置類
——生成隨機字符、生成圖片
5. 登錄、退出功能
訪問登錄頁面
登錄:
——驗證賬號、密碼、驗證碼
——成功,生成登錄憑證,發送給客戶端
——失敗,跳回登錄頁
退出:
——將登錄憑證修改爲失效狀態
——跳轉首頁
6. 顯示登錄信息
攔截器示例:
——定義攔截器,實現HandlerInterceptor
——配置攔截器,爲它指定攔截、排除的路徑
攔截器應用:
——在請求開始時查詢登錄用戶
——在本次請求中持有用戶數據
——在模板視圖上顯示用戶數據
——在請求結束時清理用戶數據
7. 賬號設置
上傳文件:
——請求:必須是POST請求
——表單:enctype = “multipart/from-data”
——Spring MVC:通過MultipartFile處理上傳文件
開發步驟:
——訪問賬號設置頁面
——上傳頭像
——獲取頭像
8. 檢查登錄狀態
使用攔截器:
——在方法前標註自定義註解
——攔截所有請求,只處理帶有該註解的方法
自定義註解:
——常用元註解:@Target、@Retention、@Document、@Inherited
——讀取註解:Method.getDeclaredAnnotations(), Method.getAnnotation(Class<T> annotationClass)
三、社區核心功能
1. 過濾敏感詞
前綴樹:
——名稱:Trie、字典樹、查找樹
——特點:查找效率高,消耗內存大
——應用:字符串檢索、詞頻統計、字符串排序等
敏感詞過濾器:
——定義前綴樹
——根據敏感詞,初始化前綴樹
——編寫過濾敏感詞的方法
2. 發佈帖子
AJAX
——Asynchronous JavaScript and XML
——異步的JavaScript與XML,不是一門新技術
——使用AJAX,網頁能夠增量更新呈現在頁面上,而不需要刷新整個頁面
——雖然X代表XML,但目前JSON的使用比XML更加普遍
示例:
——使用jQuery發送AJAX請求。
實踐:
——採用AJAX請求,實現發佈帖子的功能。
3. 帖子詳情
DiscussPostMapper
DiscussPostService
DiscussPostController
index.html
——在帖子標題上增加訪問詳情頁面的鏈接
discuss-detail.html
——處理靜態資源的訪問路徑
——複用index.html的header區域
——顯示標題、作者、發佈時間、帖子正文等內容
4. 顯示評論
數據層
——根據實體查詢一頁評論數據。
——根據實體查詢評論的數量。
業務層
——處理查詢評論的業務。
——處理查詢評論數量的業務。
表現層
——顯示帖子詳情數據時,同時顯示該帖子所有的評論數據
5. 添加評論
數據層:
——增加評論數據。
——修改帖子的評論數量。
業務層:
——處理添加評論的業務:先增加評論、再更新帖子的評論數量。
表現層 :
——處理添加評論數據的請求。
——設置添加評論的表單。
6. 私信列表
私信列表
——查詢當前用戶的會話列表, 每個會話只顯示一條最新的私信。
——支持分頁顯示。
私信詳情
——查詢某個會話所包含的私信。
——支持分頁顯示。
7. 發送私信
發送私信
——採用異步的方式發送私信。
——發送成功後刷新私信列表。
設置已讀
——訪問私信詳情時, 將顯示的私信設置爲已讀狀態。
8. 統一處理異常
@ControllerAdvice
——用於修飾類,表示該類是Controller的全局配置類。
——在此類中,可以對Controller進行如下三種全局配置:異常處理方案、綁定數據方案、綁定參數方案。
@ExceptionHandler
——用於修飾方法,該方法會在Controller出現異常後被調用,用於處理捕獲到的異常。
@ModelAttribute
——用於修飾方法,該方法會在Controller方法執行前被調用,用於爲Model對象綁定參數。
@DataBinder
——用於修飾方法,該方法會在Controller方法執行前被調用,用於綁定參數的轉換器。
四、Redis,一站式高性能存儲方案
1. Redis入門
Redis是一款基於鍵值對的NoSQL數據庫,它的值支持多種數據結構:字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
Redis將所有的數據都存放在內存中,所以它的讀寫性能十分驚人。 同時,Redis還可以將內存中的數據以快照或日誌的形式保存到硬盤上,以保證數據的安全性。
Redis典型的應用場景包括:緩存、排行榜、計數器、社交網絡、消息隊列等。
2. Spring整合Redis
引入依賴
——spring-boot-starter-data-redis
配置Redis
——配置數據庫參數
——編寫配置類,構造RedisTemplate
訪問Redis
——redisTemplate.opsForValue()
——redisTemplate.opsForHash()
——redisTemplate.opsForList()
——redisTemplate.opsForSet()
——redisTemplate.opsForZSet()
3. 點贊
點贊 :
——支持對帖子、評論點贊。
——第1次點贊,第2次取消點贊。
首頁點贊數量 :
——統計帖子的點贊數量。
詳情頁點贊數量 :
——統計點贊數量。
——顯示點贊狀態。
4. 收到的贊
重構點贊功能:
——以用戶爲key,記錄點贊數量
——increment(key),decrement(key)
開發個人主頁
——以用戶爲key,查詢點贊數量
5. 關注、取消關注
需求
——開發關注、取消關注功能。
——統計用戶的關注數、粉絲數。
關鍵
——若A關注了B,則A是B的Follower(粉絲),B是A的Followee(目標)。
——關注的目標可以是用戶、帖子、題目等,在實現時將這些目標抽象爲實體。
6. 關注列表、粉絲列表
業務層:
——查詢某個用戶關注的人,支持分頁。
——查詢某個用戶的粉絲,支持分頁。
表現層 :
——處理“查詢關注的人”、“查詢粉絲”請求。
——編寫“查詢關注的人”、“查詢粉絲”模板。
7. 優化登錄模塊
使用Redis存儲驗證碼:
——驗證碼需要頻繁的訪問與刷新,對性能要求較高。
——驗證碼不需永久保存,通常在很短的時間後就會失效。
——分佈式部署時,存在Session共享的問題。
使用Redis存儲登錄憑證:
——處理每次請求時,都要查詢用戶的登錄憑證,訪問的頻率非常高。
使用Redis緩存用戶信息:
——處理每次請求時,都要根據憑證查詢用戶信息,訪問的頻率非常高。
五、Kafka,構建TB級異步消息系統
1. 阻塞隊列
BlockingQueue :
——解決線程通信的問題。
——阻塞方法:put、take。
生產者消費者模式:
——生產者:產生數據的線程。
——消費者:使用數據的線程。
實現類 :
——ArrayBlockingQueue
——LinkedBlockingQueue
——PriorityBlockingQueue、SynchronousQueue、DelayQueue等。
2. Kafka入門
Kafka簡介:
——Kafka是一個分佈式的流媒體平臺。
——應用:消息系統、日誌收集、用戶行爲追蹤、流式處理。
Kafka特點 :
——高吞吐量、消息持久化、高可靠性、高擴展性。
Kafka術語:
——Broker、Zookeeper - Topic、Partition、Offset - Leader Replica 、Follower Replica
3. Spring整合Kafka
引入依賴:
—— spring-kafka
配置Kafka:
——配置server、consumer
訪問Kafka :
——生產者
kafkaTemplate.send(topic, data);
——消費者
@KafkaListener(topics = {"test"})
public void handleMessage(ConsumerRecord record) {}
4. 發送系統通知
觸發事件 :
——評論後,發佈通知
——點贊後,發佈通知
——關注後,發佈通知
處理事件
——封裝事件對象
——開發事件的生產者
——開發事件的消費者
5. 顯示系統通知
通知列表:
——顯示評論、點贊、關注三種類型的通知
通知詳情 :
——分頁顯示某一類主題所包含的通知
未讀消息 :
——在頁面頭部顯示所有的未讀消息數量
六、Elasticsearch,分佈式搜索引擎
1. Elasticsearch入門
Elasticsearch簡介:
——一個分佈式的、Restful風格的搜索引擎。
——支持對各種類型的數據的檢索。
——搜索速度快,可以提供實時的搜索服務。
——便於水平擴展,每秒可以處理PB級海量數據。
Elasticsearch術語 :
——索引、類型、文檔、字段。
——集羣、節點、分片、副本。
2. Spring整合Elasticsearch
引入依賴 :
——spring-boot-starter-data-elasticsearch
配置Elasticsearch:
—— cluster-name、cluster-nodes
Spring Data Elasticsearch
——ElasticsearchTemplate
——ElasticsearchRepository
3. 開發社區搜索功能
搜索服務:
——將帖子保存至Elasticsearch服務器。
——從Elasticsearch服務器刪除帖子。
——從Elasticsearch服務器搜索帖子。
發佈事件:
——發佈帖子時,將帖子異步的提交到Elasticsearch服務器。
——增加評論時,將帖子異步的提交到Elasticsearch服務器。
——在消費組件中增加一個方法,消費帖子發佈事件。
顯示結果:
——在控制器中處理搜索請求,在HTML上顯示搜索結果。
七、構建安全高效的企業服務
1. Spring Security
簡介:
——Spring Security是專注於爲java應用程序提供身份認證和授權的框架,它的強大之處在於它可以輕鬆擴展以滿足自定義的需求。
特徵:
——對身份的認證和授權提供全面的、可擴展的支持。
——防止各種攻擊,如會話固定攻擊、點擊劫持、csrf攻擊等。
——支持與Servlet API、Spring MVC等Web技術集成。
2. 權限控制
登錄檢查:
——之前採用攔截器實現登錄檢查,這僅僅是簡單的權限管理方案,現將其廢棄。
授權配置:
——對當前系統內包含的所有的請求,分配訪問權限(普通用戶、管理員、版主)
認證方案:
——繞過Security認證流程,採用系統原來的認證方案。
CSRF配置:
——防止CSRF攻擊的基本原理,以及表單、AJAX相關的配置。
3. 置頂、加精、刪除
功能:
——點擊置頂,修改帖子類型
——點擊“加精”、“刪除”,修改帖子狀態
權限管理:
——版主:置頂、加精。
——管理員:刪除。
按鈕顯示:
——版主:置頂、加精。
——管理員:刪除。
4. Redis高級數據類型
HyperLogLog:
——採用一種基數算法,用於完成獨立總數統計。
——佔據空間小,無論統計多少個數據,只佔12k內存空間。
——不精確的統計算法,標準誤差0.81%。
Bitmap:
——不是一種獨立的數據結構,實際上就是字符串
——支持按位存取數據,可以將其看成是byte數組。
——適合存儲索大量的連續的數據的布爾值。
5. 網站數據統計
UV(Unique Visitor):
——獨立訪客,需通過用戶IP排統計數據。
——每次訪問都要進行統計。
——HyperLogLog,性能好,存儲空間小。
DAU(Daily Active User):
——日活躍用戶,需通過用戶ID排重統計數據。
——訪問過一次,則認爲活躍。
——Bitmap,性能好,可統計精確的結果。
6. 任務執行和調度
JDK線程池:
——ExecutorService
——ScheduledExecutorService
Spring線程池:
——ThreadPoolTaskExecutor
——ThreadPoolTaskScheduler
分佈式定時任務:
——Spring Quartz
7. 熱帖排行
公式:
——log ( 精華分 + 評論數 * 10 + 點贊數 * 2 ) + ( 發佈時間 - 牛客紀元 )
8. 生成長圖
wkhtmltopdf
——wkhtmltopdf url file
——wkhtmltoimage url file
java
——Runtime.getRuntime().exec()
9. 將文件上傳至雲服務器
客戶端上傳:
——客戶端將數據提交給雲服務器,並等待響應。
——用戶上傳頭像時,將表單數據提交給雲服務器。
服務器直傳:
——應用服務器將數據直接提交給雲服務器,並等待響應。
——分享時,服務端自動生成的圖片,提交給雲服務器。
使用七牛雲服務器。
10. 優化網站性能
本地緩存:
——將數據緩存在應用服務器上,性能最好。
——常用緩存工具:Ehcache、Guava、Caffeine等
分佈式緩存:
——將數據緩存在NoSQL數據庫上,跨服務器。
——常用緩存工具:MemCache、Redis等。
多級緩存:
——一級緩存(本地緩存)> 二級緩存(分佈式緩存)> DB
——避免緩存雪崩(緩存失效,大量請求直達DB),提高系統的可用性。
八、項目發佈與總結