基于SSH框架的小型论坛项目  

  一、项目入门  传送门

  二、框架整合  传送门

  三、用户模块  传送门

  四、页面显示  传送门

  五、帖子模块  传送门

  六、点赞模块  传送门

  七、辅助模块  传送门

回复帖子

  分析回复帖子

  拿到paste.title标签

                                        <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
<s:property value="#paste.title" />
</a>

  编写查看帖子模型驱动

  帖子模型驱动Web层

    //查看帖子详细信息
public String getDetail() throws Exception{ Paste paste = pasteService.findAllPasteByIdReturnPaste(pasteid); ActionContext.getContext().put("paste", paste); return "detail";
}

  帖子模型驱动Service层

    public Paste findAllPasteByIdReturnPaste(String pasteid) {

        return pasteDao.findPasteByIdReturnPaste(pasteid);
}

  帖子模板Dao层

    public Paste findPasteByIdReturnPaste(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from paste where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Paste.class);
query.setParameter(1, pasteid);
Paste result = (Paste) query.uniqueResult();
return result;
}

  帖子前端页面

  

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description"
content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body>
<iframe src="head.html" scrolling="no" width="100%" height="65px" ></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box">
<h1>帖子标题</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span><span class="jie-admin"> <a
href="">点击置顶</a> </span> <span
class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
</span> <span class="jie-admin" type="del" style="margin-left: 20px;">
<a>删除该帖</a> </span>
</span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i> 2
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img
src="res/images/uer.jpg" alt="头像"> <cite> 压缩
<em>2017-05-01发布</em> </cite> </a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin"><a
href="#">已完帖,无法编辑</a> </span> <span
class="layui-btn layui-btn-mini jie-admin" type="collect"
data-type="add"> <a id="collectPost">收藏</a> </span> <span
class="layui-btn layui-btn-mini jie-admin layui-btn-danger"
type="collect" data-type="add"> <a>取消收藏</a> </span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>帖子内容</p>
</div>
</div>
<div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<li data-id="12" class="jieda-daan"><a
name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img
src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i>
<!-- <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em> --> </cite> </a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i
class="iconfont icon-zan"></i><em>12</em>
</span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div> -->
</div></li>
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img
src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i>
<em style="color:#FF9E3F">活雷锋</em> </cite> </a>
<div class="detail-hits">
<span>刚刚</span>
</div>
</div>
<div class="detail-body jieda-body">
<p>蓝瘦</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i
class="iconfont icon-zan"></i><em>0</em>
</span>
<div class="jieda-admin">
<span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
<span class="jieda-accept" type="accept">
<a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</div>
</div></li> <!-- <li class="fly-none">没有任何回答</li> -->
</ul>
<span
id="toName">@ 压缩(楼主)</span>
<div class="layui-form layui-form-pane">
<form action="">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required
lay-verify="required" placeholder="我要回答"
class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
767</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
767</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
767</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
767</span>
</dd>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
</dl>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [
'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold', 'italic', 'underline',
'removeformat', 'justifyleft', 'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link']
});
</script>
</body>
</html>

detail.html

  动态从数据库中获取帖子模块内容

                <div class="fly-panel detail-box">

                    <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span>
<span class="jie-admin">
<a href="">点击置顶</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin">
<a href="">取消置顶</a>
</span>
<span class="jie-admin" type="del" style="margin-left: 20px;">
<a>删除该帖</a>
</span>
</span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像">
<cite>
<s:property value="#paste.user.username" />
<em>
<s:property value="#paste.createtime" />
发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin">
<a href="#">已完帖,无法编辑</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add">
<a id="collectPost">收藏</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add">
<a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div>

  

  Web层

package com.Gary.web;

import java.text.SimpleDateFormat;
import java.util.Date; import com.Gary.domain.Paste;
import com.Gary.domain.User;
import com.Gary.service.PasteService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class PasteAction extends ActionSupport implements ModelDriven<Paste> { public Paste paste = new Paste();
private PasteService pasteService;
private String pasteid; //查看帖子详细信息
public String getDetail() throws Exception{ Paste paste = pasteService.findAllPasteByIdReturnPaste(pasteid); ActionContext.getContext().put("paste", paste); return "detail";
} //添加帖子
public String addPaste() throws Exception {
User user = (User)ActionContext.getContext().getSession().get("user"); if(user==null)
{
ActionContext.getContext().put("error", "只有登陆之后才可以发帖子!!");
return "error";
} //private Integer ansnum;
paste.setAnsnum(0);
//private String createtime;
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String createtime = format.format(date);
paste.setCreatetime(createtime);
//private Integer glanceover;
paste.setGlanceover(0);
//是否结帖 0未结 1结束
//private Integer solve;
paste.setSolve(0);
//private Integer isdelete;
paste.setIsdelete(0);
//private User user; paste.setUser(user); pasteService.addPaste(paste); //重定向到主页
return "toIndex";
} public PasteService getPasteService() {
return pasteService;
} public void setPasteService(PasteService pasteService) {
this.pasteService = pasteService;
} @Override
public Paste getModel() {
// TODO Auto-generated method stub
return paste;
} public String getPasteid() {
return pasteid;
} public void setPasteid(String pasteid) {
this.pasteid = pasteid;
} }

PasteAction.java

  Service层

package com.Gary.service;

import java.util.List;

import com.Gary.dao.PasteDao;
import com.Gary.domain.Paste;
import com.Gary.utils.PageBean; public class PasteService { private PasteDao pasteDao; public Paste findAllPasteByIdReturnPaste(String pasteid) { return pasteDao.findPasteByIdReturnPaste(pasteid);
} public PageBean getGlanceoverPageBean(Integer currentPage) {
Integer totalCount = pasteDao.findAllPasteNum();
PageBean glanceoverPageBean = new PageBean(currentPage, totalCount, 8);
List<Paste> list = pasteDao.getGlanceoverPageList();
glanceoverPageBean.setList(list); return glanceoverPageBean;
} public PageBean getPastePageBean(Integer currentPage) { Integer totalCount = pasteDao.findAllPasteNum();
PageBean pageBean = new PageBean(currentPage,totalCount,8);
List<Paste> list = pasteDao.getPastePageList(pageBean.getStart(),pageBean.getPageSize());
pageBean.setList(list); return pageBean;
} public PasteDao getPasteDao() {
return pasteDao;
} public List<Paste> findAllPaste() { return pasteDao.findAllPaste(); } public void setPasteDao(PasteDao pasteDao) {
this.pasteDao = pasteDao;
} public void addPaste(Paste paste) { pasteDao.addPaste(paste); } public PageBean getAnsnumPageBean(Integer currentPage) {
//获得所有的帖子数目
Integer totalCount = pasteDao.findAllPasteNum();
//创建PageBean
PageBean ansnumPageBean = new PageBean(currentPage, totalCount, 8);
//得到List
List<Paste> list = pasteDao.getAnsnumPageList();
//封装List
ansnumPageBean.setList(list);
return ansnumPageBean;
} }

PasteService.java

  Dao层

package com.Gary.dao;

