校园论坛(Java)—— 帖子模块
文章目录
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();
}
}
}
- Servlet层
对于分页的实现,我们还需要设置一个pageEntity(分页实体层),其中定义以下变量以及对应的set和get方法
「totalCount」(总记录数)
「totalPage」( 总页数)
「List list」(每页的数据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">»</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">«</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">»</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">«</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>发表于 <%=forum.getCreateTime() %></td>
</tr>
<tr class="ttr">
<td height="92"><img src="<%=forum.getAuthor().getUser_face() %>" class="img-circle">
</td>
<td> <%=forum.getContent() %></td>
</tr>
<%
List<ReplyEntity> replyList = forum.getReplyList();
for(ReplyEntity reply : replyList){
%>
<tr class="ttr">
<td><%=reply.getUser().getUser_name() %></td>
<td>回复于 <%=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"> <%=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、项目代码
本文来自博客园,作者:{WHYBIGDATA},转载请注明原文链接:https://www.cnblogs.com/shadowlim/p/17051740.html