日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

框架复习笔记-Java-案例:牛客网讨论社区

發(fā)布時(shí)間:2024/1/23 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 框架复习笔记-Java-案例:牛客网讨论社区 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 搭建開(kāi)發(fā)環(huán)境
    • Spring入門(mén)
      • Spring IoC實(shí)例分析
    • Spring MVC入門(mén)
      • 請(qǐng)求
      • 響應(yīng)
    • Mybatis入門(mén)
    • 案例:開(kāi)發(fā)者社區(qū)首頁(yè)
    • 調(diào)試技巧
      • 日志
    • 版本控制-Git
    • 發(fā)送郵件
    • 開(kāi)發(fā)注冊(cè)功能
    • 登錄之會(huì)話(huà)管理
    • 登錄之生成驗(yàn)證碼
    • 登錄退出
    • 登錄注冊(cè)之?dāng)r截器
      • 獲取當(dāng)前用戶(hù)信息
    • 賬號(hào)設(shè)置
    • 檢查登錄狀態(tài)
    • 過(guò)濾敏感詞-前綴樹(shù)
    • 發(fā)布帖子及帖子詳情
    • 事務(wù)管理-(重點(diǎn):需要理解記憶)
      • 事務(wù)回滾測(cè)試
    • 顯示、添加、評(píng)論
    • 私信列表及發(fā)送私信
    • 統(tǒng)一處理異常
    • 統(tǒng)一記錄日志(AOP面向切面編程)
    • Redis
    • Spring整合Redis
    • 點(diǎn)贊、關(guān)注
    • 利用Redis優(yōu)化登錄功能
    • Kafka,構(gòu)建TB級(jí)異步消息系統(tǒng)
      • Kafka入門(mén)
      • Spring整合Kafka
    • 發(fā)送系統(tǒng)通知
    • 顯示系統(tǒng)通知
    • ElasticSearch入門(mén)
      • Spring整合ElasticSearch
    • 開(kāi)發(fā)社區(qū)搜索功能
    • Spring Security
    • 權(quán)限控制
    • Redis高級(jí)數(shù)據(jù)類(lèi)型
    • Spring定時(shí)任務(wù)Quartz---(理解記憶)
    • 生成長(zhǎng)圖
    • 將文件上傳至云服務(wù)器-七牛云
    • 優(yōu)化網(wǎng)站性能
    • 項(xiàng)目發(fā)布與總結(jié)
    • 常見(jiàn)面試點(diǎn)
      • MySQL
      • Redis
      • Spring IoC AOP MVC

搭建開(kāi)發(fā)環(huán)境


mvn cmpile 編譯 mvn clean test 清理后測(cè)試






瀏覽器訪(fǎng)問(wèn):

Spring入門(mén)



Spring IoC實(shí)例分析










注:Scope默認(rèn)是singleton,若修改成prototype,則每次都會(huì)創(chuàng)建新的實(shí)例。

注:可以看到,兩個(gè)實(shí)例對(duì)象的hashcode值已不一樣!



不用get,直接Autowired注解,注入:

Spring MVC入門(mén)






請(qǐng)求








響應(yīng)




Mybatis入門(mén)









案例:開(kāi)發(fā)者社區(qū)首頁(yè)





調(diào)試技巧

日志



版本控制-Git






發(fā)送郵件






開(kāi)發(fā)注冊(cè)功能










注:注冊(cè)已經(jīng)ok,接下來(lái)是激活賬號(hào):


登錄之會(huì)話(huà)管理











注:分布式部署時(shí)為什么session會(huì)有問(wèn)題?
nginx在分發(fā)請(qǐng)求時(shí),可能帶有某一個(gè)seesionid的請(qǐng)求可能不會(huì)分發(fā)到原來(lái)設(shè)置session的那臺(tái)服務(wù)器上;可以通過(guò)設(shè)置分發(fā)方式讓請(qǐng)求地址固定訪(fǎng)問(wèn)某一臺(tái)服務(wù)器;可以設(shè)置共享session;可以專(zhuān)門(mén)用一臺(tái)服務(wù)器來(lái)存儲(chǔ)session(但是可能會(huì)掛掉);以上都不太好,所以選取數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)session(非關(guān)系型數(shù)據(jù)庫(kù)如redis)。

登錄之生成驗(yàn)證碼






登錄退出








登錄注冊(cè)之?dāng)r截器

注:以下是顯示登錄信息:




獲取當(dāng)前用戶(hù)信息




賬號(hào)設(shè)置







檢查登錄狀態(tài)





過(guò)濾敏感詞-前綴樹(shù)