import java.math.BigInteger;
import java.util.List; import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.Paste; public class PasteDao extends HibernateDaoSupport{ public void addPaste(Paste paste) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
session.save(paste);
} //HQL
public List<Paste> findAllPaste() { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); //书写SQL语句
String hql = "from com.Gary.domain.Paste";
Query query = session.createQuery(hql); List<Paste> list = query.list(); return list;
} //查找所有帖子的数量
public Integer findAllPasteNum() {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select count(*) from paste";
NativeQuery query = session.createSQLQuery(sql);
BigInteger result = (BigInteger)query.uniqueResult(); return result.intValue();
} //分页
public List<Paste> getPastePageList(Integer start, Integer pageSize) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from paste limit ?,?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Paste.class);
query.setParameter(1, start);
query.setParameter(2, pageSize);
List<Paste> list = query.list(); return list;
} //最近热议
public List<Paste> getGlanceoverPageList() {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from paste order by glanceover desc limit 0,8";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Paste.class);
List list = query.list();
return list;
} public List<Paste> getAnsnumPageList() {
//得到与当前线程绑定的session
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
//书写sql
String sql = "select * from paste order by ansnum desc limit 0,8";
//获得query
NativeQuery query = session.createSQLQuery(sql);
//将结果集封装为Paste对象
query.addEntity(Paste.class);
//获得sql的执行结果(结果为list)
List list = query.list();
return list;
} //查看帖子
public Paste findPasteByIdReturnPaste(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from paste where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Paste.class);
query.setParameter(1, pasteid);
Paste result = (Paste) query.uniqueResult();
return result;
} }

PasteDao.java

  帖子模块前端页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body style="margin: -2px">
<iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box"> <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span>
<span class="jie-admin">
<a href="">点击置顶</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin">
<a href="">取消置顶</a>
</span>
<span class="jie-admin" type="del" style="margin-left: 20px;">
<a>删除该帖</a>
</span>
</span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像">
<cite>
<s:property value="#paste.user.username" />
<em>
<s:property value="#paste.createtime" />
发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin">
<a href="#">已完帖,无法编辑</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add">
<a id="collectPost">收藏</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add">
<a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div> <div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em> -->
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div> -->
</div></li>
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i> <em style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span>刚刚</span>
</div>
</div>
<div class="detail-body jieda-body">
<p>蓝瘦</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em> </span>
<div class="jieda-admin">
<span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</div>
</div></li> <!-- <li class="fly-none">没有任何回答</li> -->
</ul>
<span id="toName">@ 压缩(楼主)</span>
<div class="layui-form layui-form-pane">
<form action="">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i> 767</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i> 767</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i> 767</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i> 767</span>
</dd>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
</dd>
</dl>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
</body>
</html>

detail.jsp

  当浏览一个帖子时,帖子的浏览数目需要+1  (数据库中glanceover+1)

  Service层中findAllPasteByIdReturnPaste()编写传送数据到Dao层修改数据库中glanceover语句

    public Paste findAllPasteByIdReturnPaste(String pasteid) {

        pasteDao.addPasteGlanceover(pasteid);
//SQL语句写法:update paste set glanceover = glanceover+1 where id = ?; return pasteDao.findPasteByIdReturnPaste(pasteid);
}

  帖子回复glanceover+1

public void addPasteGlanceover(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "update paste set glanceover = glanceover+1 where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.setParameter(1, pasteid);
query.executeUpdate();
}

package com.Gary.service;

import java.util.List;

import com.Gary.dao.PasteDao;
import com.Gary.domain.Paste;
import com.Gary.utils.PageBean; public class PasteService { private PasteDao pasteDao; public Paste findAllPasteByIdReturnPaste(String pasteid) { pasteDao.addPasteGlanceover(pasteid);
//SQL语句写法:update paste set glanceover = glanceover+1 where id = ?; return pasteDao.findPasteByIdReturnPaste(pasteid);
} public PageBean getGlanceoverPageBean(Integer currentPage) {
Integer totalCount = pasteDao.findAllPasteNum();
PageBean glanceoverPageBean = new PageBean(currentPage, totalCount, 8);
List<Paste> list = pasteDao.getGlanceoverPageList();
glanceoverPageBean.setList(list); return glanceoverPageBean;
} public PageBean getPastePageBean(Integer currentPage) { Integer totalCount = pasteDao.findAllPasteNum();
PageBean pageBean = new PageBean(currentPage,totalCount,8);
List<Paste> list = pasteDao.getPastePageList(pageBean.getStart(),pageBean.getPageSize());
pageBean.setList(list); return pageBean;
} public PasteDao getPasteDao() {
return pasteDao;
} public List<Paste> findAllPaste() { return pasteDao.findAllPaste(); } public void setPasteDao(PasteDao pasteDao) {
this.pasteDao = pasteDao;
} public void addPaste(Paste paste) { pasteDao.addPaste(paste); } public PageBean getAnsnumPageBean(Integer currentPage) {
//获得所有的帖子数目
Integer totalCount = pasteDao.findAllPasteNum();
//创建PageBean
PageBean ansnumPageBean = new PageBean(currentPage, totalCount, 8);
//得到List
List<Paste> list = pasteDao.getAnsnumPageList();
//封装List
ansnumPageBean.setList(list);
return ansnumPageBean;
} }

PasteService.java

package com.Gary.dao;

import java.math.BigInteger;
import java.util.List; import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.Paste; public class PasteDao extends HibernateDaoSupport{ public void addPaste(Paste paste) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
session.save(paste);
} //HQL
public List<Paste> findAllPaste() { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); //书写SQL语句
String hql = "from com.Gary.domain.Paste";
Query query = session.createQuery(hql); List<Paste> list = query.list(); return list;
} //查找所有帖子的数量
public Integer findAllPasteNum() {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select count(*) from paste";
NativeQuery query = session.createSQLQuery(sql);
BigInteger result = (BigInteger)query.uniqueResult(); return result.intValue();
} //分页
public List<Paste> getPastePageList(Integer start, Integer pageSize) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from paste limit ?,?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Paste.class);
query.setParameter(1, start);
query.setParameter(2, pageSize);
List<Paste> list = query.list(); return list;
} //最近热议
public List<Paste> getGlanceoverPageList() {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from paste order by glanceover desc limit 0,8";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Paste.class);
List list = query.list();
return list;
} public List<Paste> getAnsnumPageList() {
//得到与当前线程绑定的session
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
//书写sql
String sql = "select * from paste order by ansnum desc limit 0,8";
//获得query
NativeQuery query = session.createSQLQuery(sql);
//将结果集封装为Paste对象
query.addEntity(Paste.class);
//获得sql的执行结果(结果为list)
List list = query.list();
return list;
} //查看帖子
public Paste findPasteByIdReturnPaste(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from paste where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Paste.class);
query.setParameter(1, pasteid);
Paste result = (Paste) query.uniqueResult();
return result;
} //帖子回复glanceover+1
public void addPasteGlanceover(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "update paste set glanceover = glanceover+1 where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.setParameter(1, pasteid);
query.executeUpdate();
} }

PasteDao.java

  为了尽可能少的访问数据,利用数据持久状态

    public Paste findPasteByIdReturnPaste(String pasteid) {

        //pasteDao.addPasteGlanceover(pasteid);
//数据库SQL语句:update paste set glanceover = glanceover+1 where id = ?;
Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
paste.setGlanceover(paste.getGlanceover()+1);
return paste;
}

  编写帖子模块最近热帖和最近热议

  帖子模块的最近热帖和最近热议应该动态从数据库中获取

  PasteAction.java

 //查看帖子详细信息
public String getDetail() throws Exception{ //得到最近热帖
PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(null);
ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean); //得到最近热议
PageBean ansnumPageBean = pasteService.getAnsnumPageBean(null);
ActionContext.getContext().put("ansnumPageBean", ansnumPageBean); Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
ActionContext.getContext().put("paste", paste); return "detail";
}

  修改detail.jsp

        <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
<s:property value="#paste.title" />
</a>
<span>
<i class="iconfont"></i>
<s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
<s:property value="#paste.title" />
</a>
<span>
<i class="iconfont"></i>
<s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>

  Web层

package com.Gary.web;

import java.util.List;

