zl程序教程

您现在的位置是:首页 >  Java

当前栏目

校园论坛(Java)—— 帖子模块

2023-02-26 09:48:12 时间

校园论坛(Java)—— 帖子模块

  • 1、写在前面
  • 2、系统结构设计
    • 2.1 各个页面之间的调用关系
    • 2.2 普通帖子中各层的设计
  • 3、用户浏览普通帖子功能的实现
    • 3.1 帖子发布和查看以及回复功能系统
    • 3.2 用户浏览普通帖子功能的实现
  • 4、查看普通帖子详细内容以及实现回复功能
    • 4.1 普通帖子详细内容页面的制作
    • 4.2 普通帖子回帖功能的实现
  • 5、用户帖子发布、搜索功能页面的实现
    • 5.1 帖子发布
    • 5.2 搜索普通帖子
  • 6、用户删除普通帖子回帖系统
  • 7、项目代码


1、写在前面

  • Windows版本:Windows10
  • JDK版本:Java8
  • MySQL版本:MySQL5.7
  • Tomcat版本:Tomcat9.0
  • IDE:IntelliJ IDEA Ultimate2020.2.3

2、系统结构设计

2.1 各个页面之间的调用关系

2.2 普通帖子中各层的设计

  • Entity层

实体层声明普通帖子的id、title、content、createTime、keyWord(用于模糊搜索)等变量以及对应的set、get方法

package cn.lbj.forum.entity;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

/**
 * TODO 论坛相关信息实体类
 */
public class ForumEntity {
    private int fid;
    private String title;
    private String content;
    //	private Timestamp createTime;
    private Timestamp createTime;

    // TODO 新增【模糊搜索】的关键词变量
    private String keyWord;

    // TODO 新增【模糊搜索】的关键词变量getter()方法
    public String getKeyWord() {
        return keyWord;
    }
    // TODO 新增【模糊搜索】的关键词变量setter()方法
    public void setKeyWord(String keyWord) {
        this.keyWord = keyWord;
    }

    // TODO 关联用户,多对一额关联
    private UserEntity author = new UserEntity();
    // TODO 关联回复
    private List<ReplyEntity> replyList = new ArrayList<ReplyEntity>();


    public int getFid() {
        return fid;
    }

    public void setFid(int fid) {
        this.fid = fid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Timestamp getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    public UserEntity getAuthor() {
        return author;
    }

    public void setAuthor(UserEntity author) {
        this.author = author;
    }


    public List<ReplyEntity> getReplyList() {
        return replyList;
    }

    public void setReplyList(List<ReplyEntity> replyList) {
        this.replyList = replyList;
    }

}
  • Dao层

Dao层分别实现一个interface接口类以及一个接口方法实现类

接口类:

package cn.lbj.forum.dao;

import cn.lbj.forum.entity.ForumEntity;
import cn.lbj.forum.entity.ReplyEntity;

import java.util.List;

public interface ForumDaoInf {

    // TODO 模糊查询帖子
    public List<ForumEntity> findForumListByKeyWord(int pid, String keyWord);

    // TODO 查询所有帖子
    public List<ForumEntity> findForumList();

    // TODO 根据ID查询某个帖子
    public ForumEntity findForumById(int id);

    // TODO 添加帖子
    public int addForum(ForumEntity forum);

    // TODO 根据帖子的ID查询所有回复
    public List<ReplyEntity> findReplyList(int fid);

    // TODO 添加回复
    public int addReply(ReplyEntity reply);

    // TODO 根据用户ID查询用户的所有发帖
    public List<ForumEntity> personForum(int uid);

    // TODO 用户删除个人某个帖子
    public void deleteForum(int fid);

    // TODO 根据帖子id删除所有回复
    public void deleteReply(int fid);

    // TODO 用户删除某个回帖
    public void deleteReplyByRid(int rid);

    // TODO 用户管理模块
    // TODO 删除用户所有发帖
    public void dUserAllforumByUid(int uid);

    // TODO 删除该用户所有回帖
    public void dUserAllreplyByUid(int uid);

