今天是劉小愛自學JAVA的第94天。
感謝你的觀看,謝謝你。
話不多說,開始今天的學習:
一、用戶評論功能
網絡上很多平臺都會有敏感詞屏蔽,有些詞語打出來會被和諧掉。
雖說現在主張言論自由,但我大中華自古以來便是禮儀之邦,很多粗鄙之語能不允許就不允許的好。
那這些詞匯是如何屏蔽的呢?
利用昨天學的Filter過濾器技術就能實現。
這就是一個很簡單的form表單:
-
action:提交跳轉的路徑為wordServlet。
-
method:提交方式為get提交。
-
textarea:文本域,屬性分別為列數、行數、名稱。
-
input type="submit":提交按鈕
那么肯定要有一個Servlet要和表單提交的路徑對應,從而獲取文本域中用戶輸入的數據。
①處理亂碼問題
通過request的setCharcatierEncoding()方法設定字符集為utf-8,解決亂碼問題。
②獲取用戶輸入的數據
通過request的getParamter()方法獲取用戶輸入的數據。
文本域對應的name為word,所以這里參數也為word。
當然按照實際情況,獲取用戶數據后,會將用戶的評論展示在對應的評論區中。
我這邊業務邏輯沒有這么復雜,就直接用一個輸出語句來代替了。
二、敏感詞匯獲取
既然是要屏蔽敏感詞匯,肯定需要先確定哪些詞算是敏感詞,再以這些詞匯作為標準作為屏蔽。
在web包下創建一個word包,專門存放需要屏蔽的詞匯文件,根據分類肯定是有很多很文件的。
為了更好地測試,我寫了一個劉小愛,將其設定為1級,畢竟總不可能真的寫那些敏感詞。
好,敏感詞匯準備好了,就要創建Filter過濾器以及編寫如何屏蔽的業務邏輯代碼了。
首先要獲取敏感詞匯,在init()方法中實現該需求,因為代碼太長不好截圖,故分成了兩部分:
1獲取words文件夾里的各個文件
①創建三個集合
前面也說了,敏感詞有三個等級,就創建三個成員變量來專門存放獲取的詞匯。
②獲取words文件夾
在初始化方法init中,有一個參數FilterConfig。
利用它的getServlerContext()可以獲取web應用中的servletcontext ,從而使用servletcontext接口的一些方法。
getRealPath()里面填入words包的相對路徑,就能獲取words這個包了。
③使用文件過濾器過濾文件
我們剛才將敏感詞匯文件放入words這個包中了,里面有很多文件,為了防止被其它文件混入,我們只讀取后綴名為“.txt”的文本文件。
使用FileFilter接口就能達到過濾文件的效果。
2獲取words文件夾里的各個文件里的內容
代碼接上圖,增強for循環遍歷上述過濾后的words文件夾:
①轉換流與緩沖流
使用轉換流在于其可以設置編碼字符集:utf-8。
使用緩沖流在于可以一行一行地讀。
同時也算是對這兩種IO流的一個回顧與復習。
②迭代器讀取文件
這就是IO流中的核心代碼,一行一行地讀取各個文件里的內容。
③切割字符串
字符串為一行的內容:是以“|”為分隔,前面為敏感詞,后面為屏蔽等級。
所以使用split()方法來將其分隔成一個數組,數組里0索引位為敏感詞,1索引位為屏蔽等級。
④根據屏蔽等級分別存入對應集合
split[1]表示的也就是屏蔽等級,trim()方法可以去除空格。
split[0]表示的也就是敏感詞內容,將其存入對應集合即可。
三、過濾代碼編寫
上述是對過濾器中init()方法里的代碼編寫,用于獲取敏感詞一共有哪些。
現在對doFilter()方法里的代碼編寫,用戶獲取用戶輸入的信息,再進一步判斷是否符合要求。
①處理亂碼并獲取用戶數據
和在wordServlet中編寫的代碼一樣。
②遍歷敏感詞匯并與用戶數據匹配
敏感詞匯一共有三個級別,可以分別對應不同的處理方式,比如永久封號、封號7天,禁言……
現在畢竟學習階段,只遍歷等級為1的集合,正則匹配涉及到一個工具類Pattern:
-
compile(str):以遍歷的敏感詞為標準。
-
matcher(word):以上述標準匹配獲取的用戶數據。
通過matcher的find()方法可以判斷,若為true即表示匹配,不符合要求。
③不符合要求反饋并提醒用戶
在request域對象中設定一個名為msg的值,值為“評論內容不規范”,再跳轉word.jsp頁面。
最后在word.jsp中使用EL表達式獲取request域對象中的數據。
${msg}獲取的也就是③中設定的msg對應的值,如果用戶輸入的內容不規范,在word.jsp頁面就會出現警示信息。
做個測試
劉小愛在前面已經被我設置成了1級敏感詞,所以在評論的時候輸入劉小愛,過濾器中會截取到。
從而跳轉word.jsp頁面并附帶警示信息。
嘻嘻嘻不為敏感詞匯,則不受影響。
最后