import com.Gary.domain.Paste;
import com.Gary.service.PasteService;
import com.Gary.service.UserService;
import com.Gary.utils.PageBean;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class GetDataAction extends ActionSupport{ private PasteService pasteService;
private UserService userService;
public UserService getUserService() {
return userService;
} public void setUserService(UserService userService) {
this.userService = userService;
} private Integer currentPage; public String getData() throws Exception { //得到帖子
PageBean pastePageBean = pasteService.getPastePageBean(currentPage);
ActionContext.getContext().put("pastePageBean", pastePageBean); //得到最近热帖
PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(currentPage);
ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean); //得到最近热议
PageBean ansnumPageBean = pasteService.getAnsnumPageBean(currentPage);
ActionContext.getContext().put("ansnumPageBean", ansnumPageBean); //得到专家排行
PageBean userPageBean = userService.getUserPageBean(currentPage);
ActionContext.getContext().put("userPageBean", userPageBean); return "index";
} public PasteService getPasteService() {
return pasteService;
} public void setPasteService(PasteService pasteService) {
this.pasteService = pasteService;
} public Integer getCurrentPage() {
return currentPage;
} public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
}

GetDataAction.java

package com.Gary.web;

import java.text.SimpleDateFormat;
import java.util.Date; import com.Gary.domain.Paste;
import com.Gary.domain.User;
import com.Gary.service.PasteService;
import com.Gary.utils.PageBean;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class PasteAction extends ActionSupport implements ModelDriven<Paste> { public Paste paste = new Paste();
private PasteService pasteService;
private String pasteid; //查看帖子详细信息
public String getDetail() throws Exception{ //得到最近热帖
PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(null);
ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean); //得到最近热议
PageBean ansnumPageBean = pasteService.getAnsnumPageBean(null);
ActionContext.getContext().put("ansnumPageBean", ansnumPageBean); Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
ActionContext.getContext().put("paste", paste); return "detail";
} //添加帖子
public String addPaste() throws Exception {
User user = (User)ActionContext.getContext().getSession().get("user"); if(user==null)
{
ActionContext.getContext().put("error", "只有登陆之后才可以发帖子!!");
return "error";
} //private Integer ansnum;
paste.setAnsnum(0);
//private String createtime;
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String createtime = format.format(date);
paste.setCreatetime(createtime);
//private Integer glanceover;
paste.setGlanceover(0);
//是否结帖 0未结 1结束
//private Integer solve;
paste.setSolve(0);
//private Integer isdelete;
paste.setIsdelete(0);
//private User user; paste.setUser(user); pasteService.addPaste(paste); //重定向到主页
return "toIndex";
} public PasteService getPasteService() {
return pasteService;
} public void setPasteService(PasteService pasteService) {
this.pasteService = pasteService;
} @Override
public Paste getModel() {
// TODO Auto-generated method stub
return paste;
} public String getPasteid() {
return pasteid;
} public void setPasteid(String pasteid) {
this.pasteid = pasteid;
} }

PasteAction.java

  前端页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body style="margin: -2px">
<iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box"> <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span>
<span class="jie-admin">
<a href="">点击置顶</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin">
<a href="">取消置顶</a>
</span>
<span class="jie-admin" type="del" style="margin-left: 20px;">
<a>删除该帖</a>
</span>
</span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像">
<cite>
<s:property value="#paste.user.username" />
<em>
<s:property value="#paste.createtime" />
发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin">
<a href="#">已完帖,无法编辑</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add">
<a id="collectPost">收藏</a>
</span>
<span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add">
<a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div> <div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em> -->
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div> -->
</div></li>
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i> <em style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span>刚刚</span>
</div>
</div>
<div class="detail-body jieda-body">
<p>蓝瘦</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em> </span>
<div class="jieda-admin">
<span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</div>
</div></li> <!-- <li class="fly-none">没有任何回答</li> -->
</ul>
<span id="toName">@ 压缩(楼主)</span>
<div class="layui-form layui-form-pane">
<form action="">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
<s:property value="#paste.title" />
</a>
<span>
<i class="iconfont"></i>
<s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
<s:property value="#paste.title" />
</a>
<span>
<i class="iconfont"></i>
<s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>
</div>
</div> <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
</body>
</html>

detail.jsp

分析回复帖子模块

  创建回复帖子Action骨架

public class AnswerAction extends ActionSupport implements ModelDriven<Answer>{

    public Answer answer = new Answer();
private AnswerService answerService; public String addAnswer() throws Exception { answerService.addAnswer(answer); return "success";
} public Answer getModel() { return answer;
} }

  完成Answer实体

    private String id;
//内容
private String content;
//回复时间
private String anstime;
//同意数
private Integer agree;
//是否解决
private Integer solve; private User user; private Paste paste; //登录的用户是否点赞了改回复
private Integer loginUserIsAgree;
package com.Gary.domain;

public class Answer {

    private String id;
//内容
private String content;
//回复时间
private String anstime;
//同意数
private Integer agree;
//是否解决
private Integer solve; private User user; private Paste paste; //登录的用户是否点赞了改回复
private Integer loginUserIsAgree; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content.replaceAll("<br />", ".");;
}
public String getAnstime() {
return anstime;
}
public void setAnstime(String anstime) {
this.anstime = anstime;
}
public Integer getAgree() {
return agree;
}
public void setAgree(Integer agree) {
this.agree = agree;
}
public Integer getSolve() {
return solve;
}
public void setSolve(Integer solve) {
this.solve = solve;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Paste getPaste() {
return paste;
}
public void setPaste(Paste paste) {
this.paste = paste;
}
public Integer getLoginUserIsAgree() {
return loginUserIsAgree;
}
public void setLoginUserIsAgree(Integer loginUserIsAgree) {
this.loginUserIsAgree = loginUserIsAgree;
} }

Answer.java

  Web层

package com.Gary.web;

import com.Gary.domain.Answer;
import com.Gary.service.AnswerService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class AnswerAction extends ActionSupport implements ModelDriven<Answer>{ public Answer answer = new Answer();
private AnswerService answerService; public String addAnswer() throws Exception { answerService.addAnswer(answer); return "success";
} public Answer getModel() { return answer;
} }

AnswerAction.java

  Service层

package com.Gary.service;

import com.Gary.dao.AnswerDao;
import com.Gary.domain.Answer; public class AnswerService { private AnswerDao answerDao; public AnswerDao getAnswerDao() {
return answerDao;
} public void setAnswerDao(AnswerDao answerDao) {
this.answerDao = answerDao;
} public void addAnswer(Answer answer) {
// TODO Auto-generated method stub
answerDao.addAnswer(answer);
} }

AnswerService.java

  Dao层

package com.Gary.dao;

import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.Answer; public class AnswerDao extends HibernateDaoSupport{ public void addAnswer(Answer answer) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
session.save(answer);
} }

AnswerDao.java

  User.java用户模块中添加一个用户回复Set<Paste> answerPasteSet

    //用户回复
private Set<Paste> answerPasteSet = new HashSet<Paste>(); public Set<Paste> getAnswerPasteSet() {
return answerPasteSet;
}
public void setAnswerPasteSet(Set<Paste> answerPasteSet) {
this.answerPasteSet = answerPasteSet;
}

  在User.hbm.xml中添加一对多的关系

        <set name="answerPasteSet">
<key column="pasteid"></key>
<one-to-many class="Answer"/>
</set>

  分析用户帖子一对多的关系

  在Paste.java中添加HashSet<User>用户回复

    private Set<User> userAnswerSet = new HashSet<User>();

    public Set<User> getUserAnswerSet() {
return userAnswerSet;
}
public void setUserAnswerSet(Set<User> userAnswerSet) {
this.userAnswerSet = userAnswerSet;
}

  Paste.hbm.xml中绑定用户与表一对多的关系

     <set name="userAnswerSet">
<!-- 外键的类名 -->
<key column="userid"></key>
<!-- 外键的类名的类 -->
<one-to-many class="Answer"/>
</set>

  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.Gary.domain"> <class name="Answer" table="answer">
