(一)前言
功能模块划分已经完成了,接下来就是对每个模块进行代码研究和学习了,确实还是很期待的。对与代码的研究,我的方法是这样的:考虑到自身基础薄弱,所以每学习一个功能模块,我都会把其中涉及到的知识点列出并加以总结。对整个功能的实现代码加以分析,可以的话,也会自建一个小项目来实际操作一下。接下来我会逐次分析每个模块,每个版块格式不一定统一,但都会记录下我认为比较有价值的地方,最后也会做一个大总结来归纳当天学习到的知识点和方法技巧。下面言归正传
(二)功能版块分析
2.1“搜索”原理分析

原来就一直很好奇,当我们输入一些关键词,网站是如何检索出和该关键词有关的文章内容的,当然不同网站的检错方法千差万别,而且有些也是特别复杂,这里就先学习一下该网站的检索方法。我原来以为会是把所有数据先从数据库取出,然后再用一些数据结构和算法对所需数据进行筛选,所有在看源码时我也是从jsp页面一直回退到了sql语句,我想找的答案竟然在sql语句中,哎~。不过也能想得通,数据那么多怎么可能都取出来筛选呢,当然是先筛选再取出的呀!前面的页面方法调用和参数传递不是我们讨论的重点,这里直接看mybatis部分的sql语句了。
<select id="findAll" resultMap="BaseResultMap">
SELECT
article.*
FROM
article
<where>
<if test="status != null">
article.article_status = #{status} AND
</if>
<if test="keywords != null">
article.article_title LIKE concat(concat('%',#{keywords}),'%') AND
</if>
<if test="userId != null">
article.article_user_id = #{userId} AND
</if>
<if test="categoryId != null">
article.article_id IN (
SELECT article_category_ref.article_id FROM article_category_ref
WHERE article_category_ref.category_id = #{categoryId}
) AND
</if>
<if test="tagId != null">
article.article_id IN (
SELECT article_tag_ref.article_id FROM article_tag_ref
WHERE article_tag_ref.tag_id = #{tagId}
) AND
</if>
1 = 1
</where>
ORDER BY `article`.`article_order` DESC, `article`.`article_id` DESC
</select>
涉及知识点
1.mybatis的动态sql:
where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除。
2.mybatis的sql返回值类型:
- 返回一般数据类型,如:resultType=“java.lang.Integer”
- 返回JavaBean类型,如:resultType=“Student”(需要在配置文件中取别名,否则得加上包名等前缀)
- 返回List类型,如:resultType=“Student”(注:如果是多条数据,会自动封装在list中返回)
- 返回Map类型,如:resultType=“map”
上述例子代码中的“BaseResultMap”没有见过,搜到的有关BaseResultMap的信息并不多,如下:mybatis 非常的智能,如果配置了resultMap,返回值统一使用 resultMap=“BaseResultMap”,mybatis会根据查询到的条目数量自动进行判断,如果是一条就返回对象,如果是多条就返回List对象列表。
3.sql语法:
sql contact函数用于将两个字符串连接起来,形成一个单一的字符串。
比较核心的检索语句还是LIKE concat(concat(’%’,#{keywords}),’%’) ,意思是找标题中含有该关键词的文章,虽然翻译过来有点low,但至少学会了如何用sql语句来描述。
2.2“一键分享功能”原理分析

这里也是原来就很好奇的一键分享功能实现,不出所料的是借用第三方库的,代码如下图所示。猜测有些网站适用qq第三方入口登录会不会也是这么一个道理,但应该会比这个复杂些。不用着急,在项目的留言板块会介绍第三方入口登录的使用。
<!DOCTYPE html>
<html>
<head>
<META http-equiv="content-type" content="text/html; charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="bdsharebuttonbox">
<a href="#" class="bds_more" data-cmd="more"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信"></a>
</div>
<script>
window._bd_share_config={
"common":{
"bdPopTitle":"您的自定义pop窗口标题",
"bdSnsKey":{},
"bdText":"此处填写自定义的分享内容",
"bdMini":"2",
"bdMiniList":false,
"bdPic":"http://localhost/centlight/public/attachment/201410/24/14/5449ef39574f5_282x220.jpg", /* 此处填写要分享图片地址 */
"bdStyle":"0",
"bdSize":"16"
},
"share":{}
};
with(document)0[
(getElementsByTagName('head')[0]||body).
appendChild(createElement('script')).
src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)
];
</script>
</body>
</html>
涉及知识点
1.javascript:void(0):
href="#"与href="javascript:void(0)"的区别包含了一个位置信息,默认的锚是#top 也就是网页的上端。而javascript:void(0), 仅仅表示一个死链接。
2.οnclick=“return false”:
return false表示阻止浏览器对事件的默认处理。比如:
<input type="submit" onclick="submitAction(); return false;" />
submitAction 方法里面有提交表单的动作。万一不加 return false,在执行完 submitAction 方法后,submit 按钮还会继续执行它的默认事件(提交表单),加上return false后,则不会再执行提交表单的动作 。
(三)后续
做源码分析真是项体力活,耗时耗力,产量还低。但确实解开了很多疑惑,帮助也挺大,再是明白为什么说看源码一定要带有目的地看了,这里做个小总结。
- mybatis的BaseResultMap可以返回任意数量的对象;
- 搜索栏的简易检索是通过sql语句LIKE concat(concat(’%’,#{keywords}),’%’)来实现的,查找标题中含有该关键词的文章;
- 第三方登录只是一个固定代码块;
- onclick 里的return false组织默认事件的进行;
- javascript:void(0)声明一个死链接;
博主对网站功能模块进行代码研究,分析了“搜索”和“一键分享功能”原理。“搜索”功能核心在mybatis的sql语句,涉及动态sql、返回值类型等知识;“一键分享功能”借用第三方库,涉及javascript相关知识。最后总结了各功能的关键要点。

被折叠的 条评论
为什么被折叠?



