小言_互联网的博客

Web项目部署(5)—“最新博文”和“博客排行”功能的实现&上一篇精选博文功能完善

240人阅读  评论(0)

上一篇中实现精选十条博文的时候,用的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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场