<id name="id">
<generator class="uuid"></generator>
</id> <property name="content" column="content"></property>
<property name="anstime" column="anstime"></property>
<property name="agree" column="agree"></property>
<property name="solve" column="solve"></property> <many-to-one name="user" column="userid" class="User"></many-to-one>
<!-- colum为外键的字段名字 -->
<many-to-one name="paste" column="pasteid" class="Paste"></many-to-one> </class>
</hibernate-mapping>

Answer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.Gary.domain">
<class name="Paste" table="paste">
<id name="id">
<generator class="uuid"></generator>
</id> <!--private String title;
private String content;
private Integer offer;
private Integer ansnum;
private String createtime;
private Integer glanceover;
//是否结帖
private Integer solve;
private Integer isdelete;--> <property name="title" column="title"></property>
<property name="content" column="content"></property>
<property name="offer" column="offer"></property>
<property name="ansnum" column="ansnum"></property>
<property name="createtime" column="createtime"></property>
<property name="glanceover" column="glanceover"></property>
<property name="solve" column="solve"></property>
<property name="isdelete" column="isdelete"></property> <many-to-one name="user" class="User" column="userid" insert="true"></many-to-one> <set name="userAnswerSet">
<!-- 外键的类名 -->
<key column="userid"></key>
<!-- 外键的类名的类 -->
<one-to-many class="Answer"/>
</set> </class>
</hibernate-mapping>

Paste.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.Gary.domain"> <class name="Answer" table="answer">
<id name="id">
<generator class="uuid"></generator>
</id> <property name="content" column="content"></property>
<property name="anstime" column="anstime"></property>
<property name="agree" column="agree"></property>
<property name="solve" column="solve"></property> <many-to-one name="user" column="userid" class="User"></many-to-one>
<!-- colum为外键的字段名字 -->
<many-to-one name="paste" column="pasteid" class="Paste"></many-to-one> </class>
</hibernate-mapping>

Answer.hbm.xml

  此时点击提交回答按钮后表单无法发送问题!!!

  修改detail中的表单

<div class="layui-form layui-form-pane">
<!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form> -->
<form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
</div>
</div> </div> <div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>

  可以看到,修改完表单后,在未登录的轻快下,点击提交回答按钮后页面会自动跳转到登陆页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body style="margin: -2px">
<iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box"> <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
</span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
</span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
</span> </span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
</span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
</span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div> <div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em> -->
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div> -->
</div></li>
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i> <em style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span>刚刚</span>
</div>
</div>
<div class="detail-body jieda-body">
<p>蓝瘦</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em> </span>
<div class="jieda-admin">
<span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</div>
</div></li> <!-- <li class="fly-none">没有任何回答</li> -->
</ul>
<span id="toName">@ 压缩(楼主)</span>
<div class="layui-form layui-form-pane">
<!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form> -->
<form action="${pageContext.request.contextPath}/PasteAction_addPaste">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
</div>
</div> </div> <div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>
</div>
</div> <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script> --%>
<script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'content',
resizeMode : 1,
cssPath : './index.css',
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
<script>
layui.cache.page = '';
layui.cache.user = {
username : '游客',
uid : -1,
avatar : '../res/images/avatar/00.jpg',
experience : 83,
sex : '男'
};
layui.config({
version : "2.0.0",
base : '../res/mods/'
}).extend({
fly : 'index'
}).use('fly');
</script>
</body>
</html>

detail.jsp

  测试登陆用户发帖模块

  

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body style="margin: -2px">
<iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box"> <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
</span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
</span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
</span> </span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
</span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
</span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div> <div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em> -->
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div> -->
</div></li>
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i> <em style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span>刚刚</span>
</div>
</div>
<div class="detail-body jieda-body">
<p>蓝瘦</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em> </span>
<div class="jieda-admin">
<span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</div>
</div></li> <!-- <li class="fly-none">没有任何回答</li> -->
</ul>
<span id="toName">@ 压缩(楼主)</span>
<div class="layui-form layui-form-pane">
<!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form> -->
<form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
</div>
</div> </div> <div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>
</div>
</div> <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script> --%>
<script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'content',
resizeMode : 1,
cssPath : './index.css',
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
<script>
layui.cache.page = '';
layui.cache.user = {
username : '游客',
uid : -1,
avatar : '../res/images/avatar/00.jpg',
experience : 83,
sex : '男'
};
layui.config({
version : "2.0.0",
base : '../res/mods/'
}).extend({
fly : 'index'
}).use('fly');
</script>
</body>
</html>

detail.jsp

  此时发现跳转过来的页面全部问题、最近热帖、最近热议、专家排行榜都是空的白的,接下来需要实现重定向到Action

  添加addAnswer()请求,如果用户成功回复,则返回"toDetail“

    public String addAnswer() throws Exception {    

        User user =    (User) ActionContext.getContext().getSession().get("user");
if(user == null)
{
ActionContext.getContext().put("error", "未登录不能回复!!");
return "error";
} // //回复时间
// private String anstime;
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String anstime = format.format(date);
answer.setAnstime(anstime);
// //同意数
// private Integer agree;
answer.setAgree(0);
// //是否解决
// private Integer solve;
answer.setSolve(0);
//
// private User user;
answer.setUser(user);
//
// private Paste paste;
Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
answer.setPaste(paste); answerService.addAnswer(answer,paste);
answerService.addAnswer(answer); return "toDetail";
}

  在struts.xml中配置toDetail结果集成重定向到action中

    <action name="AnswerAction_*" class="com.Gary.web.AnswerAction" method="{1}">
<result name="error">/login.jsp</result>
<!-- 重定向到Action -->
<result name="toDetail" type="redirectAction">
<param name="actionName">PasteAction_getDetail</param>
<!-- struts不认识pasteid则会封装到重定向的action中 -->
<param name="pasteid">${pasteid}</param>
</result>
</action>
</package>

package com.Gary.web;

import java.text.SimpleDateFormat;
import java.util.Date;
import com.Gary.domain.Answer;
import com.Gary.domain.Paste;
import com.Gary.domain.User;
import com.Gary.service.AnswerService;
import com.Gary.service.PasteService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class AnswerAction extends ActionSupport implements ModelDriven<Answer>{ public Answer answer = new Answer();
private AnswerService answerService;
private String pasteid;
private PasteService pasteService; public AnswerService getAnswerService() {
return answerService;
} public void setAnswerService(AnswerService answerService) {
this.answerService = answerService;
} public PasteService getPasteService() {
return pasteService;
} public void setPasteService(PasteService pasteService) {
this.pasteService = pasteService;
} public String getPasteid() {
return pasteid;
} public void setPasteid(String pasteid) {
this.pasteid = pasteid;
} public String addAnswer() throws Exception { User user = (User) ActionContext.getContext().getSession().get("user");
if(user == null)
{
ActionContext.getContext().put("error", "未登录不能回复!!");
return "error";
} // //回复时间
// private String anstime;
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String anstime = format.format(date);
answer.setAnstime(anstime);
// //同意数
// private Integer agree;
answer.setAgree(0);
// //是否解决
// private Integer solve;
answer.setSolve(0);
//
// private User user;
answer.setUser(user);
//
// private Paste paste;
Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
answer.setPaste(paste); answerService.addAnswer(answer,paste);
answerService.addAnswer(answer); return "toDetail";
} public Answer getModel() { return answer;
} }

