购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.8 文章搜索模块设计

文章搜索模块使用到的数据表:tb_article、tb_articleType。

4.8.1 模块概述

文章搜索模块是本系统的核心部分,这部分内容主要包括搜索我的文章、根据关键字搜索文章、根据文章类型搜索文章、热门搜索和搜索作者的所有文章几个功能。在如图4.10所示系统首页中就可以实现对文章的搜索工作,进入论坛首页后,可实现搜索本人的文章等内容。

4.8.2 文章搜索模块技术分析

本模块中在对文章进行搜索时使用了QBC检索方式,QBC检索方式提供了一种面向对象的检索方式,并将数据的查询条件封装成一个对象。使用QBC查询方式的就是Criteria接口。对于完整使用Criteria进行数据库检索的操作主要包括以下步骤:

(1)调用Session实例对象的createCriteria()方法得到一个Criteria接口实例。

(2)设置查询条件。

(3)调用Criteria对象的list()方法执行查询语句。

Criteria接口的典型方法如下。

add()方法:用于设置查询的条件。该方法的参数为Criterion对象的实例。该对象的实例可以通过Restrictions类或者Expression类所提供的一系列静态方法来创建。

createCriteria()方法:用于创建一个新的Criteria。用于在符合查询时设置查询条件。

list()方法:用于执行数据库查询,返回查询的结果。

setFetchSize()方法:设置获取记录的数目。

setFirstResult()方法:设置获取第一个记录的位置。这个位置从0开始计算。

uniqueResult()方法:用于获取唯一的结果对象的实例。在确保只有一个满足条件的查询结果时,可以使用此方法。

4.8.3 搜索我的文章实现过程

用户登录论坛之后,需要单击论坛首页中的“我的文章”按钮,即可把用户发表过的所有的文章搜索出来。搜索我的文章运行效果如图4.18所示。

图4.18 搜索我的文章效果截图

搜索我的文章模块的主要实现步骤如下:

(1)搜索我的文章主要流程是系统先取得当前用户信息,传给后台,后台再根据文章对象里的用户ID,查询出该用户下的所有文章。具体代码实现如下.

代码位置:光盘 \MR\04\src\com\hrl\action\ActicleAction.java

(2)定义方法queryAllArticleByUser(),用于查找某个用户发表的所有文章。在实现查询的过程中,使用了分页技术。具体代码如下.

代码位置:光盘 \MR\04\src\com\hrl\dao\impl\ArticleDaoImpl.java

实践真知说明

query()方法的3个参数分别代表HQL语句、分页查询的索引值、一页取多少条数据。具体的方法实现在DefaultDaoImpl中。

4.8.4 根据关键字搜索文章实现过程

根据文章关键字查询系统会用输入的关键字与所有文章的标题和内容进行任何位置的匹配,如果匹配成功则返回搜索结果,否则返回空。根据关键字搜索文章分为3种情况:在明日论坛不选择文章类型直接输入关键字进行搜索、在明日论坛首页选择一个文章类型再加上关键字进行搜索和进入论坛输入关键字进行搜索。如果选择文章类型,系统会在所有该类型下的文章里面进行搜索,如果没选择文章类型,系统将在所有的文章里进行搜索。运行效果如图4.19所示。

图4.19 根据关键字搜索文章效果图

如果搜索出来的文章较多时,系统会采用分页显示的效果。根据关键字搜索文章关键实现步骤如下:

(1)根据关键字搜索文章的前台代码如下。

代码位置:光盘 \MR\04\WebContent\index.jsp

(2)当用户在系统首页,或论坛首页中单击“搜索”按钮,系统会执行JavaScript方法,判断用户输入的搜索内容是否合法。JavaScript具体代码如下。

代码位置:光盘 \MR\04\WebContent\js\index.js

(3)在ActicleAction中,定义doSearch()方法实现通过关键字搜索文章,并将请求转发至相应地址,具体代码如下。

代码位置:光盘 \MR\04\src\com\hrl\action\ActicleAction.java

(4)在ArticleDaoImpl中定义根据用户输入内容搜索符合条件的文章方法doSearch。该方法有4个String类型的参数,分别用于指定要搜索的文章类型,要搜索的文章内容,分页显示的参数等。将查询结果以List形式返回。该方法采用的是以QBC方式进行查询,这种方式的优点是不用手动写HQL语句,也不用考虑一些SQL关键字的注入攻击(例如%、*、[]等特殊字符),只需要简单调用Criteria提供的简单方法就行。具体代码如下。

代码位置:光盘 \MR\04\src\com\hrl\dao\impl\ArticleDaoImpl.java

实践真知提示

Criteria对象:Criteria对象可以添加多个表达式。这个实例中添加的表单是根据关键字在任意位置进行匹配、按照文章的最后更新时间进行倒序排序和分页表达式。Criteria使开发者可以写更少的代码去完成更多的功能。

4.8.5 热门搜索实现过程

通过热门搜索,用户可以搜索出时下热门的技术,这个功能也是本系统的一大特色。每个热门搜索都是一个超链接,用户只要进入一个热门搜索系统就能查询出关于该热门搜索的所有文章。热门搜索的运行效果如图4.20所示。

图4.20 热门搜索效果截图

热门搜索的关键实现步骤如下。

(1)热门搜索前台页面关键代码如下。

代码位置:光盘 \MR\04\WebContent\index.jsp

(2)单击“搜索答案”按钮,系统会将热门搜索的字符串赋给搜索框的值,这样执行逻辑就和普通搜索一样了。JS赋值代码如下。

代码位置:光盘 \MR\04\WebContent\js\index.js

4.8.6 搜索文章作者的所有文章实现过程

选择一个文章类型之后,系统会显示出该类型下的所有文章信息,包括文章标题、文章作者、文章发表时间、最后回复、最后回复时间等。如图4.21所示,当单击文章作者超链接,系统会搜索出该作者发表过的所有文章。

图4.21 显示作者发表过的所有文章

搜索文章作者的所有文章关键实现过程如下。

(1)按照作者查询文章页面关键代码如下所示。

代码位置:光盘 \MR\04\WebContent\js\index.js

(2)在ActicleAction中定义queryArticlesByUserOfArticle()方法,实现查询文章作者的所有文章。并将请求转发至相应地址。具体代码如下。

代码位置:光盘 \MR\04\src\com\hrl\action\ActicleAction.java

(3)在ArticleDaoImpl类中定义方法,二级缓存中取出用户信息,再根据该用户信息,查询出其发表的所有文章。代码如下。

代码位置:光盘 \MR\04\src\com\hrl\dao\impl\ArticleDaoImpl.java

4.8.7 搜索回复作者的所有文章实现过程

搜索回复作者所发表的文章与搜索文章作者发表过的所有文章的业务逻辑相似,所不同的是这里的用户信息是从回复实体中获取的。具体代码实现如下。

(1)在ActicleAction类中定义queryArticlesByUserOfReply()方法,实现查询文章回复作者的所有文章。并将请求转发至相应地址,具体代码如下。

代码位置:光盘 \MR\04\src\com\hrl\action\ActicleAction.java

(2)在ArticleDaoImpl类中定义findArticlesByUserOfReply()方法,实现查询回复人发表过的所有文章。具体代码如下。

代码位置:光盘 \MR\04\src\com\hrl\dao\impl\ArticleDaoImpl.java Y8TKmKPU2dPNMx+Txfr/rdanYaxhVIGoAM8tCVBpSrpGOmPaW31t4OAZdFfygJqH

点击中间区域
呼出菜单
上一章
目录
下一章
×