疑难点汇总

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


你可能感兴趣的:(疑难点汇总)