AnswerAction.java

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--开启动态方法调用 -->
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- 告诉struts不用自己创建Action,Spring来帮你创建 -->
<constant name="struts.objectFactory" value="spring"></constant>
<package name="Gary_SSHForum" namespace="/" extends="struts-default">
<!-- 允许全部方法 -->
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="UserAction_*" class="com.Gary.web.UserAction" method="{1}">
<result name="toLogin" type="redirect">/login.jsp</result>
<result name="login">/login.jsp</result>
<result name="toIndex" type="redirect">/default.jsp</result>
<result name="error">/login.jsp</result>
<result name="toRegisterSuccess" type="redirect">/registerSuccess.jsp</result>
</action> <action name="PasteAction_*" class="com.Gary.web.PasteAction" method="{1}">
<!-- 从定向到jsp -->
<result name="toIndex" type="redirect">/default.jsp</result>
<result name="error">/login.jsp</result>
<!-- 转发到jsp -->
<result name="detail">/detail.jsp</result>
</action> <action name="GetDataAction_*" class="com.Gary.web.GetDataAction" method="{1}">
<result name="index" >/index.jsp</result>
</action>
<action name="AnswerAction_*" class="com.Gary.web.AnswerAction" method="{1}">
<result name="error">/login.jsp</result>
<!-- 重定向到Action -->
<result name="toDetail" type="redirectAction">
<param name="actionName">PasteAction_getDetail</param>
<!-- struts不认识pasteid则会封装到重定向的action中 -->
<param name="pasteid">${pasteid}</param>
</result>
</action>
</package> </struts>

struts.xml

查看所有回复

  分析查看回复

  Web层

package com.Gary.web;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List; import com.Gary.domain.Answer;
import com.Gary.domain.Paste;
import com.Gary.domain.User;
import com.Gary.service.AnswerService;
import com.Gary.service.PasteService;
import com.Gary.utils.PageBean;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class PasteAction extends ActionSupport implements ModelDriven<Paste> { public Paste paste = new Paste();
private String pasteid; private PasteService pasteService;
private AnswerService answerService; //查看帖子详细信息
public String getDetail() throws Exception{ //得到最近热帖
PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(null);
ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean); //得到最近热议
PageBean ansnumPageBean = pasteService.getAnsnumPageBean(null);
ActionContext.getContext().put("ansnumPageBean", ansnumPageBean); //获得帖子
Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
ActionContext.getContext().put("paste", paste); //获得该帖子的所有回复
List<Answer> answerList = answerService.findAllAnswerByPasteid(pasteid);
ActionContext.getContext().put("answerList", answerList); return "detail";
} public AnswerService getAnswerService() {
return answerService;
} public void setAnswerService(AnswerService answerService) {
this.answerService = answerService;
} //添加帖子
public String addPaste() throws Exception {
User user = (User)ActionContext.getContext().getSession().get("user"); if(user==null)
{
ActionContext.getContext().put("error", "只有登陆之后才可以发帖子!!");
return "error";
} //private Integer ansnum;
paste.setAnsnum(0);
//private String createtime;
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String createtime = format.format(date);
paste.setCreatetime(createtime);
//private Integer glanceover;
paste.setGlanceover(0);
//是否结帖 0未结 1结束
//private Integer solve;
paste.setSolve(0);
//private Integer isdelete;
paste.setIsdelete(0);
//private User user; paste.setUser(user); pasteService.addPaste(paste); //重定向到主页
return "toIndex";
} public PasteService getPasteService() {
return pasteService;
} public void setPasteService(PasteService pasteService) {
this.pasteService = pasteService;
} @Override
public Paste getModel() {
// TODO Auto-generated method stub
return paste;
} public String getPasteid() {
return pasteid;
} public void setPasteid(String pasteid) {
this.pasteid = pasteid;
} }

PasteAction.java

  Service层

package com.Gary.service;

import java.util.List;

import com.Gary.dao.AnswerDao;
import com.Gary.domain.Answer;
import com.Gary.domain.Paste; public class AnswerService { private AnswerDao answerDao; public List<Answer> findAllAnswerByPasteid(String pasteid) {
List<Answer> answerList = answerDao.findAllAnswerByPasteid(pasteid);
return answerList;
} public AnswerDao getAnswerDao() {
return answerDao;
} public void setAnswerDao(AnswerDao answerDao) {
this.answerDao = answerDao;
} public void addAnswer(Answer answer) {
// TODO Auto-generated method stub
answerDao.addAnswer(answer);
} public void addAnswer(Answer answer, Paste paste) { paste.setAnsnum(paste.getAnsnum() + 1);
answerDao.addAnswer(answer);
} }

AnswerService.java

  Dao层

package com.Gary.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.Answer; public class AnswerDao extends HibernateDaoSupport{ public void addAnswer(Answer answer) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
session.save(answer);
} public List<Answer> findAllAnswerByPasteid(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from answer where pasteid = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Answer.class);
query.setParameter(1, pasteid);
List<Answer> list = query.list();
return list;
} }

AnswerDao.java

  前端样式的美化

                    <div class="layui-form layui-form-pane">
<!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form> -->
<form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
<div style="margin-left: -580px">回答问题:</div>
</label>
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
</div>
</div> </div> <div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>
</div>
</div>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body style="margin: -2px">
<iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box"> <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
</span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
</span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
</span> </span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
</span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
</span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div> <div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em>
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div>
</div></li> --> <s:iterator value="#answerList" var="answer">
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href="">
<img src="${pageContext.request.contextPath }/<s:property value="#answer.user.image"/>" alt="">
<cite> <i><s:property value="#answer.user.username" /></i> <em style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span> <s:property value="#answer.anstime" />
</span>
</div>
</div>
<div class="detail-body jieda-body">
<p><s:property value="#answer.content" /></p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i>
<em> <s:property value="#answer.agree" /></em>
</span>
<div class="jieda-admin"> <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</div>
</div></li>
</s:iterator>
<s:if test="#answerList.size()==0">
<li class="fly-none">没有任何回答</li>
</s:if>
</ul>
<div class="layui-form layui-form-pane">
<!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form> -->
<form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
<div style="margin-left: -580px">回答问题:</div>
</label>
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
</div>
</div> </div> <div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>
</div>
</div> <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script> --%>
<script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'content',
resizeMode : 1,
cssPath : './index.css',
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
<script>
layui.cache.page = '';
layui.cache.user = {
username : '游客',
uid : -1,
avatar : '../res/images/avatar/00.jpg',
experience : 83,
sex : '男'
};
layui.config({
version : "2.0.0",
base : '../res/mods/'
}).extend({
fly : 'index'
}).use('fly');
</script>
</body>
</html>

detail.jsp

  删除与采纳的显示

  判断当前回复帖子人是登陆名自己的,显示可以删除帖子

    <s:if test="#session.user.username==#answer.user.username ">
      <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
    </s:if>

  判断当前发帖人是登录名自己的,显示可以采纳帖子

    <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
      <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
    </s:if>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body style="margin: -2px">
<iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box"> <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
</span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
</span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
</span> </span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
</span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
</span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div> <div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em>
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div>
</div></li> --> <s:iterator value="#answerList" var="answer">
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href="">
<img src="${pageContext.request.contextPath }/<s:property value="#answer.user.image"/>" alt="">
<cite> <i><s:property value="#answer.user.username" /></i> <em style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span> <s:property value="#answer.anstime" />
</span>
</div>
</div>
<div class="detail-body jieda-body">
<p><s:property value="#answer.content" /></p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i>
<em> <s:property value="#answer.agree" /></em>
</span>
<div class="jieda-admin">
<s:if test="#session.user.username==#answer.user.username ">
<span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
</s:if>
<s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
<span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</s:if>
</div>
</div></li>
</s:iterator>
<s:if test="#answerList.size()==0">
<li class="fly-none">没有任何回答</li>
</s:if>
</ul>
<div class="layui-form layui-form-pane">
<!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form> -->
<form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
<div style="margin-left: -580px">回答问题:</div>
</label>
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
</div>
</div> </div> <div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>
</div>
</div> <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script> --%>
<script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'content',
resizeMode : 1,
cssPath : './index.css',
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
<script>
layui.cache.page = '';
layui.cache.user = {
username : '游客',
uid : -1,
avatar : '../res/images/avatar/00.jpg',
experience : 83,
sex : '男'
};
layui.config({
version : "2.0.0",
base : '../res/mods/'
}).extend({
fly : 'index'
}).use('fly');
</script>
</body>
</html>