    // TODO 删除用户帖子下的所有回帖
    public void dUserOtherRelyByFid(int uid);
}

接口实现方法:

package cn.lbj.forum.dao;

import cn.lbj.forum.entity.ForumEntity;
import cn.lbj.forum.entity.ReplyEntity;
import cn.lbj.forum.entity.UserEntity;
import cn.lbj.forum.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class ForumDaoImpl implements ForumDaoInf {

    /**
     * TODO 模糊查询帖子
     * @param keyWord
     * @return
     */
    public List<ForumEntity> findForumListByKeyWord(int pid, String keyWord) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        /**
         * TODO 模糊查询
         *  select * from forum_info where title like "%a%"
         *  and user_id = '20201002';
         */
        String sql = "select * from forum_info where title like " + "\"" + "%" + keyWord + "%" + "\"" +" and user_id = ?";
        System.out.println("sql语句:" + sql);
        List<ForumEntity> list = new ArrayList<ForumEntity>();

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, pid);
            rs = ps.executeQuery();

            while (rs.next()) {
                ForumEntity forum = new ForumEntity();
                forum.setFid(rs.getInt(1));
                forum.setTitle(rs.getString(2));
                forum.setContent(rs.getString(3));
                forum.setCreateTime(rs.getTimestamp(4));
                // TODO 获取对应用户表中的外键
                UserEntity author = new UserEntity();
                author.setUser_id(rs.getInt(5));
                forum.setAuthor(author);
                list.add(forum);
                System.out.println("模糊查询结果的帖子标题为:" + rs.getString(2));
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, ps, conn);
        }
        return list;
    }


    /**
     * TODO 查询帖子列表
     * @return
     */
    public List<ForumEntity> findForumList() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<ForumEntity> list = new ArrayList<ForumEntity>();

        String sql = "select * from forum_info order by create_time desc";
        System.out.println(sql);

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                ForumEntity forum = new ForumEntity();
                forum.setFid(rs.getInt(1));
                forum.setTitle(rs.getString(2));
                forum.setContent(rs.getString(3));
                forum.setCreateTime(rs.getTimestamp(4));
                // TODO 获取对应用户表中的外键
                UserEntity author = new UserEntity();
                author.setUser_id(rs.getInt(5));
                forum.setAuthor(author);
                list.add(forum);
                System.out.println("查询所有帖子:" + rs.getString(3));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, ps, conn);
        }
        return list;
    }

    /**
     * TODO 添加帖子
     * @param forum
     * @return
     */
    public int addForum(ForumEntity forum) {
        Connection conn = null;
        PreparedStatement ps = null;
        String sql = "insert into forum_info(title,content,create_time,user_id) values(?,?,?,?)";


        System.out.println("添加帖子");
        int i = 0;
        System.out.println(forum.getCreateTime());
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1, forum.getTitle());
            ps.setString(2, forum.getContent());
            ps.setTimestamp(3, forum.getCreateTime());
            ps.setInt(4, forum.getAuthor().getUser_id());
            i = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
        return i;
    }

    /**
     * TODO 根据ID查询某个帖子
     * @param fid
     * @return
     */
    public ForumEntity findForumById(int fid) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        ForumEntity forum = null;
        String sql = "select * from forum_info where fid = ?";
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, fid);
            rs = ps.executeQuery();
            if(rs.next()){
                forum = new ForumEntity();
                forum.setFid(rs.getInt(1));
                forum.setTitle(rs.getString(2));
                forum.setContent(rs.getString(3));
                forum.setCreateTime(rs.getTimestamp(4));
                // TODO 获取对应用户表中的外键
                UserEntity author = new UserEntity();
                author.setUser_id(rs.getInt(5));
                forum.setAuthor(author);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, ps, conn);
        }
        return forum;
    }

    /**
     * TODO 查询帖子对应的所有回复
     * @param fid
     * @return
     */
    public List<ReplyEntity> findReplyList(int fid) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<ReplyEntity> list = new ArrayList<ReplyEntity>();
        // TODO 根据外键作为条件查询当前帖子的所有回复
        String sql = "select * from reply_info where fid = ?";
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, fid);
            rs = ps.executeQuery();
            while(rs.next()){
                ReplyEntity reply = new ReplyEntity();
                reply.setRid(rs.getInt(1));
                reply.setContent(rs.getString(2));
                reply.setReplyTime(rs.getTimestamp(3));
                // TODO 获取对应用户表中的外键
                UserEntity replyUser = new UserEntity();
                replyUser.setUser_id(rs.getInt(4));
                reply.setUser(replyUser);
                list.add(reply);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(rs, ps, conn);
        }
        return list;
    }

    /**
     * TODO 添加回复
     * @param reply
     * @return
     */
    public int addReply(ReplyEntity reply) {
        Connection conn = null;
        PreparedStatement ps = null;
        int i = 0;

        System.out.println("添加回复成功");
        String sql = "insert into reply_info(reply_content,reply_time,user_id,fid) values(?,?,?,?)";
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1, reply.getContent());
            ps.setTimestamp(2, reply.getReplyTime());
            // TODO 将相应的两个外键设值
            ps.setInt(3, reply.getUser().getUser_id());
            ps.setInt(4, reply.getForum().getFid());
           
            i = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
        return i;
    }

    /**
     * TODO 根据用户ID查询用户的所有发帖
     * @param pid
     * @return
     */
    public List<ForumEntity> personForum(int pid){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        String sql = "select * from forum_info where user_id=?";
        System.out.println(sql);
        System.out.println("user_id:" + String.valueOf(pid));
        List<ForumEntity> list = new ArrayList<ForumEntity>();

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, pid);
            rs = ps.executeQuery();

            while (rs.next()) {
                ForumEntity forum = new ForumEntity();
                forum.setFid(rs.getInt(1));
                forum.setTitle(rs.getString(2));
                forum.setContent(rs.getString(3));
                forum.setCreateTime(rs.getTimestamp(4));
                
                UserEntity user = new UserEntity();
                user.setUser_id(rs.getInt(5));
                forum.setAuthor(user);
                list.add(forum);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * TODO 用户删除个人某个帖子
     * @param fid
     */
    public void deleteForum(int fid){
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from forum_info where fid =?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, fid);
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    /**
     * TODO 根据帖子id删除所有回复
     * @param fid
     */
    public void deleteReply(int fid){

        System.out.println(fid);
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from reply_info where fid =?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, fid);

            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    /**
     * TODO 用户删除某个回帖
     * @param rid
     */
    public void deleteReplyByRid(int rid){
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from reply_info where reply_id=?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, rid);

            ps.executeUpdate();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    // TODO 2. 用户管理模块

    /**
     * TODO 删除用户所有发帖
     * @param uid
     */
    public void dUserAllforumByUid(int uid){
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from forum_info where user_id=?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, uid);

            ps.executeUpdate();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    /**
     * TODO 删除用户的所有回帖
     * @param uid
     */
    public void dUserAllreplyByUid(int uid){
        Connection conn = null;
        PreparedStatement ps = null;

        String sql = "delete from reply_info where user_id=?";

        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, uid);

            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }
    }

    /**
     * TODO 删除用户帖子下的所有回帖
     * @param uid
     */
    public void dUserOtherRelyByFid(int uid){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        String sql = "select fid from forum_info where user_id=?";

        List<ForumEntity> fidlist = new ArrayList<ForumEntity>();
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1, uid);
            rs = ps.executeQuery();
            
            while (rs.next()) {
                ForumEntity forum=new ForumEntity();
                forum.setFid(rs.getInt(1));
                fidlist.add(forum);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(null, ps, conn);
        }

        String fsql = "delete from reply_info where fid=?";

        try {
            for (ForumEntity forum : fidlist) {
                conn = DBUtil.getConnection();
                ps = conn.prepareStatement(fsql);
                ps.setInt(1, forum.getFid());

                ps.executeUpdate();
                DBUtil.close(null, ps, conn);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  • service层

实现servlet层调用的方法,对数据库进行增删改查操作。

  • Servlet层

对于分页的实现,我们还需要设置一个pageEntity(分页实体层),其中定义以下变量以及对应的set和get方法

「totalCount」(总记录数)

「totalPage」( 总页数)

「Listlist」(每页的数据list集合)

「currentPage」(当前页码)

「rows」(每页显示的条数)

「startRecord」(每页显示的起始的条数位置)

在该层,通过jsp页面传递的参数,调用相应的方法进行操作。

此处不再给出代码,代码可以见文章底部

3、用户浏览普通帖子功能的实现

3.1 帖子发布和查看以及回复功能系统

  • forumlist.jsp:登录成功后转入该页面
  • ForumListServlet:浏览普通主题帖子的页面,当前页面可以查看各类普通帖子
  • forum.jsp:发表新的普通主题帖子的页面
  • reply.jsp 用于显示帖子的内容及回复该帖的内容
  • replyinfo.jsp 游客模式下,只有查看普通帖子的权限,提示登录使用回复等功能
  • userinfo.jsp 查看帖子的发表作者的信息

帖子的总览图

3.2 用户浏览普通帖子功能的实现

  • 展示所有普通帖子功能的实现

分页功能的实现:

首先确定每页所能容纳帖子的最大数目,在这里我设定MaxNum=5;然后连接数据库查询帖子的总数,从而判断总的页数,即lastPage,接着根据请求的页码pageNum判断出该页码是否合法,若pageNum<1则改正为pageNum=1,若pageNum>lastPage,即所求的页码超出了最大页数,则改正pageNum=lastPage,然后确定要显示的第一个帖子的标识码firstNum和最后一个帖子的标识码lastNum,进而连接数据库将标识码在firstNum和lastNum之间的帖子的信息查询出来,并且对于pageNum=1的情况,不显示“上一页”的标识, 对于pageNum=lastPage的情况,不显示“下一页”的标识。

分页界面的代码实现

<nav class="navbar navbar-default" role="navigation" style="text-align: center">
    <%
        pageContext.setAttribute("pageNum", pageList.getCurrentPage());
        pageContext.setAttribute("startPos", pageList.getStartRecord());
        pageContext.setAttribute("endPos", pageList.getStartRecord() + pageList.getRows());
        pageContext.setAttribute("totalPage", pageList.getTotalPage());
        request.setAttribute("rows", pageList.getRows());
    %>
    <ul class="pagination center">
        <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=1">「首页」</a>
        <%-- TODO 一共只有一页时,没有上一页和下一页这个超链接显示  --%>
        <c:if test="${totalPage == 0}">
            <c:forEach begin="${pageNum}" end="${totalPage}" step="1" var="i">
                <c:if test="${pageNum == i}">
                    「${i+1}」
                </c:if>
            </c:forEach>
        </c:if>
        <c:if test="${totalPage != 0}">
            <%-- TODO 一共只有一页时,没有上一页和下一页这个超链接显示  --%>
            <c:if test="${totalPage == 1}">
                <c:forEach begin="${pageNum}" end="${totalPage}" step="1" var="i">
                    <c:if test="${pageNum == i}">
                        「${i}」
                    </c:if>
                </c:forEach>
            </c:if>
            <c:if test="${totalPage != 1}">
                <%-- TODO 如果当前页为第一页时,就没有上一页这个超链接显示 --%>
                <c:if test="${pageNum == 1}">
                    <c:forEach begin="${pageNum}" end="${totalPage}" step="1" var="i">
                        <c:if test="${pageNum == i}">
                            「${i}」
                        </c:if>
                        <c:if test="${pageNum != i}">
                            <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=${i}">「${i}」</a>
                        </c:if>
                    </c:forEach>
                    <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=${pageNum+1}"
                       aria-label="Next">
                        <span aria-hidden="true" style="font-size: 20px">&raquo;</span>
                    </a>
                </c:if>
                <%-- TODO 如果当前页不是第一页也不是最后一页,则有上一页和下一页这个超链接显示 --%>
                <c:if test="${pageNum > 1 && pageNum < totalPage}">
                    <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=${pageNum-1}"
                       aria-label="Previous">
                        <span aria-hidden="true" style="font-size: 20px">&laquo;</span>
                    </a>
                    <c:forEach begin="${pageNum}" end="${totalPage}" step="1" var="i">
                        <c:if test="${pageNum == i}">
                            「${i}」
                        </c:if>
                        <c:if test="${pageNum != i}">
                            <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=${i}">「${i}」</a>
                        </c:if>
                    </c:forEach>
                    <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=${pageNum+1}"
                       aria-label="Next">
                        <span aria-hidden="true" style="font-size: 20px">&raquo;</span>
                    </a>
                </c:if>
                <%-- TODO 如果当前页是最后一页,则只有上一页这个超链接显示,下一页没有 --%>
                <c:if test="${pageNum == totalPage}">
                    <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=${pageNum-1}"
                       aria-label="Previous">
                        <span aria-hidden="true" style="font-size: 20px">&laquo;</span>
                    </a>
                    <c:forEach begin="${pageNum}" end="${totalPage}" step="1" var="i">
                        <c:if test="${pageNum == i}">
                            「${i}」
                        </c:if>
                        <c:if test="${pageNum != i}">
                            <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=${i}">「${i}」</a>
                        </c:if>
                    </c:forEach>
                </c:if>
            </c:if>
        </c:if>
        <%-- TODO 尾页 --%>
        <a href="${pageContext.request.contextPath}/UPersonPageForumListServlet?uid=${user.user_id}&pageNum=${totalPage}">「尾页」</a>
        </br>
        <button>
            <span style="font-size: 15px ;margin-left: 5px">总帖子数:<%=pageList.getTotalCount()%>条,共<%=pageList.getTotalPage()%>页,当前:第${pageNum}页</span>
        </button>
    </ul>
</nav>

如下图所示:

具体实现逻辑程序代码

通过分页界面传递的参数(uid:用户id,pageNum:当前第几页,rows:每一页显示的帖子条数)进行数据库的查询操作

@WebServlet("/UPersonPageForumListServlet")
public class UPersonPageForumListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String user_id = req.getParameter("uid");
        String currentPage = req.getParameter("pageNum");
        String rows = req.getParameter("rows");
        if (null == currentPage || "".equals(currentPage)) {
            currentPage = "1";
        }
        if (null == rows || "".equals(rows)) {
            rows = "5";             // 每页显示5条数据
        }
        if (user_id == null) {
            int curPage = Integer.parseInt(currentPage);
            int rs = Integer.parseInt(rows);
            String uid = (String)req.getAttribute("uid");
            int pid = Integer.parseInt(uid);
            // TODO 调用service
            PageServiceInf pageService = new PageServiceImpl();
            PageEntity<ForumEntity> pageForumList = pageService.findForumByPage(currentPage, rows, pid);
            req.setAttribute("pageForumList", pageForumList);
            // TODO 转发
            req.getRequestDispatcher("page/user/pageForum.jsp").forward(req, resp);
        } else {
            int curPage = Integer.parseInt(currentPage);
            int rs = Integer.parseInt(rows);
            int pid = Integer.parseInt(user_id);
            // TODO 调用service
            PageServiceInf pageService = new PageServiceImpl();
            PageEntity<ForumEntity> pageForumList = pageService.findForumByPage(currentPage, rows, pid);
            req.setAttribute("pageForumList", pageForumList);
            // TODO 转发
            req.getRequestDispatcher("page/user/pageForum.jsp").forward(req, resp);
        }
    }
}
  • 浏览普通帖子功能的实现

