2017-08-01 疑難要點
記錄時間17/08/02
疑點:
問題1、為何所有的捕捉異常的catch(Exception/SQLException e){}都是沒有內容的?
因為try{//代碼區}catch(Exception e){//異常處理} 的捕捉異常機制就是首先先執行try代碼區的內容,并且捕捉try內是否出現錯誤,如果有錯誤就執行catch內的代碼,返回的結果也為catch內異常處理的代碼,可以充當于一個警報裝置,提示哪里出現錯誤,而小說站內的catch異常處理沒有是因為已經過了測試錯誤的階段,所以并不需要這部分代碼。
補充:程序會跑出異常,try catch一般是用來捕獲異常的,如果不捕獲就會直接退出,導致不能正常響應。一般捕獲之后要記錄日志,用來定位錯誤的位置,便于解決錯誤,但是姐夫懶得寫,就沒有寫。
問題2、數據庫內容不是特別理解的地方?
String sql = "SELECT tags.text From article_tags As ats LEFT JOIN tags ON ats.tag_id = tags.id GROUP BY ats.tag_id ORDER BY COUNT(ats.tag_id) DESC LIMIT ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,limit);
首先:
問號是替換的作用,用來拼接SQL查詢語句,statement.setInt(1,?limit)意思就是把第1個問號替換為limit的值,它表面上的作用是拼接字符串,但是拼接字符串用+號就可以實現。所以它不是單純的字符串拼接,實際上最主要的作用是用來防止SQL注入,黑客入侵,你可以搜索一下「SQL注入」,跟安全相關的;
其次:
1.?這個語句的重點在「JOIN」,聯表查詢。它的作用是求一個表和另一個表的交集(或者叫并集)。
2.?AS的意思是別名,就是把article_tags起了另一個名字叫ats;
3.?這里就是求article_tags和tags兩個表的交集,條件是article_tags表的tag_id跟tags表的id相等。就是把兩個表中符合條件的所有記錄找出來;
4.?GROUP就是分組,ORDER是排序,LIMIT是限制條數,可以分別去搜索「SQL?GROUP」,「SQL?ORDER」,「SQL?LIMIT」去學習,不難;
5.?另外學習SQL的時候,要學會拆解語句,比如:
a.?這個語句可以拆解成SELECT?*?FROM?article_tags,去navicat軟件里執行,看看輸出什么;//找到article_tags的表格
b.?再加條件:SELECT?*?FROM?article_tags?AS?ats?LEFT?JOIN?tags?ON?ats.tag_id?=?tags.id;?看看輸出什么;//找到了article_tags和tags id相等部分;
c.?再加條件:SELECT?*?FROM?article_tags?AS?ats?LEFT?JOIN?tags?ON?ats.tag_id?=?tags.id?GROUP?BY?ats.tag_id;?看看輸出什么;
d.?再加條件:SELECT?*?FROM?article_tags?AS?ats?LEFT?JOIN?tags?ON?ats.tag_id?=?tags.id?GROUP?BY?ats.tag_id?ORDER?BY?COUNT(ats.tag_id)?DESC;?看看輸出什么;
e.?最后在語句后加條件:LIMIT?100;?看看輸出什么;
補充:
SELECT tags.text
FROM article_tags
AS ats //將article_tags以ats代替
LEFT JOIN tags ON ats.tag_id = tags.id
//直接搜到了article_tags與tags的id相同的一個交集id,輸出的tags中id對應的文本行。
GROUP BY ats.tag_id //對文章標簽的標簽id進行分組,將重復的內容歸納到一個一個組別中
ORDER BY COUNT(ats.tag_id) //對每組標簽的點擊次數進行排序
DESC LIMIT 10 //并以倒序的形式輸出,限制輸出10行
問題3、tags標簽的尺寸比較(articleHash.size() > 5 && tagHash.get(tag) >= articleHash.size() * 0.5)?源代碼如下:
while(it.hasNext()){
String tag = (String) it.next();
if(articleHash.size() > 5 && tagHash.get(tag) >= articleHash.size()*0.5){
tags.add(tag);//將tag中的內容添加到tags中
}
}
此步驟有可能是如果首次從數據庫根據關鍵詞搜索到的文章哈希表大于5個以上,且標簽的哈希表大于等于文章哈希表尺寸的一半時,才將二次搜索獲得的標簽添加到標簽列表內;首次搜索文章哈希表小于等于5就不需要再進行詳細的第三次搜索內容了。
2017-08-02 疑難要點
記錄時間17/08/03
疑點:
問題1、novelDao內第8第9有關order的引號問題;`order`——小說章節序號 的用法?
` 字在mysql中的用法是為了避免與數據庫中的關鍵字沖突,因為ORDER和小說章節序號order有沖突,所以加符號`order`就可以成功避免這個問題,表示此為變量。
問題2、*SQL LIKE模糊識別的用法?
SQL中LIKE是指的是模糊識別,
SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" LIKE{套式};
其中,當套式多為字符樣式,舉個例子'%AN%'指的是所有包含'AN'這個套式的字符串存在,限定范圍在“欄目名中”尋找;
問題4、小說的熱門榜代碼中
SELECT novel_id, novel_name, stat_time
FROM statics
WHERE stat_time = //stat_time是發布時間嗎?
(
SELECT MAX(stat_time) FROM statics //如果是為什么要把范圍限定在最新發布小說內?
)
ORDER BY ip //ip指的是他們的點擊數嗎??
DESC LIMIT 20
(1)stat_time指什么?(2)如果是為什么要把范圍限定在最新發布小說內?(3)ip是什么?
1)statics這個表是用一個定時腳本更新的,代碼還沒給你。stat_time指的是統計的時間,可以去Navicat看看具體的內容,2017-08-0200:00:00表示8月2號的統計,保存每天的統計數據;
2)因為我們要的只是當天的數據,今天是8月2號,MAX(stat_time)就剛好是2017-08-0200:00:00,就可以把當天的數據篩出來。
3)就是當天訪問這個小說的所有用戶的IP數量,novel_click指當天點擊小說URL的次數,chapter_click指的是當天點擊章節的總次數。這些數據都是用來支持「今日熱書」的功能。
問題5、COUNT( )的用法?
一般數據庫中寫COUNT( )主要用于計數,而COUNT(1)表示為欄目第一列技術,
又如,數據庫記錄了每個消費者每條消費記錄,為了檢測如Tom消費的次數,我們就可以用COUNT(Tom)的方法來計算。詳細鏈接http://www.w3school.com.cn/sql/sql_func_count.asp
數據庫:
1、SQL語句ORDER BY \DESC\LIMIT\OFFSET解析(第3點有詳細解說)
SELECT *
FROM articles
ORDER BY id //此處表示以id進行排序,默認為順序
DESC //表示以倒序輸出,由大到小 ?ASC則與其相反
LIMIT 10 //表示限制的輸出行數為10
OFFSET 10 //表述跳過前10行后才開始輸出,此時輸出的就是按照倒序從第11行到20行;
2、數據庫UPDATE(第3點有詳細解說)
UPDATE novels SET `popular` = `popular` + 1 WHERE id = ?
表示設置novels內某id的小說的歡迎程度加1
3、數據庫【SQL注入】【SQL GROUP】【SQL ORDER】【SQL LIMIT】【SQL UPDATE】內容:
1、SQL注入:
主要就是通過數據語言邏輯,向數據庫發送某些特定請求或提交表單等;在這個過程中很大的安全問題存在,SQL注入的主要內容也就包括SQL的注入原理、方法、技術等,更重要的是SQL注入時安全防護問題。詳細了解鏈接https://baike.baidu.com/item/sql%E6%B3%A8%E5%85%A5/150289?fr=aladdin
2、SQL GROUP:
主要作用是用于某列的相同項,比如articles列表中有author一列,將重復名字的作者合并就用到了GROUP BY;更多用法于http://www.w3school.com.cn/sql/sql_groupby.asp
SELECT author
FROM articles
GROUP BY author;//得到了所有不重名的作者,作用就在于合并重復項
3、SQL ORDER:
ORDER BY結果用于對結果集進行排序;
ORDER BY "首要排序的名稱" //如果后面不加DESC一般默認以a-Z,又小到大的順序排列
ORDER BY "首要排序的名稱",“次要排序的名稱”;
具體用法例子借鑒http://www.w3school.com.cn/sql/sql_orderby.asp
4、SQL LIMIT:
主要作用用于限制返回的搜索結果,一般有兩種
1) LIMIT a;//返回從1-a行結果
2) LIMIT a,b//返回從a-b行的結果
LIMIT優化搜索問題詳細http://blog.csdn.net/a14206149/article/details/37690855
5、SQL UPDATE:
UPDATE語句用于修改表中的數據;
語法:
UPDSTE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
http://www.w3school.com.cn/sql/sql_update.asp
2017-08-04 疑難要點
記錄時間17/08/04
問題1、最難看懂的就是function()類問題,例如以下等等,有關function()的內容?
那些function是自動生成的代碼,是百度廣告,一些第三方應用為了方便部署,提供了插件代碼,不用管的。我們的評論交互也是用的插件,搜狐暢言的。這些代碼都是他們的邏輯,亂七八糟的經過混淆的,不用細看;
問題2、實現html頁面自動下拉列表問題?
實際上這是模版語言,有很多種,專門用來生成HTML的,小說站用的是Play framework的模版語言叫twirl,實際上這就是twirl中的遍歷數組的用法,詳細鏈接:https://www.playframework.com/documentation/2.6.x/ScalaTemplates#string-interpolation
問題3、novel_sitemap.scala.html應該是爬蟲頁面,其自變量是根據小說集合,和作者集合去爬內容的,可是在所有網站中卻并沒有發現@novel_sitemap,這個有點困惑?
novel_sitemap.scala.html是給搜索爬蟲看的,比如給百度和谷歌的爬蟲看,要在百度站長平臺提交這個鏈接,然后百度爬蟲每天都會去這個頁面看一眼,有沒有新的內容;
問題4、輸出文本內容@Html()相關問題?
可以把.trim()或.replace("\n", "")去掉,看看是什么效果,@Html有轉義的作用,如果文本里有//點我中獎這樣的鏈接,Html不會展示鏈接,而是直接顯示文本,起到一個安全保護的作用,你可以測試一下:@Html("點我中獎");//代碼塊內容被清除,看原筆記
問題5、遍歷小說出來(@for((novel,index) <- novels.zipWithIndex))是如何遍歷的?
這里用了Scala語句中zipWithIndex的方法,其主要用途是遍歷novels的過程中給每個novel一個從0開始的序號,一邊遍歷出所有的小說,一邊給每個小說添加序號;
詳細鏈接http://blog.csdn.net/shenxiaoming77/article/details/56288500