detail.jsp

分析删除回复

  删除和采纳

                                    <div class="jieda-admin">
<s:if test="#session.user.username==#answer.user.username ">
<span type="del"><a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
</s:if>
<s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
<span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</s:if>
</div>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body style="margin: -2px">
<iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box"> <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
</span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
</span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
</span> </span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
</span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
</span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div> <div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em>
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div>
</div></li> --> <s:iterator value="#answerList" var="answer">
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#answer.user.image"/>" alt=""> <cite> <i><s:property value="#answer.user.username" /></i> <em style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span> <s:property value="#answer.anstime" />
</span>
</div>
</div>
<div class="detail-body jieda-body">
<p>
<s:property value="#answer.content" />
</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i> <em> <s:property value="#answer.agree" /></em> </span>
<div class="jieda-admin">
<s:if test="#session.user.username==#answer.user.username ">
<span type="del"><a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
</s:if>
<s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
<span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
</s:if>
</div>
</div></li>
</s:iterator>
<s:if test="#answerList.size()==0">
<li class="fly-none">没有任何回答</li>
</s:if>
</ul>
<div class="layui-form layui-form-pane">
<!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form> -->
<form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>"> <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
<div style="margin-left: -580px">回答问题:</div>
</label>
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
</div>
</div> </div> <div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>
</div>
</div> <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script> --%>
<script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'content',
resizeMode : 1,
cssPath : './index.css',
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
<script>
layui.cache.page = '';
layui.cache.user = {
username : '游客',
uid : -1,
avatar : '../res/images/avatar/00.jpg',
experience : 83,
sex : '男'
};
layui.config({
version : "2.0.0",
base : '../res/mods/'
}).extend({
fly : 'index'
}).use('fly');
</script>
</body>
</html>

detail.jsp

  Web层:当增加帖子时,帖子数+1

//删除answer
public String deleteAnswer() throws Exception { Paste paste = pasteService.findPasteByIdReturnPaste(pasteid); answerService.deleteAnswerById(answerid,paste);
ActionContext.getContext().put("pasteid", pasteid);
return "toDetail";
} //添加answer
public String addAnswer() throws Exception { User user = (User) ActionContext.getContext().getSession().get("user");
if(user == null)
{
ActionContext.getContext().put("error", "未登录不能回复!!");
return "error";
}
package com.Gary.web;

import java.text.SimpleDateFormat;
import java.util.Date;
import com.Gary.domain.Answer;
import com.Gary.domain.Paste;
import com.Gary.domain.User;
import com.Gary.service.AnswerService;
import com.Gary.service.PasteService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class AnswerAction extends ActionSupport implements ModelDriven<Answer>{ public Answer answer = new Answer();
private AnswerService answerService;
private String pasteid;
private PasteService pasteService;
private String answerid; public String getAnswerid() {
return answerid;
} public void setAnswerid(String answerid) {
this.answerid = answerid;
} public AnswerService getAnswerService() {
return answerService;
} public void setAnswerService(AnswerService answerService) {
this.answerService = answerService;
} public PasteService getPasteService() {
return pasteService;
} public void setPasteService(PasteService pasteService) {
this.pasteService = pasteService;
} public String getPasteid() {
return pasteid;
} public void setPasteid(String pasteid) {
this.pasteid = pasteid;
} //删除answer
public String deleteAnswer() throws Exception { Paste paste = pasteService.findPasteByIdReturnPaste(pasteid); answerService.deleteAnswerById(answerid,paste);
ActionContext.getContext().put("pasteid", pasteid);
return "toDetail";
} //添加answer
public String addAnswer() throws Exception { User user = (User) ActionContext.getContext().getSession().get("user");
if(user == null)
{
ActionContext.getContext().put("error", "未登录不能回复!!");
return "error";
} // //回复时间
// private String anstime;
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String anstime = format.format(date);
answer.setAnstime(anstime);
// //同意数
// private Integer agree;
answer.setAgree(0);
// //是否解决
// private Integer solve;
answer.setSolve(0);
//
// private User user;
answer.setUser(user);
//
// private Paste paste;
Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
answer.setPaste(paste); answerService.addAnswer(answer,paste); return "toDetail";
} public Answer getModel() { return answer;
} }

AnswerAction.java

  Service层

    public void addAnswer(Answer answer, Paste paste) {

        paste.setAnsnum(paste.getAnsnum() + 1);
answerDao.addAnswer(answer);
} public void deleteAnswerById(String answerid, Paste paste) {
paste.setAnsnum(paste.getAnsnum()-1);
answerDao.deleteAnswerById(answerid);
}
package com.Gary.service;

import java.util.List;

import com.Gary.dao.AnswerDao;
import com.Gary.domain.Answer;
import com.Gary.domain.Paste; public class AnswerService { private AnswerDao answerDao; public List<Answer> findAllAnswerByPasteid(String pasteid) {
List<Answer> answerList = answerDao.findAllAnswerByPasteid(pasteid);
return answerList;
} public void addAnswer(Answer answer, Paste paste) { paste.setAnsnum(paste.getAnsnum() + 1);
answerDao.addAnswer(answer);
} public void deleteAnswerById(String answerid, Paste paste) {
paste.setAnsnum(paste.getAnsnum()-1);
answerDao.deleteAnswerById(answerid);
} public AnswerDao getAnswerDao() {
return answerDao;
} public void setAnswerDao(AnswerDao answerDao) {
this.answerDao = answerDao;
} }

AnswerService.java

  Dao层:操作数据库

public void addAnswer(Answer answer) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
session.save(answer);
} public List<Answer> findAllAnswerByPasteid(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from answer where pasteid = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Answer.class);
query.setParameter(1, pasteid);
List<Answer> list = query.list();
return list;
} public void deleteAnswerById(String answerid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "delete from answer where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.setParameter(1, answerid);
query.executeUpdate(); //session.delete(answerid, Answer.class); }
package com.Gary.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.Answer; public class AnswerDao extends HibernateDaoSupport{ public void addAnswer(Answer answer) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
session.save(answer);
} public List<Answer> findAllAnswerByPasteid(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from answer where pasteid = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Answer.class);
query.setParameter(1, pasteid);
List<Answer> list = query.list();
return list;
} public void deleteAnswerById(String answerid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "delete from answer where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.setParameter(1, answerid);
query.executeUpdate(); //session.delete(answerid, Answer.class); } }

AnswerDao.java

  可以看到,进入帖子后,帖子浏览数目+1,当增加回帖时,帖子数+1,当删除回帖时,帖子数-1

  添加属性与元数据字段

    private String answerid;
        <property name="answerid" column="answerid"></property>

  

  分析采纳帖子

  detail.jsp

                                        <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
<span class="jieda-accept" type="accept">
<a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
</span>
</s:if>

  Web层:采纳用户回帖

    public String solvePaste() throws Exception{

        pasteService.solvePasteByIdAndAnswerid(pasteid,paste.getAnswerid());
ActionContext.getContext().put("pasteid", pasteid); return "toDetail";
}

  Service层:获得Web层数据传递到Dao层

    public void solvePasteByIdAndAnswerid(String pasteid, String answerid) {
pasteDao.solvePasteByIdAndAnswerid(pasteid,answerid);
}

  Dao层:进行数据的处理

    public void solvePasteByIdAndAnswerid(String pasteid, String answerid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql ="update paste set solve = 1, answerid = ? where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.setParameter(1, answerid);
query.setParameter(2, pasteid);
query.executeUpdate();
}

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
} .editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style> </head>
<body style="margin: -2px">
<iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box"> <h1>
<s:property value="#paste.title" />
</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
</span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
</span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
</span> </span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i>
<s:property value="#paste.ansnum" />
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
</span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
</span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
</span> </div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>
<s:property value="#paste.content" />
</p>
</div>
</div> <div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em>
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div>
</div></li> --> <s:iterator value="#answerList" var="answer">
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#answer.user.image"/>" alt=""> <cite> <i><s:property value="#answer.user.username" /></i> <em style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span> <s:property value="#answer.anstime" />
</span>
</div>
</div>
<div class="detail-body jieda-body">
<p>
<s:property value="#answer.content" />
</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i> <em> <s:property value="#answer.agree" /></em> </span>
<div class="jieda-admin">
<s:if test="#session.user.username==#answer.user.username ">
<span type="del"><a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
</s:if>
<s:if test="#session.user.username==#paste.user.username ">
<a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
</s:if>
</div>
</div></li>
</s:iterator>
<s:if test="#answerList.size()==0">
<li class="fly-none">没有任何回答</li>
</s:if>
</ul>
<div class="layui-form layui-form-pane">
<!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form> -->
<form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
<input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>"> <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
<div style="margin-left: -580px">回答问题:</div>
</label>
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
</div>
</div> </div> <div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>
</div>
</div>
</div> <div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<s:iterator value="#glanceoverPageBean.list" var="paste">
<dd> <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
</span>
</dd>
</s:iterator>
</dl> <dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<s:iterator value="#ansnumPageBean.list" var="paste">
<dd>
<a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
</a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
</span>
</dd>
</s:iterator>
</dl>
</div>
</div> <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'L_content',
resizeMode : 1,
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script> --%>
<script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'content',
resizeMode : 1,
cssPath : './index.css',
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
<script>
layui.cache.page = '';
layui.cache.user = {
username : '游客',
uid : -1,
avatar : '../res/images/avatar/00.jpg',
experience : 83,
sex : '男'
};
layui.config({
version : "2.0.0",
base : '../res/mods/'
}).extend({
fly : 'index'
}).use('fly');
</script>
</body>
</html>