每幅帖子都有三部分组成:标题、时间和发帖者,通过forumlist.jsp页面展示了所有用户发表过的所有普通帖子(按最近时间排序),在此页面可以浏览并通过点击查看帖子详情。

<table class="table table-hover">
    <thead>
    <tr>
        <th>标题</th>
        <th>时间</th>
        <th>发帖人</th>
    </tr>
    </thead>
    <%
        // TODO 从作用域取出帖子列表,进行循环遍历
        List<ForumEntity> list = (List<ForumEntity>)request.getAttribute("forumList");
        if (list == null) {
            out.println("恭喜您是第一个新用户,赶紧去发帖吧!");
        } else {
            for(ForumEntity forum : list) {
    %>
    <tbody>
    <tr>
        <td><a href="ReplyListServlet?fid=<%=forum.getFid()%>"> <%=forum.getTitle()%> </a></td>
        <td><%=forum.getCreateTime()%></td>
        <td><img src="<%=forum.getAuthor().getUser_face() %> " class="img-circle">
            <a href="FindUserByIdServlet?uid=<%=forum.getAuthor().getUser_id()%>"> <%=forum.getAuthor().getUser_name()%> </a></td>
    </tr>
    </tbody>
    <%}}%>
</table>

如下图所示:

具体的逻辑操作:

通过调用findForumList方法查询所有的普通帖子,按照发表时间降序显示在页面中

此处不再给出代码,代码可以见文章底部

4、查看普通帖子详细内容以及实现回复功能

4.1 普通帖子详细内容页面的制作

通过forumlist.jsp页面传递参数fid,然后进行数据库查询获得帖子的详细信息,并查询的所有信息显示在reply.jsp页面上。

reply.jsp页面制作:

<table class="table table-bordered"  >
    <tr class="ttr">
        <td width="95">标题</td>
        <td width="397"><%=forum.getTitle() %></td>
    </tr>
    <tr class="ttr">
        <td><%=forum.getAuthor().getUser_name() %></td>
        <td>发表于&nbsp;&nbsp;<%=forum.getCreateTime() %></td>
    </tr>
    <tr class="ttr">
        <td height="92"><img src="<%=forum.getAuthor().getUser_face() %>" class="img-circle">
        </td>
        <td>&nbsp;<%=forum.getContent() %></td>
    </tr>
    <%
        List<ReplyEntity> replyList = forum.getReplyList();
        for(ReplyEntity reply : replyList){
    %>
    <tr class="ttr">
        <td><%=reply.getUser().getUser_name() %></td>
        <td>回复于&nbsp;&nbsp;<%=reply.getReplyTime() %></td>
    </tr>
    <tr class="ttr">
        <td height="101" class="td1"> <img src="<%=reply.getUser().getUser_face() %>" class="img-circle">
        </td>
        <td class="td2">&nbsp;<%=reply.getContent() %>
        </td>
    </tr>
    <%} %>
