(1)创建数据库和表。
1)创建新闻表(n_news)。
2)创建用户表(n_user)。
3)创建用户历史行为表(n_behavior)。
(2)配置pom.xml文件。
配置pom.xml文件,导入依赖,pom.xml具体内容如下:
(3)web.xml文件。
系统web.xml文件具体内容如下:
(4)通用类BaseServlet。
BaserServlet继承于HttpServlet,先获取请求携带的方法参数值和指定类的字节码对象,然后根据请求携带的方法参数值,并通过字节码对象获取指定的方法,最后执行指定的方法。从而使得ActionServlet把重点放在业务需求上面,只需要写具体执行的方法即可,避免了代码冗余。
(5)数据库连接与关闭。
为提高数据库连接性能和稳定性,系统采用druid数据库连接池技术连接数据库。定义类JdbcUtils实现数据库连接与关闭操作,其具体实现代码如下。
其中,druid.properties为连接的数据库的信息配置文件,在本系统中,该文件的具体内容如下。
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///news
username=root
password=15929
initialSize=5
maxActive=10
(6)用户管理功能实现。
用户管理功能主要包括用户注册、登录和注销三部分。新闻推荐系统的用户管理功能的前端部分采用jsp、html、css、javascript和jquery等技术实现页面的展示,使用javaweb的servlet技术响应和前端页面的请求,并利用druidMySQL数据库连接池来实现对数据库的更新和数据查询。
1)用户信息类与操作接口的实现。
①User类:对应news数据库的n_user表,类的成员属性与n_user表中字段一一对应,具体实现代码如下:
②UserDAO类和UserDAOImpl类。
UserDAO类定义和用户信息查询和保存的接口。具体实现代码如下:
③UserService类与UserServiceImpl类。
UserService类定义了用户注册、登录、判断用户名是否可用、用户是否已经存在和获取用户信息的逻辑接口,具体实现代码如下。
UserServiceImpl类实现UserService类中定义的接口,具体实现代码如下。
④UserServlet类。
UserServlet类响应前端页面的请求,并将处理后的结果返回前端页面。具体实现代码如下。
2)用户注册功能实现。
通过前端egist.jsp提交form表单给UserServlet,UserServlet首先对前端信息进行处理,检验表单内的信息是否符合要求,如符合要求就通过连接数据库将用户信息保存到数据库。否则将回显不符合要求的提示信息。具体实现过程如下。
①用户注册页面regist.jsp,主要提供用户注册界面,如图8-41所示。
图8-41 用户注册界面
具体实现代码如下:
②检测用户名是否存在。
对前端页面的提交信息进行处理,判断当前用户名是否已存在,如图8-42所示。
图8-42 用户已存在提示界面
具体实现过程如下。
首先,Jquery发送请求到UserServlet.java,UserServlet.java具体代码如下:
其次,UserServlet.java对ajax请求进行处理,具体代码如下:
然后,UserService.java和UserServiceImpl.java对检测用户名进行业务逻辑处理,具体代码如下:
最后,UserDAO.java和UserDAOImpl.java通过用户名查询MySQL数据库中用户名,如果不存在就返回null,具体代码如下:
③检测两次密码是否相同。
通过采用jquery获取第一次输入密码时输入框的内容与第二次输入框的内容进行对比,具体效果如图8-43所示。主要代码如下:
图8-43 两次密码不同错误提示
④检测邮箱格式是否符合要求(邮箱格式:xxxx@xxx.com)。
通过采用jquery获取邮箱输入框时的内容通过使用正则表达式(^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)∗\.[a-zA-Z0-9]{2,6}$)进行对比,具体效果如图8-44所示。主要代码如下:
图8-44 邮箱格式不正确提示
⑤切换验证码和判断验证码是否正确。
通过采用jquery获取验证码输入框时的内容通过使用正则表达式(^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)∗\.[a-zA-Z0-9]{2,6}$)进行对比,具体效果如图8-45所示。主要代码如下:
图8-45 验证码错误提示
⑥用户注册成功。
用户注册成功,信息保存通过jquery、UserServlet和UserService共同完成,具体实现过程如下。
首先,点击注册按钮,regist.jsp页面通过post提交方式将form表单中的数据提交给UserServlet.java。form表单主要代码为:
<form action="user"method="post">
其次,在UserServlet.java中对数据进行处理,具体代码如下:
然后,在UserService.java中,调用在UserDAO.java中saveUser()方法保存理好的数据保存用户的注册信息。具体代码如下:
3)用户登录功能。
用户登录页面login.jsp提交form表单,UserServlet检验表单内的信息是否符合要求,如符合要求就通过连接数据库将用户信息保存到数据库。否则将回显不符合要求的提示信息。
①用户登录页面login.jsp,提供用户登录界面,如图8-46所示。
图8-46 用户登录界面
主要实现代码如下:
②用户登录验证。
输入用户名和密码后,点击登录,登录页面发送请求到UserServlet.java进行用户输入合法性及身份验证。如图8-47所示。
图8-47 用户名或密码错误
首先,前端页面login.jsp通过form表单并利用post方式提交登录信息,具体代码为:
<form action="user"method="post">
其次,UserServlet.java调用login()方法对前端页面的提交信息进行处理,具体代码如下:
然后,UserService.java和UserServiceImpl.java调用UserDAO.java的queryUserBy UsernameAndPassword()进行验证用户身份的合法性,具体实现代码如下:
4)用户注销功能。
用户登录成功后,用户的用户名会显示在导航栏的最右边,如图8-48所示。当用户鼠标触碰到用户名,将会显示注销按钮,如图8-49所示。点击注销按钮,向UserServlet发送请求,UserServlet接收请求以后,销毁掉session域中的用户信息,重定向到登录页面。
图8-48 登录成功页面
图8-49 用户注销
①前端页面显示用户名,具体代码如下:
<span>用户名</span>
<a href ="javascript:;">${sessionScope.user.username}</a>(www.xing528.com)
②UserServlet.java登录时将登录信息保存在session域中,具体代码如下:
req.getSession().removeAttribute("user");
req.getSession().setAttribute("user",user);
③当用户鼠标触碰到用户名,会显示注销按钮,具体代码如下:
$('.nav-logout').hide();
$('.nav-user-a').mouseenter(function(){
$('.nav-logout').show();
});
$('.nav-user-a').mouseleave(function(){
$('.nav-logout').hide();
});
④点击注销按钮,退出新闻推荐系统。
首先,前端页面点击注销按钮,发送请求到UserServlet.java,具体代码如下:
$('.nav-logout a').click(function(){
$(this).attr("href","user?action=logout");
});
其次,UserServlet.java调用logout()方法实现用户注销功能,具体代码如下:
(7)过滤器实现。
Filter也称之为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源,例如Jsp,Servlet,静态图片文件或静态html文件等进行拦截,从而实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。Servlet API中提供了一个Filter接口,开发web应用时,开发人员可通过Filter接口实现用户在访问某个目标资源之前,对来自客户端访问的请求和响应进行拦截。类TransactionFilter继承Filter过滤器,并在接口方法中增加事务统一提交的过滤条件,其具体实现代码如下。
(8)新闻管理功能实现。
1)新闻描述类与操作接口的实现。
①News类。
News类对应数据库的n_news表,类的成员属性与n_news表中字段一一对应,具体实现代码如下。
②NewsScore类。
NewsScore类对应数据库中n_behavior,类的成员属性与n_behavior表中字段一一对应,具体实现代码如下。
③NewsDAO类和NewsDAOImpl类。
NewsDAO类定义了三种查询新闻的接口,具体内容如下。
NewsDAOImpl类对应实现了NewsDAO类定义的三种查询新闻的接口,具体实现代码如下。
④NewsScoreDAO类和NewsScoreDAOImpl类。
NewsScoreDAO类定义了库中用户行为表新闻评分的查询接口及用户是否存在行为表中的判断接口,具体内容如下。
NewsScoreDAOImpl类实现NewsScoreDAO类中定义的接口。具体内容如下。
⑤NewsService类和NewsServiceImpl类。
NewsService类定义了根据类别和根据文章id查询新闻的接口,具体实现代码如下。
NewsServiceImpl类实现NewsService类中定义的接口。具体实现代码如下。
⑥NewsScoreService类和NewsScoreServiceImpl类。
NewsScoreService类定义了用户行为表中新闻评分的查询接口及用户是否存在行为表中的判断接口,具体内容如下:
NewsScoreServiceImpl类对应实现了NewsScoreServiceImpl类中定义的接口。具体实现内容如下:
2)新闻分类功能实现。
在前端页面news.jsp,如图8-50所示,点击类别按钮发送某一个类别的请求给NewsServlet,NewsServlet通过随机调用数据库中n_news表中这一类别的10条新闻文章,然后显示在前端页面的该类别文章列表下。具体实现过程如下。
图8-50 新闻分类页面
①新闻分类功能的前端效果如图8-47,实现的部分html代码如下。
②在前端页面news.jsp中,获取选择的新闻类别并发送给NewsServlet,实现的主要代码如下:
③NewsServlet获取前端页面发送的新闻类别,并依据类别从数据库中随机获取十篇文章信息,并转换为json格式进行存储。主要实现代码如下。
3)新闻评分功能实现。
新闻评分功能是默认显示五分,用户可自行为文章打分(1-10),如图8-51所示。如果第一次打分则会保存到数据库中的n_behavior表中,如果再次打分会修改已经存在n_behavior表中的信息,打完分会进行刷新页面显示已经打完的分数。
图8-51 新闻评分页面
具体实现步骤如下。
①用户在前端页面(news.jsp),news.jsp发送post请求,向NewsInfoServlet发送用户id、文章id和设置分数等信息。具体代码如下:
②NewsInfoServlet,接收news.jsp发送的请求参数,并向数据库中保存或修改用户给出的评分值。如果库中用户没有给出文章的评分,系统设定用户给出的评分值为5。其具体实现代码如下:
4)新闻详情查看功能实现。
新闻详情查看是指具体查看新闻的该新闻评分、类型和编号和新闻的具体内容,查看结果如图8-52所示。
图8-52 新闻详情页面
前端页面news.jsp获取新闻类别、文章id、评分和文章详情的值,并发送给Newservlet。Newservlet接收请求,获取参数的值,并发送到新闻详情页面news_info.jsp实现新闻详情查看功能。具体实现步骤如下:
①前端页面news.jsp中实现新闻查看的关键代码如下:
②Newservlet接收请求获取参数的值,并将参数值发送到新闻详情页面news_info.jsp。关键实现代码如下:
③news_info.jsp依据文章id、文章类别、评分和文章内容,展示文章详情。具体实现代码如下:
上述,在新闻分类功能和新闻查看功能实现中均采用Newservlet响应前端页面请求,其实现完整代码如下:
(9)新闻推荐功能实现。
①推荐算法。
本系统推荐算法采取协同过滤中基于物品的推荐ItemCF,ItemCF基于用户的历史行为,给用户推荐一些与他之前感兴趣的物品类似的物品。本系统采用曼哈顿距离相似度进行基于物品的推荐,该相似度用于多维数据空间距离的测度其范围是[0,1],同欧式距离一致,值越小,说明距离值越大,相似度越大。此相似度比欧式距离计算量少,性能相对高。具体实现代码如下:
②新闻推荐。
RecommendServlet从前端页面中获取用户的id,计算该用户的推荐新闻列表,并判断该用户的推荐新闻列表是否大于50条,如果有就按照推荐信息进行随机推荐,如图8-53所示;如果小于50条,则采用随机推荐方法,给出为当前用户推荐的文章列表。并转化为json格式,存入session域中。
图8-53 非新用户的新闻推荐后台打印信息
RecommendServlet具体实现代码如下:
③推荐新闻列表显示。
前端news.jsp通过jquery从推荐信息里抽取十条新闻,并进行回显到新闻推荐页面,新闻推荐页面效果如图8-54所示。
图8-54 用户新闻推荐结果
在news.jsp中主要实现的html代码如下。
前端news.jsp实现页面显示推荐信息的主要步骤如下。
首先,产生十个不相同的随机数用于随机展示推荐新闻,具体实现代码如下:
其次,通过json将后台推荐的文章在前端页面展示出来,具体实现代码如下:
上述新闻管理和新闻推荐功能实现中,均使用到了系统前端页面news.jsp,并且介绍了页面中对应实现各个功能的关键代码,为了更好地理解当前页面的具体实现过程和思想,下面给出news.jsp的完整实现代码。
具体功能如下。
(10)新闻分类功能的前端效果如图5-12,具体实现的html代码如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。