detail.jsp

  实现采纳问题

  <div class="jieda-admin">
    <s:if test="#session.user.username==#answer.user.username ">
      <span type="del"><a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
    </s:if>
    <s:if test="#session.user.username==#paste.user.username ">
      <a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
    </s:if>
  </div>

  Service层

public List<Answer> findAllAnswerByPasteid(String pasteid) {

        Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
List<Answer> answerList = null;
// 判断paste中的solve是否为1
if (paste.getSolve() == 1) {
// 查找最佳答案
Answer answer = answerDao.findAnswerById(paste.getAnswerid());
// 查找所有答案
answerList = answerDao.findAllAnswerByPasteid(pasteid);
// 查找所有答案中包括了最佳答案所以将最佳答案删除
answerList.remove(answer);
// 在头元素中插入最佳答案
answerList.add(0, answer);
} else {
answerList = answerDao.findAllAnswerByPasteid(pasteid);
} return answerList;
}
package com.Gary.service;

import java.util.List;

import com.Gary.dao.AnswerDao;
import com.Gary.dao.PasteDao;
import com.Gary.domain.Answer;
import com.Gary.domain.Paste; public class AnswerService { private AnswerDao answerDao;
private PasteDao pasteDao; public List<Answer> findAllAnswerByPasteid(String pasteid) { Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
List<Answer> answerList = null;
// 判断paste中的solve是否为1
if (paste.getSolve() == 1) {
// 查找最佳答案
Answer answer = answerDao.findAnswerById(paste.getAnswerid());
// 查找所有答案
answerList = answerDao.findAllAnswerByPasteid(pasteid);
// 查找所有答案中包括了最佳答案所以将最佳答案删除
answerList.remove(answer);
// 在头元素中插入最佳答案
answerList.add(0, answer);
} else {
answerList = answerDao.findAllAnswerByPasteid(pasteid);
} return answerList;
} public void addAnswer(Answer answer, Paste paste) { paste.setAnsnum(paste.getAnsnum() + 1);
answerDao.addAnswer(answer);
} public void deleteAnswerById(String answerid, Paste paste) {
paste.setAnsnum(paste.getAnsnum()-1);
answerDao.deleteAnswerById(answerid);
} public AnswerDao getAnswerDao() {
return answerDao;
} public void setAnswerDao(AnswerDao answerDao) {
this.answerDao = answerDao;
} public PasteDao getPasteDao() {
return pasteDao;
} public void setPasteDao(PasteDao pasteDao) {
this.pasteDao = pasteDao;
}
}

AnswerService.java

  Dao层

    public Answer findAnswerById(String answerid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from answer where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Answer.class);
query.setParameter(1, answerid);
Answer result = (Answer) query.uniqueResult();
return result;
}
package com.Gary.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.Gary.domain.Answer; public class AnswerDao extends HibernateDaoSupport{ public void addAnswer(Answer answer) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
session.save(answer);
} public List<Answer> findAllAnswerByPasteid(String pasteid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from answer where pasteid = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Answer.class);
query.setParameter(1, pasteid);
List<Answer> list = query.list();
return list;
} public void deleteAnswerById(String answerid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "delete from answer where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.setParameter(1, answerid);
query.executeUpdate(); //session.delete(answerid, Answer.class); } public Answer findAnswerById(String answerid) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = "select * from answer where id = ?";
NativeQuery query = session.createSQLQuery(sql);
query.addEntity(Answer.class);
query.setParameter(1, answerid);
Answer result = (Answer) query.uniqueResult();
return result;
} }

AnswerDao.java

  发现当采纳问题后,应该隐藏其它问题的采纳按钮,已采纳的问题也不可删除

    <s:if test="#session.user.username==#answer.user.username && #paste.answerid!=#answer.id">
      <span type="del">
        <a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a>
      </span>
    </s:if>
    <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
      <span class="jieda-accept" type="accept">
    <a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
    </span>
  </s:if>

  添加采纳金币模块

  <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
    <span class="jieda-accept" type="accept">
      <a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
    </span>
  </s:if>

  Service层

    public void solvePasteByIdAndAnswerid(String pasteid, String answerid) {
//给回复的人添加金币
Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
//通过answerid查找user
Answer answer = answerDao.findAnswerById(answerid);
//通过userid找user对象
//User user = userDao.finduserByIdReturnUser(answer.getUser().getId());
//获得answer下的user对象(持久化数据类型)
User user = answer.getUser();
//因为是持久化类型对象,即可直接修改属性,同步到数据库
user.setCoin(user.getCoin()+paste.getOffer());
//解决问题
pasteDao.solvePasteByIdAndAnswerid(pasteid,answerid);
}
package com.Gary.service;

import java.util.List;