@Component public class SensitiveFilter {private static final Logger LOGGER = LoggerFactory.getLogger(SensitiveFilter.class);// 替換符public static final String REPLACEMENT = "***";// 根節(jié)點(diǎn)private TrieNode rootNode = new TrieNode();@PostConstructpublic void init() {try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {String keyword;while ((keyword = reader.readLine()) != null) {// 添加到前綴樹(shù)this.addKeyword(keyword);}} catch (Exception e) {LOGGER.error("加載敏感詞文件失敗" + e.getMessage());}}// 將一個(gè)敏感詞添加到前綴樹(shù)中private void addKeyword(String keyword) {TrieNode tempNode = rootNode;for (int i = 0; i < keyword.length(); i++) {char c = keyword.charAt(i);TrieNode subNode = tempNode.getSubNode(c);if (subNode == null) {// 初始化子節(jié)點(diǎn)subNode = new TrieNode();tempNode.addSubNodes(c, subNode);}// 指向子節(jié)點(diǎn),進(jìn)入下一輪循環(huán)tempNode = subNode;//設(shè)置結(jié)束標(biāo)識(shí)if (i == keyword.length() - 1) {tempNode.setKeywordEnd(true);}}}/*** 過(guò)濾敏感詞** @param text 待過(guò)濾的文本* @return 過(guò)濾后的文本*/public String filter(String text) {if (StringUtils.isBlank(text)) {return null;}//指針1TrieNode tempNode = rootNode;//指針2int begin = 0;//指針3int position = 0;//結(jié)果StringBuilder sb = new StringBuilder();while (position < text.length()) {char c = text.charAt(position);//調(diào)過(guò)符號(hào)if(isSymbol(c)){// 若指針1處于根節(jié)點(diǎn),將此符號(hào)計(jì)入結(jié)果,讓指針2向下走一步if(tempNode == rootNode){sb.append(c);begin++;}// 無(wú)論符號(hào)在開(kāi)頭或中間,指針3都向下走一步position++;continue;}// 檢查下級(jí)節(jié)點(diǎn)tempNode = tempNode.getSubNode(c);if(tempNode == null){// 以begin開(kāi)頭的字符不是敏感詞sb.append(text.charAt(begin));// 進(jìn)入下一個(gè)位置begin++;position = begin;// 指針1 重新指向根節(jié)點(diǎn)tempNode = rootNode;}else if(tempNode.isKeywordEnd()){// 發(fā)現(xiàn)敏感詞,將begin~position字符串替換掉sb.append(REPLACEMENT);position++;begin = position;// 指針1 重新指向根節(jié)點(diǎn)tempNode = rootNode;}else{// 檢查下一個(gè)字符position++;}}//將最后一批字符計(jì)入結(jié)果sb.append(text.substring(begin));return sb.toString();}// 判斷是否是符號(hào)private boolean isSymbol(Character c) {// 0x2E80 ~ 0x9FFF 是東亞文字范圍return !CharUtils.isAsciiAlphaUpper(c) && (c < 0x2E80 || c > 0x9FFF);}// 前綴樹(shù)private class TrieNode {// 描述關(guān)鍵詞結(jié)束標(biāo)識(shí)private boolean isKeywordEnd = false;// 子節(jié)點(diǎn) (key 是下級(jí)結(jié)點(diǎn)的字符,value是下級(jí)節(jié)點(diǎn))private Map<Character, TrieNode> subNodes = new HashMap<>();public boolean isKeywordEnd() {return isKeywordEnd;}public void setKeywordEnd(boolean keywordEnd) {isKeywordEnd = keywordEnd;}public void addSubNodes(Character c, TrieNode node) {subNodes.put(c, node);}public TrieNode getSubNode(Character c) {return subNodes.get(c);}} }

發(fā)布帖子及帖子詳情




事務(wù)管理-(重點(diǎn):需要理解記憶)










事務(wù)回滾測(cè)試



顯示、添加、評(píng)論


私信列表及發(fā)送私信



統(tǒng)一處理異常


統(tǒng)一記錄日志(AOP面向切面編程)





Redis







Spring整合Redis










點(diǎn)贊、關(guān)注







利用Redis優(yōu)化登錄功能


以下注解表示此類(lèi)不推薦使用:

Kafka,構(gòu)建TB級(jí)異步消息系統(tǒng)






Kafka入門(mén)











Spring整合Kafka




發(fā)送系統(tǒng)通知









顯示系統(tǒng)通知

ElasticSearch入門(mén)












Spring整合ElasticSearch















開(kāi)發(fā)社區(qū)搜索功能

Spring Security





權(quán)限控制



Redis高級(jí)數(shù)據(jù)類(lèi)型






Spring定時(shí)任務(wù)Quartz—(理解記憶)


注:JDK下或Spring下的定時(shí)任務(wù)在分布式下會(huì)產(chǎn)生沖突,使用Quartz則不會(huì)。

以下是JDK測(cè)試?yán)?#xff1a;



以下是Spring測(cè)試?yán)?#xff1a;








以下是Quartz測(cè)試?yán)?#xff1a;









生成長(zhǎng)圖







將文件上傳至云服務(wù)器-七牛云






優(yōu)化網(wǎng)站性能





項(xiàng)目發(fā)布與總結(jié)









常見(jiàn)面試點(diǎn)

MySQL








Redis











Spring IoC AOP MVC




感謝牛客網(wǎng)老師的精彩講解!
【參考】https://www.nowcoder.com/courses/cover/live/246
【源碼鏈接】https://gitee.com/monkeyhlj/newcoder-community

總結(jié)

以上是生活随笔為你收集整理的框架复习笔记-Java-案例:牛客网讨论社区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。