</table>

如下图所示:

同时也可以查看发帖人的信息

具体的逻辑操作

通过ForumEntity对象的调用findReplyList()方法

此处不再给出代码,代码可以见文章底部

4.2 普通帖子回帖功能的实现

在reply.jsp 页面里实现回复功能,让用户可以在同一页面实现浏览贴子、回复帖子和浏览别人回复的帖子的功能:

  • reply.jsp页面中回复功能:

此部分代码的实现:

显示该帖子的内容,并给用户提供了一个回帖按钮,点此按钮便可链接到其他页面(回复人就是当前登录的用户),同时也设置了一个「返回」按钮

如下图所示:

回帖前:

回帖后:

游客模式下,需要登录之后才可以回复帖子

  • 回帖信息的逻辑实现:

通过获取回复页面的回帖信息(回帖内容,回帖时间,回帖人)以及回复的帖子的fid(id)参数,调用createReply()方法,回复的所有信息都保存在数据库中,

此处不再给出代码,代码可以见文章底部

5、用户帖子发布、搜索功能页面的实现

此处开始不再展示代码

5.1 帖子发布

在forumlist.jsp页面的底部,设置了发表框,实现了帖子发布的功能。通过该页面传递过来的title、content和user参数,分别代表帖子标题、帖子内容、帖子发表用户,并获取到发表的时间信息,进而到数据库中实现回帖信息的保存。在home.jsp页面即主页也可以进行发表帖子的功能,实现逻辑是一样的。

