上一篇中实现精选十条博文的时候,用的mysql语句是这样的:
String sql="select t1.id , t1.art_whoId , t1.art_title , t1.art_content,"+
"t1.art_count , convert(t1.art_pubTime,char),"+
"t2.user_name from tb_article as t1 , tb_user as t2 where "+
"t1.art_whoId=t2.id order by art_count desc";
其实因为我在mysql里测试只是输入了十条内容,那么久会显示所有的内容。
本来书里的的语句是sql语句,因此要显示top几,那个语句是不能用的,可以改成mysql的查询方式:
select * from tablename order by orderfield desc/asc limit position,counter;
tablename是指表名,orderfield是指属性字段,也就是哪一列,可以根据多个列中间用逗号隔开。desc是按照降序排序,asc是按升序;position 指示从哪里开始查询,如果是0则是从头开始,counter 表示查询的个数。
例如上面的语句我先在数据库里直接进行尝试查询:
可以看到根据art_count字段降序排序返回了结果,这里面还有一些其他约束,where后面的t1.art_whoId=t2.id,因为是在用户和文章两个表里的,from是两个表,约束id这个外键一样的条件。
所以这里因为我只有十条数据,就返回了所有,想实现精选的某top几个博文,如果按照sql语句,可以直接用途topN操作。
mysql的语法是后面加limit,这个例子我试试最后加上limit 0,5 也就是返回访问量前五条的博文
结果是这样的,所以我们稍作更改,精选博文限定某前几篇的功能就能够实现了。
结果是这样的:
可以看到只显示了五条。
一、最新博文的实现:
1.和精选博文的实现类似,我们先去IndexServlet.java中添加实现最新博文的逻辑代码,位置就在实现精选博文的下方,重新建立一个List实例来存放数据
List newArticlelist=new ArrayList();
newArticlelist=articleDao.getNewArticle();//获取最新博文
request.setAttribute("newArticlelist", newArticlelist);
2.接着去ArticleDao文件里增加和数据库连接查询的处理代码,增加一个方法,同样是在获取精选博文的方法后面添加类似的代码:
public List getNewArticle() throws SQLException{
String sql ="select id,art_whoId ,art_title ,art_content ,art_count "+
"from tb_article order by art_pub Time desc limit 0,3";
//查询最新的三条博文
List newArticleList=null;
DB mydb=new DB();//创建数据库连接类
mydb.doPstm(sql, null);//执行查询
ResultSet rs=mydb.getRs();//结果存储在rs中
if(rs!=null) {
newArticleList=new ArrayList();
while (rs.next()) {
ArticleSingle single= new ArticleSingle();
single.setId(rs.getInt(1));//取出博文记录的id
single.setArtWhoId(rs.getInt(2));//取出博文记录的用户id
single.setArtTitle(rs.getString(3));//取出博文记录的标题
single.setArtContent(rs.getString(4));//取出博文记录的内容
single.setArtCount(rs.getInt(5));//取出博文记录的阅读数
newArticleList.add(single);//把单条记录加到数组里
}
}
return newArticleList;
}
3.也是和精选博文一样,需要在index.jsp文件里写入最新博文的页面显示代码。
这里本来标题字符位置是空的,jsp文件里留出了空的位置,也就是本来页面里看到的显示就是
是有的,但是下方没有显示内容,所以代码中的位置就在那个后面,加入如下的代码:
<!-- 将后台数据集合newArticlelist赋值到前台页面 -->
<c:set var="newArticlelist" value="${requestScope.newArticlelist }" />
<ul class="rank">
<!-- 根据newArticlelist进行逻辑判断 -->
<c:if test="${!empty newArticlelist }">
<!-- 根据newArticlelist进行循环 -->
<c:forEach var="article" items="${newArticlelist }">
<!-- 获取博文的相关信息 -->
<li><a
href="goBlogContent?id=${article.id }&master=${article.artWhoId }"
title="${article.artTitle }" target="_blank">${article.artTitle }</a>
</li>
</c:forEach>
</c:if>
</ul>
完了重新运行项目,来到index页面:
显示了三篇最新的博文,不过因为数据库里的标题还是都是title,所以比较不好看。
二、排行榜功能的实现
和前面增加排行榜功能一样,能看到首页最新博文的下面还应该有一个排行榜功能,显示出各种博文的阅读量,我们还是按照更改三个文件的顺序:
1.在IndexServlet文件中添加实现博客排行的逻辑代码:
UserDao userDao=new UserDao();
List toplist=userDao.getTopList();//获取博文排行
session.setAttribute("toplist", toplist);
2.新建UserDao.java文件。
这里问什么不在ArticleDao文件里继续添加查询呢?
这个功能是要完成排行,每个用户不一定只有一篇文章,因此排行应该是针对用户来说,他自己的所有博客有多少人阅读来进行排行。我们在设计数据库的时候,user表里有一列user_hitNum就是这个内容,至于这一列的数据怎么根据这个用户被别人点击的次数进行增加,现在先不实现。
(其实无非是重新创建一个列表实例然后查询数据库再存储,续在articleDao类后面也是可以的,为什么要单独写呢?这是面向对象的思想啊有木有)
package com.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.toolsBean.DB;
import com.valueBean.UserSingle;
public class UserDao {
public List getTopList() throws SQLException {
//创建查询数据库语句
String sql="Select id,user_name,user_hitNum,user_ico from tb_user order by user_hitNum desc limit 0,5";
List topList=null;
DB mydb =new DB();
mydb.doPstm(sql, null);
ResultSet rs=mydb.getRs();
if(rs!=null) {
topList=new ArrayList();
while (rs.next()) {
UserSingle single = new UserSingle();
single.setId(rs.getInt(1));
single.setUserName(rs.getString(2));
single.setUserHitNum(rs.getInt(3));
single.setUserIco(rs.getString(4));
topList.add(single);
}
}
return topList;
}
}
(细心的小朋友们已经发现了,如果你和我尿性一样的话,数据表里的user_hitNum肯定还是空的如果忘记造数据,肯定会报空指针错误的。所以这里我偷偷去加数据了)
3.在index.jsp中添加排行榜的页面显示代码
和最新博文一样,很容易找到位置添加代码:
<!-- 后台数据toplist赋值到页面变量var中的toplist -->
<c:set var="toplist" value="${sessionScope.toplist }" />
<ul class="paih">
<!-- 根据toplist取值进行判断 -->
<c:if test="${!empty toplist }">
<!-- 循环显示出toplist的字段记录 -->
<c:forEach var="topUser" items="${toplist }">
<ul>
<!-- 获取用户的相关字段数据以及阅读字数数据 -->
<li><a style="color: #5EA51B"
href="goBlogIndex?master=${topUser.id }">${topUser.userName }</a>
<span style="float: right; margin-right: 16px">${topUser.userHitNum }次阅读</span>
</li>
</ul>
</c:forEach>
</c:if>
</ul>
显示结果:
转载:https://blog.csdn.net/weixin_42092787/article/details/101026206