import com.Gary.dao.AnswerDao;
import com.Gary.dao.PasteDao;
import com.Gary.dao.UserDao;
import com.Gary.domain.Answer;
import com.Gary.domain.Paste;
import com.Gary.domain.User;
import com.Gary.utils.PageBean; public class PasteService { private PasteDao pasteDao;
private AnswerDao answerDao;
private UserDao userDao; public void solvePasteByIdAndAnswerid(String pasteid, String answerid) {
//给回复的人添加金币
Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
//通过answerid查找user
Answer answer = answerDao.findAnswerById(answerid);
//通过userid找user对象
//User user = userDao.finduserByIdReturnUser(answer.getUser().getId());
//获得answer下的user对象(持久化数据类型)
User user = answer.getUser();
//因为是持久化类型对象,即可直接修改属性,同步到数据库
user.setCoin(user.getCoin()+paste.getOffer());
//解决问题
pasteDao.solvePasteByIdAndAnswerid(pasteid,answerid);
} public AnswerDao getAnswerDao() {
return answerDao;
} public void setAnswerDao(AnswerDao answerDao) {
this.answerDao = answerDao;
} public UserDao getUserDao() {
return userDao;
} public void setUserDao(UserDao userDao) {
this.userDao = userDao;
} public Paste findPasteByIdReturnPaste(String pasteid) { //pasteDao.addPasteGlanceover(pasteid);
//数据库SQL语句:update paste set glanceover = glanceover+1 where id = ?;
Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
paste.setGlanceover(paste.getGlanceover()+1);
return paste;
} public PageBean getGlanceoverPageBean(Integer currentPage) {
Integer totalCount = pasteDao.findAllPasteNum();
PageBean glanceoverPageBean = new PageBean(currentPage, totalCount, 8);
List<Paste> list = pasteDao.getGlanceoverPageList();
glanceoverPageBean.setList(list); return glanceoverPageBean;
} public PageBean getPastePageBean(Integer currentPage) { Integer totalCount = pasteDao.findAllPasteNum();
PageBean pageBean = new PageBean(currentPage,totalCount,8);
List<Paste> list = pasteDao.getPastePageList(pageBean.getStart(),pageBean.getPageSize());
pageBean.setList(list); return pageBean;
} public PasteDao getPasteDao() {
return pasteDao;
} public List<Paste> findAllPaste() { return pasteDao.findAllPaste(); } public void setPasteDao(PasteDao pasteDao) {
this.pasteDao = pasteDao;
} public void addPaste(Paste paste) { pasteDao.addPaste(paste); } public PageBean getAnsnumPageBean(Integer currentPage) {
//获得所有的帖子数目
Integer totalCount = pasteDao.findAllPasteNum();
//创建PageBean
PageBean ansnumPageBean = new PageBean(currentPage, totalCount, 8);
//得到List
List<Paste> list = pasteDao.getAnsnumPageList();
//封装List
ansnumPageBean.setList(list);
return ansnumPageBean;
} }

AnswerDao.java

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 配置数据源 -->
<bean name="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="jdbc:mysqL:///garyssh_forum"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean> <!-- 配置sessionFactory -->
<bean name="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sqp">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property> <property name="mappingDirectoryLocations"
value="classpath:com/Gary/domain"></property> </bean> <!-- 配置事务的核心管理器 -->
<bean name="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <!-- 通知 -->
<tx:advice id="advice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice> <!-- 织入 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut
expression="execution(* com.Gary.service.*.*(..))" id="pc" />
<!-- 配置切面 切入点+通知 -->
<aop:advisor advice-ref="advice" pointcut-ref="pc" />
</aop:config> <!-- 配置Action -->
<bean name="userAction" class="com.Gary.web.UserAction" scope="prototype">
<property name="userService" ref="userService"></property>
</bean>
<bean name="pasteAction" class="com.Gary.web.PasteAction" scope="prototype">
<property name="pasteService" ref="pasteService"></property>
<property name="answerService" ref="answerService"></property>
</bean>
<bean name="getDataAction" class="com.Gary.web.GetDataAction" scope="prototype">
<property name="pasteService" ref="pasteService"></property>
<property name="userService" ref="userService"></property>
</bean>
<bean name="answerAction" class="com.Gary.web.AnswerAction" scope="prototype">
<property name="answerService" ref="answerService"></property>
<property name="pasteService" ref="pasteService"></property>
</bean> <!-- 配置Service -->
<bean name="userService" class="com.Gary.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<bean name="pasteService" class="com.Gary.service.PasteService">
<property name="pasteDao" ref="pasteDao"></property>
<property name="userDao" ref="userDao"></property>
<property name="answerDao" ref="answerDao"></property>
</bean>
<bean name="answerService" class="com.Gary.service.AnswerService">
<property name="answerDao" ref="answerDao"></property>
<property name="pasteDao" ref="pasteDao"></property>
</bean> <!-- 配置Dao -->
<bean name="userDao" class="com.Gary.dao.UserDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean name="pasteDao" class="com.Gary.dao.PasteDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean name="answerDao" class="com.Gary.dao.AnswerDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> </beans>

applicationContext.xml

JavaWeb_(SSH论坛)_五、帖子模块的更多相关文章

  1. JavaWeb_(SSH论坛)_七、辅助模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 为避免代码冗余, ...

  2. JavaWeb_(SSH论坛)_六、点赞模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 联合主键 创建p ...

  3. JavaWeb_(SSH论坛)_三、用户模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 User表 id ...

  4. JavaWeb_(SSH论坛)_一、项目入门

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 项目已上传至gi ...

  5. JavaWeb_(SSH论坛)_四、页面显示

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 帖子表与回复表 ...

  6. JavaWeb_(SSH论坛)_二、框架整合

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 导入Jar包 导 ...

  7. JavaWeb_(Mybatis框架)输入和输出参数_五

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  8. discuz 帖子模块用到的表及自动发帖函数

    最近在做一个discuz的插件,由于需要程序自动生成并调用discuz已经存在插件的帖子.然而这就相当于自动发帖的功能了.网上找了一下,大部分都是通过curl模拟登陆,模拟发帖的,这显然不满足我的要求 ...

  9. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

随机推荐

  1. 关于Windows10内存随时间不断升高问题

    问题描述 电脑买了10个月了,头半年的运行内存都是正常的,基本不会超过60%,但是最近几个月发现自己电脑的运行内存会随时间不断地升高,关机后重启也无法解决这个问题QAQ 常见的症状为一开机,点开任务管 ...

  2. SKCTF管理系统

    一开始是一个简洁风的登录界面 康康注册界面 嗯...也是很简洁风呢. 那让我们来查看元素(fn+f12) 没有什么有flag的迹象呢! 那我们试一下注册一个账号 这时候我们已经有解题的线索了: 获得管 ...

  3. spark教程(九)-操作数据库

    数据库也是 spark 数据源创建 df 的一种方式,因为比较重要,所以单独算一节. 本文以 postgres 为例 安装 JDBC 首先需要 安装 postgres 的客户端驱动,即 JDBC 驱动 ...

  4. JVM 线上故障排查基本操作 (转)

    前言 对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的.各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题.楼主同样也遇到过这些问题,那么,遇到这些问题该如何 ...

  5. expect批量分发密钥对

    vim shell.exp #!/usr/bin/expect set timeout 10 set hostname [lindex $argv 0] set username [lindex $a ...

  6. VMware Ubuntu18.04 安装及配置笔记

    安装Ubuntu 下载虚拟机VMware 下载镜像Ubuntu 过程略, 参考 https://zhuanlan.zhihu.com/p/38797088 Ubuntu配置 特别提示: 在Ubuntu ...

  7. Bash Plays with Functions CodeForces - 757E (积性函数dp)

    大意: 定义函数$f_r(n)$, $f_0(n)$为pq=n且gcd(p,q)=1的有序对(p,q)个数. $r \ge 1$时, $f_r(n)=\sum\limits_{uv=n}\frac{f ...

  8. linux系统内核优化参数

    1. 系统连接数优化 # vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 * soft noproc 655 ...

  9. 关于ASP.NET中fileupload控件的缺点

    一.首我来理一理“FileUpload”控件的工作大概原理: FileUpload 控件显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器.用户通过在控件的文本 ...

  10. zabbix磁盘的自动发现与磁盘指标监控

    由于最近项目上需要对服务器监控进行规范化监控,再磁盘这块有几种方式 1.如果每台设备的磁盘是一样的 比如都有vda,vdb两块磁盘那么可以采用 1.1 每台客户端写脚本,服务端每台设备去加上监控项(- ...