具体的逻辑操作实现:

通过调用ForumEntity对象对应的各个set方法,将帖子的相关信息保存起来,接着调用createForum()方法创建一条帖子。

帖子发表后页面重定向到ForumListServlet对应的普通帖子展示页面

如下图所示:

5.2 搜索普通帖子

该功能实现的是模糊搜索的功能,通过在pageForum.jsp中设置了一个搜索框,实现了模糊查询当前登录用户的所有普通帖子的功能。传递搜索框中的关键词,再到数据库中实现查询和展示。

通过关键字查找对帖子的标题,查询到的结果会通过myForumWithKeyWord.jsp界面显示,该页面的设计和pageForum.jsp相差无几。

如下图所示:

6、用户删除普通帖子回帖系统

对于preplyinfo.jsp页面,当前主帖下的所有回帖,均设置有一个“删除回帖”按钮,通过该页面传递的rid(帖子标识符)参数,再到数据库中实现删除的逻辑操作。

具体的逻辑操作就是:

通过调用deleteReplyByRid()方法,传入帖子id,同时删帖操作需要考虑帖子的发表作者是不是当前登录用户本身,只有帖子是当前登录用户本身,才可以实现删除操作,否则,页面不会提供删帖的按钮。当然,管理员用户是可以删除任意帖子的,这个在后面有关用户管理的文章再讲。删除成功是会有提示功能的。

执行删帖操作之后,页面会跳转到帖子列表界面,此时删除的帖子就不在展示了,也可以通过模糊搜索的方式进行验证。

如下图所示:

7、项目代码

  • GitHub
  • Gitee