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

  一、项目入门  传送门

  二、框架整合  传送门

  三、用户模块  传送门

  四、页面显示  传送门

  五、帖子模块  传送门

  六、点赞模块  传送门

  七、辅助模块  传送门

联合主键

  创建praise表

  创建Praise.java和PrimaryKey.java并在Praise.hbm.xml中配置联合组件

  1. package com.Gary.domain;
  2.  
  3. import com.Gary.vo.PrimaryKey;
  4.  
  5. public class Praise {
  6.  
  7. private PrimaryKey primaryKey;
  8.  
  9. public PrimaryKey getPrimaryKey() {
  10. return primaryKey;
  11. }
  12.  
  13. public void setPrimaryKey(PrimaryKey primaryKey) {
  14. this.primaryKey = primaryKey;
  15. }
  16.  
  17. }

Praise.java

  1. package com.Gary.vo;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import com.Gary.domain.Answer;
  6. import com.Gary.domain.User;
  7.  
  8. public class PrimaryKey implements Serializable{
  9. private User user;
  10. private Answer answer;
  11. public User getUser() {
  12. return user;
  13. }
  14. public void setUser(User user) {
  15. this.user = user;
  16. }
  17. public Answer getAnswer() {
  18. return answer;
  19. }
  20. public void setAnswer(Answer answer) {
  21. this.answer = answer;
  22. }
  23.  
  24. }

PrimaryKey.java

  1. <!-- 类名-对应表名字 -->
  2. <class name="Praise" table="praise">
  3. <!-- 联合主键的名字 联合主键的类 -->
  4. <composite-id name="primaryKey" class="com.Gary.vo.PrimaryKey">
  5. <!-- primarykey中的属性 对应数据库中的列 属性对应的类 -->
  6. <key-many-to-one name="user" column="userid" class="User"></key-many-to-one>
  7. <key-many-to-one name="answer" column="answerid" class="Answer"></key-many-to-one>
  8. </composite-id>
  9. </class>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.Gary.domain">
  7.  
  8. <!-- 类名-对应表名字 -->
  9. <class name="Praise" table="praise">
  10. <!-- 联合主键的名字 联合主键的类 -->
  11. <composite-id name="primaryKey" class="com.Gary.vo.PrimaryKey">
  12. <!-- primarykey中的属性 对应数据库中的列 属性对应的类 -->
  13. <key-many-to-one name="user" column="userid" class="User"></key-many-to-one>
  14. <key-many-to-one name="answer" column="answerid" class="Answer"></key-many-to-one>
  15. </composite-id>
  16. </class>
  17.  
  18. </hibernate-mapping>

Praise.hbm.xml

  分析点赞功

  detail.jsp

  1. <a href="${pageContext.request.contextPath }/PraiseAction_addPraise?answerid=<s:property value="#answer.id" />&pasteid=<s:property value="#paste.id" />">
  2. <span class="jieda-zan" type="zan">
  3. <i class="iconfont icon-zan"></i>
  4. <em>
  5. <s:property value="#answer.agree" />
  6. </em>
  7. </span>
  8. </a>

  Web层

  1. //添加赞
  2. public String addPraise() throws Exception{
  3.  
  4. //肯定可以获得(用户未登录不能点赞,只有登录后才可以点赞)
  5. User user = (User) ActionContext.getContext().getSession().get("user");
  6.  
  7. if(user == null)
  8. {
  9. ActionContext.getContext().put("error", "未登录不允许点赞!!");
  10. return "error";
  11. }
  12. //根据answerid查找Answer对象
  13. Answer answer = answerService.findAnswerByIdReturnAnswer(answerid);
  14. //申明联合主键
  15. PrimaryKey primaryKey = new PrimaryKey();
  16. //放置对象
  17. primaryKey.setAnswer(answer);
  18. primaryKey.setUser(user);
  19. //创建赞的类
  20. Praise praise = new Praise();
  21. //将联合主键放入类的对象中
  22. praise.setPrimaryKey(primaryKey);
  23.  
  24. praiseService.addPraise(praise);
  25. ActionContext.getContext().put("pasteid", pasteid);
  26. return "toDetail";
  27. }
  1. package com.Gary.web;
  2.  
  3. import com.Gary.domain.Answer;
  4. import com.Gary.domain.Praise;
  5. import com.Gary.domain.User;
  6. import com.Gary.service.AnswerService;
  7. import com.Gary.service.PraiseService;
  8. import com.Gary.vo.PrimaryKey;
  9. import com.opensymphony.xwork2.ActionContext;
  10. import com.opensymphony.xwork2.ActionSupport;
  11.  
  12. public class PraiseAction extends ActionSupport{
  13.  
  14. private String answerid;
  15. private String pasteid;
  16. private AnswerService answerService;
  17. private PraiseService praiseService;
  18.  
  19. public String getPasteid() {
  20. return pasteid;
  21. }
  22.  
  23. public void setPasteid(String pasteid) {
  24. this.pasteid = pasteid;
  25. }
  26.  
  27. //添加赞
  28. public String addPraise() throws Exception{
  29.  
  30. //肯定可以获得(用户未登录不能点赞,只有登录后才可以点赞)
  31. User user = (User) ActionContext.getContext().getSession().get("user");
  32.  
  33. if(user == null)
  34. {
  35. ActionContext.getContext().put("error", "未登录不允许点赞!!");
  36. return "error";
  37. }
  38. //根据answerid查找Answer对象
  39. Answer answer = answerService.findAnswerByIdReturnAnswer(answerid);
  40. //申明联合主键
  41. PrimaryKey primaryKey = new PrimaryKey();
  42. //放置对象
  43. primaryKey.setAnswer(answer);
  44. primaryKey.setUser(user);
  45. //创建赞的类
  46. Praise praise = new Praise();
  47. //将联合主键放入类的对象中
  48. praise.setPrimaryKey(primaryKey);
  49.  
  50. praiseService.addPraise(praise);
  51. ActionContext.getContext().put("pasteid", pasteid);
  52. return "toDetail";
  53. }
  54.  
  55. public AnswerService getAnswerService() {
  56. return answerService;
  57. }
  58.  
  59. public void setAnswerService(AnswerService answerService) {
  60. this.answerService = answerService;
  61. }
  62.  
  63. public PraiseService getPraiseService() {
  64. return praiseService;
  65. }
  66.  
  67. public void setPraiseService(PraiseService praiseService) {
  68. this.praiseService = praiseService;
  69. }
  70.  
  71. public String getAnswerid() {
  72. return answerid;
  73. }
  74.  
  75. public void setAnswerid(String answerid) {
  76. this.answerid = answerid;
  77. }
  78.  
  79. }

PraiseAction.java

  service层

  1. public void addPraise(Praise praise) {
  2. praiseDao.addPraise(praise);
  3.  
  4. }
  1. package com.Gary.service;
  2.  
  3. import com.Gary.dao.PraiseDao;
  4. import com.Gary.domain.Praise;
  5.  
  6. public class PraiseService {
  7.  
  8. private PraiseDao praiseDao;
  9.  
  10. public void addPraise(Praise praise) {
  11. praiseDao.addPraise(praise);
  12.  
  13. }
  14.  
  15. public PraiseDao getPraiseDao() {
  16. return praiseDao;
  17. }
  18.  
  19. public void setPraiseDao(PraiseDao praiseDao) {
  20. this.praiseDao = praiseDao;
  21. }
  22.  
  23. }

PraiseService.java

  Dao层

  1. //添加赞
  2. public void addPraise(Praise praise) {
  3. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  4. session.save(praise);
  5. }
  1. package com.Gary.dao;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.query.NativeQuery;
  5. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  6.  
  7. import com.Gary.domain.Praise;
  8.  
  9. public class PraiseDao extends HibernateDaoSupport{
  10.  
  11. //添加赞
  12. public void addPraise(Praise praise) {
  13. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  14. session.save(praise);
  15. }
  16.  
  17. }

PraiseDao.java

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
  39. </span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  40. </span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
  41. </span> </span>
  42. <div class="fly-list-hint">
  43. <i class="iconfont" title="回答"></i>
  44. <s:property value="#paste.ansnum" />
  45. </div>
  46. </div>
  47. <div class="detail-about">
  48. <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" /> 发布
  49. </em>
  50. </cite>
  51. </a>
  52. <div class="detail-hits" data-id="{{rows.id}}">
  53. <span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
  54. </span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
  55. </span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
  56. </span>
  57.  
  58. </div>
  59. </div>
  60. <div class="detail-body photos" style="margin-bottom: 20px;">
  61. <p>
  62. <s:property value="#paste.content" />
  63. </p>
  64. </div>
  65. </div>
  66.  
  67. <div class="fly-panel detail-box" style="padding-top: 0;">
  68. <a name="comment"></a>
  69. <ul class="jieda photos" id="jieda">
  70. <!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  71. <div class="detail-about detail-about-reply">
  72. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
  73. <em style="color:#5FB878">(管理员)</em>
  74. </cite>
  75. </a>
  76. <div class="detail-hits">
  77. <span>3分钟前</span>
  78. </div>
  79. <i class="iconfont icon-caina" title="最佳答案"></i>
  80. </div>
  81. <div class="detail-body jieda-body">
  82. <p>么么哒</p>
  83. </div>
  84. <div class="jieda-reply">
  85. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  86. <!-- <div class="jieda-admin">
  87. <span type="del">删除</span>
  88. <span class="jieda-accept" type="accept">采纳</span>
  89. </div>
  90. </div></li> -->
  91.  
  92. <s:iterator value="#answerList" var="answer">
  93. <li data-id="13"><a name="item-121212121212"></a>
  94. <div class="detail-about detail-about-reply">
  95. <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>
  96. </cite>
  97. </a>
  98. <div class="detail-hits">
  99. <span> <s:property value="#answer.anstime" />
  100. </span>
  101. </div>
  102. <s:if test="#answer.id==#paste.answerid">
  103. <i class="iconfont icon-caina" title="最佳答案"></i>
  104. </s:if>
  105. </div>
  106. <div class="detail-body jieda-body">
  107. <p>
  108. <s:property value="#answer.content" />
  109. </p>
  110. </div>
  111. <div class="jieda-reply">
  112. <a href="${pageContext.request.contextPath }/PraiseAction_addPraise?answerid=<s:property value="#answer.id" />&pasteid=<s:property value="#paste.id" />">
  113. <span class="jieda-zan" type="zan">
  114. <i class="iconfont icon-zan"></i>
  115. <em>
  116. <s:property value="#answer.agree" />
  117. </em>
  118. </span>
  119. </a>
  120. <div class="jieda-admin">
  121. <s:if test="#session.user.username==#answer.user.username && #paste.answerid!=#answer.id">
  122. <span type="del">
  123. <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>
  124. </span>
  125. </s:if>
  126. <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  127. <span class="jieda-accept" type="accept">
  128. <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>
  129. </span>
  130. </s:if>
  131. </div>
  132. </div></li>
  133. </s:iterator>
  134. <s:if test="#answerList.size()==0">
  135. <li class="fly-none">没有任何回答</li>
  136. </s:if>
  137. </ul>
  138. <div class="layui-form layui-form-pane">
  139. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  140. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  141. <div class="layui-form-item layui-form-text">
  142. <div class="layui-input-block">
  143. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  144. </div>
  145. </div>
  146. <div class="layui-form-item">
  147. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  148. </div>
  149. </form> -->
  150. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  151. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>"> <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
  152. <div style="margin-left: -580px">回答问题:</div>
  153. </label>
  154. <div class="layui-form-item layui-form-text">
  155. <div class="layui-input-block">
  156. <div class="editor">
  157. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  158. </div>
  159. </div>
  160.  
  161. </div>
  162.  
  163. <div class="layui-form-item">
  164. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  165. </div>
  166. </form>
  167. </div>
  168. </div>
  169. </div>
  170. </div>
  171.  
  172. <div class="edge">
  173. <dl class="fly-panel fly-list-one">
  174. <dt class="fly-panel-title">最近热帖</dt>
  175. <s:iterator value="#glanceoverPageBean.list" var="paste">
  176. <dd>
  177.  
  178. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  179. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  180. </span>
  181. </dd>
  182. </s:iterator>
  183. </dl>
  184.  
  185. <dl class="fly-panel fly-list-one">
  186. <dt class="fly-panel-title">近期热议</dt>
  187. <s:iterator value="#ansnumPageBean.list" var="paste">
  188. <dd>
  189. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  190. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  191. </span>
  192. </dd>
  193. </s:iterator>
  194. </dl>
  195. </div>
  196. </div>
  197.  
  198. <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  199. <script type="text/javascript">
  200. KE.show({
  201. id : 'L_content',
  202. resizeMode : 1,
  203. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  204. 'italic', 'underline', 'removeformat', 'justifyleft',
  205. 'justifycenter', 'justifyright', 'insertorderedlist',
  206. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  207. });
  208. </script> --%>
  209. <script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
  210. <script type="text/javascript">
  211. KE.show({
  212. id : 'content',
  213. resizeMode : 1,
  214. cssPath : './index.css',
  215. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  216. 'italic', 'underline', 'removeformat', 'justifyleft',
  217. 'justifycenter', 'justifyright', 'insertorderedlist',
  218. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  219. });
  220. </script>
  221. <script>
  222. layui.cache.page = '';
  223. layui.cache.user = {
  224. username : '游客',
  225. uid : -1,
  226. avatar : '../res/images/avatar/00.jpg',
  227. experience : 83,
  228. sex : '男'
  229. };
  230. layui.config({
  231. version : "2.0.0",
  232. base : '../res/mods/'
  233. }).extend({
  234. fly : 'index'
  235. }).use('fly');
  236. </script>
  237. </body>
  238. </html>

detail.jsp

  1. package com.Gary.web;
  2.  
  3. import com.Gary.domain.Answer;
  4. import com.Gary.domain.Praise;
  5. import com.Gary.domain.User;
  6. import com.Gary.service.AnswerService;
  7. import com.Gary.service.PraiseService;
  8. import com.Gary.vo.PrimaryKey;
  9. import com.opensymphony.xwork2.ActionContext;
  10. import com.opensymphony.xwork2.ActionSupport;
  11.  
  12. public class PraiseAction extends ActionSupport{
  13.  
  14. private String answerid;
  15. private String pasteid;
  16. private AnswerService answerService;
  17. private PraiseService praiseService;
  18.  
  19. public String getPasteid() {
  20. return pasteid;
  21. }
  22.  
  23. public void setPasteid(String pasteid) {
  24. this.pasteid = pasteid;
  25. }
  26.  
  27. //添加赞
  28. public String addPraise() throws Exception{
  29.  
  30. //肯定可以获得(用户未登录不能点赞,只有登录后才可以点赞)
  31. User user = (User) ActionContext.getContext().getSession().get("user");
  32.  
  33. if(user == null)
  34. {
  35. ActionContext.getContext().put("error", "未登录不允许点赞!!");
  36. return "error";
  37. }
  38. //根据answerid查找Answer对象
  39. Answer answer = answerService.findAnswerByIdReturnAnswer(answerid);
  40. //申明联合主键
  41. PrimaryKey primaryKey = new PrimaryKey();
  42. //放置对象
  43. primaryKey.setAnswer(answer);
  44. primaryKey.setUser(user);
  45. //创建赞的类
  46. Praise praise = new Praise();
  47. //将联合主键放入类的对象中
  48. praise.setPrimaryKey(primaryKey);
  49.  
  50. praiseService.addPraise(praise);
  51.  
  52. answer.setAgree(answer.getAgree()+1);
  53. ActionContext.getContext().put("pasteid", pasteid);
  54. return "toDetail";
  55. }
  56.  
  57. public AnswerService getAnswerService() {
  58. return answerService;
  59. }
  60.  
  61. public void setAnswerService(AnswerService answerService) {
  62. this.answerService = answerService;
  63. }
  64.  
  65. public PraiseService getPraiseService() {
  66. return praiseService;
  67. }
  68.  
  69. public void setPraiseService(PraiseService praiseService) {
  70. this.praiseService = praiseService;
  71. }
  72.  
  73. public String getAnswerid() {
  74. return answerid;
  75. }
  76.  
  77. public void setAnswerid(String answerid) {
  78. this.answerid = answerid;
  79. }
  80.  
  81. }

PraiseAction.java

  1. package com.Gary.service;
  2.  
  3. import com.Gary.dao.PraiseDao;
  4. import com.Gary.domain.Praise;
  5.  
  6. public class PraiseService {
  7.  
  8. private PraiseDao praiseDao;
  9.  
  10. public void addPraise(Praise praise) {
  11. praiseDao.addPraise(praise);
  12.  
  13. }
  14.  
  15. public PraiseDao getPraiseDao() {
  16. return praiseDao;
  17. }
  18.  
  19. public void setPraiseDao(PraiseDao praiseDao) {
  20. this.praiseDao = praiseDao;
  21. }
  22.  
  23. }

PraiseService.java

  1. package com.Gary.dao;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.query.NativeQuery;
  5. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  6.  
  7. import com.Gary.domain.Praise;
  8.  
  9. public class PraiseDao extends HibernateDaoSupport{
  10.  
  11. //添加赞
  12. public void addPraise(Praise praise) {
  13. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  14. session.save(praise);
  15. }
  16.  
  17. }

PraiseDao.java

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
  4. "http://struts.apache.org/dtds/struts-2.5.dtd">
  5.  
  6. <struts>
  7.  
  8. <!--开启动态方法调用 -->
  9. <constant name="struts.devMode" value="true"></constant>
  10. <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
  11.  
  12. <!-- 告诉struts不用自己创建Action,Spring来帮你创建 -->
  13. <constant name="struts.objectFactory" value="spring"></constant>
  14. <package name="Gary_SSHForum" namespace="/" extends="struts-default">
  15. <!-- 允许全部方法 -->
  16. <global-allowed-methods>regex:.*</global-allowed-methods>
  17. <action name="UserAction_*" class="com.Gary.web.UserAction" method="{1}">
  18. <result name="toLogin" type="redirect">/login.jsp</result>
  19. <result name="login">/login.jsp</result>
  20. <result name="toIndex" type="redirect">/default.jsp</result>
  21. <result name="error">/login.jsp</result>
  22. <result name="toRegisterSuccess" type="redirect">/registerSuccess.jsp</result>
  23. </action>
  24.  
  25. <action name="PasteAction_*" class="com.Gary.web.PasteAction" method="{1}">
  26. <!-- 从定向到jsp -->
  27. <result name="toIndex" type="redirect">/default.jsp</result>
  28. <result name="error">/login.jsp</result>
  29. <!-- 转发到jsp -->
  30. <result name="detail">/detail.jsp</result>
  31. <!-- 重定向到Action -->
  32. <result name="toDetail" type="redirectAction">
  33. <param name="actionName"> PasteAction_getDetail </param>
  34. <!-- struts不认识pasteid则会封装到重定向的action中 -->
  35. <param name="pasteid">${pasteid}</param>
  36. </result>
  37. </action>
  38.  
  39. <action name="GetDataAction_*" class="com.Gary.web.GetDataAction" method="{1}">
  40. <result name="index" >/index.jsp</result>
  41. </action>
  42. <action name="AnswerAction_*" class="com.Gary.web.AnswerAction" method="{1}">
  43. <result name="error">/login.jsp</result>
  44. <!-- 重定向到Action -->
  45. <result name="toDetail" type="redirectAction">
  46. <param name="actionName">PasteAction_getDetail</param>
  47. <!-- struts不认识pasteid则会封装到重定向的action中 -->
  48. <param name="pasteid">${pasteid}</param>
  49. </result>
  50. </action>
  51.  
  52. <action name="PraiseAction_*" class="com.Gary.web.PraiseAction" method="{1}">
  53. <result name="error">/login.jsp</result>
  54. <result name="toDetail" type="redirectAction">
  55. <param name="actionName">PasteAction_getDetail</param>
  56. <param name="pasteid">${pasteid}</param>
  57. </result>
  58. </action>
  59.  
  60. </package>
  61.  
  62. </struts>

struct.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx.xsd">
  15.  
  16. <!-- 配置数据源 -->
  17. <bean name="dataSource"
  18. class="com.mchange.v2.c3p0.ComboPooledDataSource">
  19. <property name="jdbcUrl" value="jdbc:mysqL:///garyssh_forum"></property>
  20. <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
  21. <property name="user" value="root"></property>
  22. <property name="password" value="123456"></property>
  23. </bean>
  24.  
  25. <!-- 配置sessionFactory -->
  26. <bean name="sessionFactory"
  27. class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  28. <property name="dataSource" ref="dataSource"></property>
  29. <property name="hibernateProperties">
  30. <props>
  31. <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
  32. <prop key="hibernate.hbm2ddl.auto">update</prop>
  33. <prop key="hibernate.show_sqp">true</prop>
  34. <prop key="hibernate.format_sql">true</prop>
  35. </props>
  36. </property>
  37.  
  38. <property name="mappingDirectoryLocations"
  39. value="classpath:com/Gary/domain"></property>
  40.  
  41. </bean>
  42.  
  43. <!-- 配置事务的核心管理器 -->
  44. <bean name="transactionManager"
  45. class="org.springframework.orm.hibernate5.HibernateTransactionManager">
  46. <property name="sessionFactory" ref="sessionFactory"></property>
  47. </bean>
  48.  
  49. <!-- 通知 -->
  50. <tx:advice id="advice"
  51. transaction-manager="transactionManager">
  52. <tx:attributes>
  53. <tx:method name="*" />
  54. </tx:attributes>
  55. </tx:advice>
  56.  
  57. <!-- 织入 -->
  58. <aop:config>
  59. <!-- 切入点 -->
  60. <aop:pointcut
  61. expression="execution(* com.Gary.service.*.*(..))" id="pc" />
  62. <!-- 配置切面 切入点+通知 -->
  63. <aop:advisor advice-ref="advice" pointcut-ref="pc" />
  64. </aop:config>
  65.  
  66. <!-- 配置Action -->
  67. <bean name="userAction" class="com.Gary.web.UserAction" scope="prototype">
  68. <property name="userService" ref="userService"></property>
  69. </bean>
  70. <bean name="pasteAction" class="com.Gary.web.PasteAction" scope="prototype">
  71. <property name="pasteService" ref="pasteService"></property>
  72. <property name="answerService" ref="answerService"></property>
  73. </bean>
  74. <bean name="getDataAction" class="com.Gary.web.GetDataAction" scope="prototype">
  75. <property name="pasteService" ref="pasteService"></property>
  76. <property name="userService" ref="userService"></property>
  77. </bean>
  78. <bean name="answerAction" class="com.Gary.web.AnswerAction" scope="prototype">
  79. <property name="answerService" ref="answerService"></property>
  80. <property name="pasteService" ref="pasteService"></property>
  81. </bean>
  82. <bean name="praiseAction" class="com.Gary.web.PraiseAction" scope="prototype">
  83. <property name="answerService" ref="answerService"></property>
  84. <property name="praiseService" ref="praiseService"></property>
  85. </bean>
  86.  
  87. <!-- 配置Service -->
  88. <bean name="userService" class="com.Gary.service.UserService">
  89. <property name="userDao" ref="userDao"></property>
  90. </bean>
  91. <bean name="pasteService" class="com.Gary.service.PasteService">
  92. <property name="pasteDao" ref="pasteDao"></property>
  93. <property name="userDao" ref="userDao"></property>
  94. <property name="answerDao" ref="answerDao"></property>
  95. </bean>
  96. <bean name="answerService" class="com.Gary.service.AnswerService">
  97. <property name="answerDao" ref="answerDao"></property>
  98. <property name="pasteDao" ref="pasteDao"></property>
  99. </bean>
  100. <bean name="praiseService" class="com.Gary.service.PraiseService">
  101. <property name="praiseDao" ref="praiseDao"></property>
  102. </bean>
  103.  
  104. <!-- 配置Dao -->
  105. <bean name="userDao" class="com.Gary.dao.UserDao">
  106. <property name="sessionFactory" ref="sessionFactory"></property>
  107. </bean>
  108. <bean name="pasteDao" class="com.Gary.dao.PasteDao">
  109. <property name="sessionFactory" ref="sessionFactory"></property>
  110. </bean>
  111. <bean name="answerDao" class="com.Gary.dao.AnswerDao">
  112. <property name="sessionFactory" ref="sessionFactory"></property>
  113. </bean>
  114. <bean name="praiseDao" class="com.Gary.dao.PraiseDao">
  115. <property name="sessionFactory" ref="sessionFactory"></property>
  116. </bean>
  117.  
  118. </beans>

application.xml

  前端分析点赞

  用户点赞后,后端处理逻辑及修改数据库的值

  前端点赞

  1. <div class="jieda-reply">
  2.  
  3. <!-- 登录用户点赞了哪些回复 -->
  4. <s:if test="#answer.loginUserIsAgree==0">
  5. <a href="${pageContext.request.contextPath }/PraiseAction_addPraise?answerid=<s:property value="#answer.id" />&pasteid=<s:property value="#paste.id" />">
  6. <span class="jieda-zan" type="zan">
  7. <i class="iconfont icon-zan"></i>
  8. <em>
  9. <s:property value="#answer.agree" />
  10. </em>
  11. </span>
  12. </a>
  13. </s:if>
  14. <s:else>
  15.  
  16. <span class="jieda-zan zanok" type="zan">
  17.  
  18. <i class="iconfont icon-zan"></i>
  19. <em>
  20. <s:property value="#answer.agree" />
  21. </em>
  22. </span>
  23.  
  24. </s:else>

  Web层获得用户点赞后查看帖子详细信息,当用户未登陆时,需用户跳转到登陆界面登陆,当用户成功登陆,则点赞数+1

  1. //查看帖子详细信息
  2. public String getDetail() throws Exception{
  3.  
  4. User user = (User)ActionContext.getContext().getSession().get("user");
  5.  
  6. //得到最近热帖
  7. PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(null);
  8. ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean);
  9.  
  10. //得到最近热议
  11. PageBean ansnumPageBean = pasteService.getAnsnumPageBean(null);
  12. ActionContext.getContext().put("ansnumPageBean", ansnumPageBean);
  13.  
  14. //获得帖子
  15. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  16. ActionContext.getContext().put("paste", paste);
  17.  
  18. //获得该帖子的所有回复
  19. List<Answer> answerList = answerService.findAllAnswerByPasteid(pasteid);
  20. for(Answer answer:answerList)
  21. {
  22. if(user != null)
  23. {
  24. //判断用户是否点赞了该回复
  25. boolean success = praiseService.findPraiseByIdReturnPraise(user.getId(),answer.getId());
  26. if(success)
  27. {
  28. //如果查询到用户点赞了该回复,将loginUserIsAgree设置为1
  29. answer.setLoginUserIsAgree(1);
  30. }
  31. else
  32. {
  33. //如果没有查询到用户点赞了该回复,将loginUserIsAgree设置为0
  34. answer.setLoginUserIsAgree(0);
  35. }
  36. }
  37. else
  38. {
  39. //如果没有登陆,将loginUserIsAgree设置为0
  40. answer.setLoginUserIsAgree(0);
  41. }
  42. }
  43. ActionContext.getContext().put("answerList", answerList);
  44.  
  45. return "detail";
  46. }

  Dao层进行数据库的修改

  1. public void addAnswerAgree(String answerid) {
  2. Answer answer = answerDao.findAnswerById(answerid);
  3. answer.setAgree(answer.getAgree() + 1);
  4. //第二种方式sql
  5. //update answer set agree = agree +1 where answer id = ?
  6. }

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
  39. </span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  40. </span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
  41. </span> </span>
  42. <div class="fly-list-hint">
  43. <i class="iconfont" title="回答"></i>
  44. <s:property value="#paste.ansnum" />
  45. </div>
  46. </div>
  47. <div class="detail-about">
  48. <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" /> 发布
  49. </em>
  50. </cite>
  51. </a>
  52. <div class="detail-hits" data-id="{{rows.id}}">
  53. <span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
  54. </span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
  55. </span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
  56. </span>
  57.  
  58. </div>
  59. </div>
  60. <div class="detail-body photos" style="margin-bottom: 20px;">
  61. <p>
  62. <s:property value="#paste.content" />
  63. </p>
  64. </div>
  65. </div>
  66.  
  67. <div class="fly-panel detail-box" style="padding-top: 0;">
  68. <a name="comment"></a>
  69. <ul class="jieda photos" id="jieda">
  70. <!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  71. <div class="detail-about detail-about-reply">
  72. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
  73. <em style="color:#5FB878">(管理员)</em>
  74. </cite>
  75. </a>
  76. <div class="detail-hits">
  77. <span>3分钟前</span>
  78. </div>
  79. <i class="iconfont icon-caina" title="最佳答案"></i>
  80. </div>
  81. <div class="detail-body jieda-body">
  82. <p>么么哒</p>
  83. </div>
  84. <div class="jieda-reply">
  85. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  86. <!-- <div class="jieda-admin">
  87. <span type="del">删除</span>
  88. <span class="jieda-accept" type="accept">采纳</span>
  89. </div>
  90. </div></li> -->
  91.  
  92. <s:iterator value="#answerList" var="answer">
  93. <li data-id="13"><a name="item-121212121212"></a>
  94. <div class="detail-about detail-about-reply">
  95. <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>
  96. </cite>
  97. </a>
  98. <div class="detail-hits">
  99. <span> <s:property value="#answer.anstime" />
  100. </span>
  101. </div>
  102. <s:if test="#answer.id==#paste.answerid">
  103. <i class="iconfont icon-caina" title="最佳答案"></i>
  104. </s:if>
  105. </div>
  106. <div class="detail-body jieda-body">
  107. <p>
  108. <s:property value="#answer.content" />
  109. </p>
  110. </div>
  111. <div class="jieda-reply">
  112.  
  113. <!-- 登录用户点赞了哪些回复 -->
  114. <s:if test="#answer.loginUserIsAgree==0">
  115. <a href="${pageContext.request.contextPath }/PraiseAction_addPraise?answerid=<s:property value="#answer.id" />&pasteid=<s:property value="#paste.id" />">
  116. <span class="jieda-zan" type="zan">
  117. <i class="iconfont icon-zan"></i>
  118. <em>
  119. <s:property value="#answer.agree" />
  120. </em>
  121. </span>
  122. </a>
  123. </s:if>
  124. <s:else>
  125.  
  126. <span class="jieda-zan zanok" type="zan">
  127.  
  128. <i class="iconfont icon-zan"></i>
  129. <em>
  130. <s:property value="#answer.agree" />
  131. </em>
  132. </span>
  133.  
  134. </s:else>
  135.  
  136. <div class="jieda-admin">
  137. <s:if test="#session.user.username==#answer.user.username && #paste.answerid!=#answer.id">
  138. <span type="del">
  139. <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>
  140. </span>
  141. </s:if>
  142. <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  143. <span class="jieda-accept" type="accept">
  144. <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>
  145. </span>
  146. </s:if>
  147. </div>
  148. </div></li>
  149. </s:iterator>
  150. <s:if test="#answerList.size()==0">
  151. <li class="fly-none">没有任何回答</li>
  152. </s:if>
  153. </ul>
  154. <div class="layui-form layui-form-pane">
  155. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  156. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  157. <div class="layui-form-item layui-form-text">
  158. <div class="layui-input-block">
  159. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  160. </div>
  161. </div>
  162. <div class="layui-form-item">
  163. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  164. </div>
  165. </form> -->
  166. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  167. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>"> <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
  168. <div style="margin-left: -580px">回答问题:</div>
  169. </label>
  170. <div class="layui-form-item layui-form-text">
  171. <div class="layui-input-block">
  172. <div class="editor">
  173. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  174. </div>
  175. </div>
  176.  
  177. </div>
  178.  
  179. <div class="layui-form-item">
  180. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  181. </div>
  182. </form>
  183. </div>
  184. </div>
  185. </div>
  186. </div>
  187.  
  188. <div class="edge">
  189. <dl class="fly-panel fly-list-one">
  190. <dt class="fly-panel-title">最近热帖</dt>
  191. <s:iterator value="#glanceoverPageBean.list" var="paste">
  192. <dd>
  193.  
  194. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  195. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  196. </span>
  197. </dd>
  198. </s:iterator>
  199. </dl>
  200.  
  201. <dl class="fly-panel fly-list-one">
  202. <dt class="fly-panel-title">近期热议</dt>
  203. <s:iterator value="#ansnumPageBean.list" var="paste">
  204. <dd>
  205. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  206. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  207. </span>
  208. </dd>
  209. </s:iterator>
  210. </dl>
  211. </div>
  212. </div>
  213.  
  214. <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  215. <script type="text/javascript">
  216. KE.show({
  217. id : 'L_content',
  218. resizeMode : 1,
  219. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  220. 'italic', 'underline', 'removeformat', 'justifyleft',
  221. 'justifycenter', 'justifyright', 'insertorderedlist',
  222. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  223. });
  224. </script> --%>
  225. <script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
  226. <script type="text/javascript">
  227. KE.show({
  228. id : 'content',
  229. resizeMode : 1,
  230. cssPath : './index.css',
  231. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  232. 'italic', 'underline', 'removeformat', 'justifyleft',
  233. 'justifycenter', 'justifyright', 'insertorderedlist',
  234. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  235. });
  236. </script>
  237. <script>
  238. layui.cache.page = '';
  239. layui.cache.user = {
  240. username : '游客',
  241. uid : -1,
  242. avatar : '../res/images/avatar/00.jpg',
  243. experience : 83,
  244. sex : '男'
  245. };
  246. layui.config({
  247. version : "2.0.0",
  248. base : '../res/mods/'
  249. }).extend({
  250. fly : 'index'
  251. }).use('fly');
  252. </script>
  253. </body>
  254. </html>

detail.jsp

  1. package com.Gary.web;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.List;
  6.  
  7. import com.Gary.domain.Answer;
  8. import com.Gary.domain.Paste;
  9. import com.Gary.domain.User;
  10. import com.Gary.service.AnswerService;
  11. import com.Gary.service.PasteService;
  12. import com.Gary.service.PraiseService;
  13. import com.Gary.utils.PageBean;
  14. import com.opensymphony.xwork2.ActionContext;
  15. import com.opensymphony.xwork2.ActionSupport;
  16. import com.opensymphony.xwork2.ModelDriven;
  17.  
  18. public class PasteAction extends ActionSupport implements ModelDriven<Paste> {
  19.  
  20. public Paste paste = new Paste();
  21. private String pasteid;
  22.  
  23. private PasteService pasteService;
  24. private AnswerService answerService;
  25. private PraiseService praiseService;
  26. //解决帖子
  27. public String solvePaste() throws Exception{
  28.  
  29. pasteService.solvePasteByIdAndAnswerid(pasteid,paste.getAnswerid());
  30. ActionContext.getContext().put("pasteid", pasteid);
  31.  
  32. return "toDetail";
  33. }
  34.  
  35. //查看帖子详细信息
  36. public String getDetail() throws Exception{
  37.  
  38. User user = (User)ActionContext.getContext().getSession().get("user");
  39.  
  40. //得到最近热帖
  41. PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(null);
  42. ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean);
  43.  
  44. //得到最近热议
  45. PageBean ansnumPageBean = pasteService.getAnsnumPageBean(null);
  46. ActionContext.getContext().put("ansnumPageBean", ansnumPageBean);
  47.  
  48. //获得帖子
  49. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  50. ActionContext.getContext().put("paste", paste);
  51.  
  52. //获得该帖子的所有回复
  53. List<Answer> answerList = answerService.findAllAnswerByPasteid(pasteid);
  54. for(Answer answer:answerList)
  55. {
  56. if(user != null)
  57. {
  58. //判断用户是否点赞了该回复
  59. boolean success = praiseService.findPraiseByIdReturnPraise(user.getId(),answer.getId());
  60. if(success)
  61. {
  62. //如果查询到用户点赞了该回复,将loginUserIsAgree设置为1
  63. answer.setLoginUserIsAgree(1);
  64. }
  65. else
  66. {
  67. //如果没有查询到用户点赞了该回复,将loginUserIsAgree设置为0
  68. answer.setLoginUserIsAgree(0);
  69. }
  70. }
  71. else
  72. {
  73. //如果没有登陆,将loginUserIsAgree设置为0
  74. answer.setLoginUserIsAgree(0);
  75. }
  76. }
  77. ActionContext.getContext().put("answerList", answerList);
  78.  
  79. return "detail";
  80. }
  81.  
  82. public PraiseService getPraiseService() {
  83. return praiseService;
  84. }
  85.  
  86. public void setPraiseService(PraiseService praiseService) {
  87. this.praiseService = praiseService;
  88. }
  89.  
  90. public AnswerService getAnswerService() {
  91. return answerService;
  92. }
  93.  
  94. public void setAnswerService(AnswerService answerService) {
  95. this.answerService = answerService;
  96. }
  97.  
  98. //添加帖子
  99. public String addPaste() throws Exception {
  100. User user = (User)ActionContext.getContext().getSession().get("user");
  101.  
  102. if(user==null)
  103. {
  104. ActionContext.getContext().put("error", "只有登陆之后才可以发帖子!!");
  105. return "error";
  106. }
  107.  
  108. //private Integer ansnum;
  109. paste.setAnsnum(0);
  110. //private String createtime;
  111. Date date = new Date(System.currentTimeMillis());
  112. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  113. String createtime = format.format(date);
  114. paste.setCreatetime(createtime);
  115. //private Integer glanceover;
  116. paste.setGlanceover(0);
  117. //是否结帖 0未结 1结束
  118. //private Integer solve;
  119. paste.setSolve(0);
  120. //private Integer isdelete;
  121. paste.setIsdelete(0);
  122. //private User user;
  123.  
  124. paste.setUser(user);
  125.  
  126. pasteService.addPaste(paste);
  127.  
  128. //重定向到主页
  129. return "toIndex";
  130. }
  131.  
  132. public PasteService getPasteService() {
  133. return pasteService;
  134. }
  135.  
  136. public void setPasteService(PasteService pasteService) {
  137. this.pasteService = pasteService;
  138. }
  139.  
  140. @Override
  141. public Paste getModel() {
  142. // TODO Auto-generated method stub
  143. return paste;
  144. }
  145.  
  146. public String getPasteid() {
  147. return pasteid;
  148. }
  149.  
  150. public void setPasteid(String pasteid) {
  151. this.pasteid = pasteid;
  152. }
  153.  
  154. }

PasteAction.java

  1. package com.Gary.service;
  2.  
  3. import com.Gary.dao.PraiseDao;
  4. import com.Gary.domain.Praise;
  5.  
  6. public class PraiseService {
  7.  
  8. private PraiseDao praiseDao;
  9.  
  10. public boolean findPraiseByIdReturnPraise(String userid, String answerid) {
  11. Praise praise = praiseDao.findPraiseByIdReturnPraise(userid,answerid);
  12. return praise==null?false:true;
  13. }
  14.  
  15. public void addPraise(Praise praise) {
  16. praiseDao.addPraise(praise);
  17.  
  18. }
  19.  
  20. public PraiseDao getPraiseDao() {
  21. return praiseDao;
  22. }
  23.  
  24. public void setPraiseDao(PraiseDao praiseDao) {
  25. this.praiseDao = praiseDao;
  26. }
  27.  
  28. }

praiseService.java

  1. package com.Gary.web;
  2.  
  3. import com.Gary.domain.Answer;
  4. import com.Gary.domain.Praise;
  5. import com.Gary.domain.User;
  6. import com.Gary.service.AnswerService;
  7. import com.Gary.service.PraiseService;
  8. import com.Gary.vo.PrimaryKey;
  9. import com.opensymphony.xwork2.ActionContext;
  10. import com.opensymphony.xwork2.ActionSupport;
  11.  
  12. public class PraiseAction extends ActionSupport{
  13.  
  14. private String answerid;
  15. private String pasteid;
  16. private AnswerService answerService;
  17. private PraiseService praiseService;
  18.  
  19. public String getPasteid() {
  20. return pasteid;
  21. }
  22.  
  23. public void setPasteid(String pasteid) {
  24. this.pasteid = pasteid;
  25. }
  26.  
  27. //添加赞
  28. public String addPraise() throws Exception{
  29.  
  30. //肯定可以获得(用户未登录不能点赞,只有登录后才可以点赞)
  31. User user = (User) ActionContext.getContext().getSession().get("user");
  32.  
  33. if(user == null)
  34. {
  35. ActionContext.getContext().put("error", "未登录不允许点赞!!");
  36. return "error";
  37. }
  38. //根据answerid查找Answer对象
  39. Answer answer = answerService.findAnswerByIdReturnAnswer(answerid);
  40. //申明联合主键
  41. PrimaryKey primaryKey = new PrimaryKey();
  42. //放置对象
  43. primaryKey.setAnswer(answer);
  44. primaryKey.setUser(user);
  45. //创建赞的类
  46. Praise praise = new Praise();
  47. //将联合主键放入类的对象中
  48. praise.setPrimaryKey(primaryKey);
  49.  
  50. praiseService.addPraise(praise);
  51. answerService.addAnswerAgree(answerid);
  52.  
  53. ActionContext.getContext().put("pasteid", pasteid);
  54. return "toDetail";
  55. }
  56.  
  57. public AnswerService getAnswerService() {
  58. return answerService;
  59. }
  60.  
  61. public void setAnswerService(AnswerService answerService) {
  62. this.answerService = answerService;
  63. }
  64.  
  65. public PraiseService getPraiseService() {
  66. return praiseService;
  67. }
  68.  
  69. public void setPraiseService(PraiseService praiseService) {
  70. this.praiseService = praiseService;
  71. }
  72.  
  73. public String getAnswerid() {
  74. return answerid;
  75. }
  76.  
  77. public void setAnswerid(String answerid) {
  78. this.answerid = answerid;
  79. }
  80.  
  81. }

PraiseAction.java

  1. package com.Gary.service;
  2.  
  3. import java.util.List;
  4.  
  5. import com.Gary.dao.AnswerDao;
  6. import com.Gary.dao.PasteDao;
  7. import com.Gary.domain.Answer;
  8. import com.Gary.domain.Paste;
  9.  
  10. public class AnswerService {
  11.  
  12. private AnswerDao answerDao;
  13. private PasteDao pasteDao;
  14.  
  15. public void addAnswerAgree(String answerid) {
  16. Answer answer = answerDao.findAnswerById(answerid);
  17. answer.setAgree(answer.getAgree() + 1);
  18. //第二种方式sql
  19. //update answer set agree = agree +1 where answer id = ?
  20. }
  21.  
  22. //根据answerid查找answer对象
  23. public Answer findAnswerByIdReturnAnswer(String answerid) {
  24. Answer answer = answerDao.findAnswerById(answerid);
  25.  
  26. return answer;
  27. }
  28.  
  29. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  30.  
  31. Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
  32. List<Answer> answerList = null;
  33. // 判断paste中的solve是否为1
  34. if (paste.getSolve() == 1) {
  35. // 查找最佳答案
  36. Answer answer = answerDao.findAnswerById(paste.getAnswerid());
  37. // 查找所有答案
  38. answerList = answerDao.findAllAnswerByPasteid(pasteid);
  39. // 查找所有答案中包括了最佳答案所以将最佳答案删除
  40. answerList.remove(answer);
  41. // 在头元素中插入最佳答案
  42. answerList.add(0, answer);
  43. } else {
  44. answerList = answerDao.findAllAnswerByPasteid(pasteid);
  45. }
  46.  
  47. return answerList;
  48. }
  49.  
  50. public void addAnswer(Answer answer, Paste paste) {
  51.  
  52. paste.setAnsnum(paste.getAnsnum() + 1);
  53. answerDao.addAnswer(answer);
  54. }
  55.  
  56. public void deleteAnswerById(String answerid, Paste paste) {
  57. paste.setAnsnum(paste.getAnsnum()-1);
  58. answerDao.deleteAnswerById(answerid);
  59. }
  60.  
  61. public AnswerDao getAnswerDao() {
  62. return answerDao;
  63. }
  64.  
  65. public void setAnswerDao(AnswerDao answerDao) {
  66. this.answerDao = answerDao;
  67. }
  68.  
  69. public PasteDao getPasteDao() {
  70. return pasteDao;
  71. }
  72.  
  73. public void setPasteDao(PasteDao pasteDao) {
  74. this.pasteDao = pasteDao;
  75. }
  76.  
  77. }

AnserService.java

JavaWeb_(SSH论坛)_六、点赞模块的更多相关文章

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

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

  2. JavaWeb_(SSH论坛)_五、帖子模块

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

  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. Python学习系列(六)(模块)

    Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: ...

  9. Flutter实战视频-移动电商-15.首页_商品推荐模块编写

    15.首页_商品推荐模块编写 商品推荐,我们做成可以横向滚动的 分析: 上面是标题,下面是ListView,里面是一个Column, column分三层,第一是图片,第二是价格,第三是市场价格 小细节 ...

随机推荐

  1. liunx忘记用户密码

    1.vim /etc/my.cnf [mysqld] skip-grant-tables ##追加此行,跳过权限表, 2.重启mysql systemctl restart mysqld 3.mysq ...

  2. 多进程-Pool进程池

    from multiprocessing import Pool import os,time def Foo(i): time.sleep(2) print("in process&quo ...

  3. 编译LAMP部署动态网站环境

    LAMP动态网站部署架构是由一套 Linux+Apache+MySQL+PHP 组成的动态网站系统解决方案. 以下配置环境为:Linux=RHEL7 --> Apache=2.4.33 --&g ...

  4. 删除链表中重复的结点——牛客剑指offer

    题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...

  5. ASP.NET配置KindEditor文本编辑器

    文本编辑器:CKEditor和CKFinder  KindEditor 1.KindEditor KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开 ...

  6. debezium关于cdc的使用(下)

    博文原址:debezium关于cdc的使用(下) 简介 debezium在debezium关于cdc的使用(上)中有做介绍.具体可以跳到上文查看.本篇主要讲述使用kafka connector方式来同 ...

  7. TensorFlow入门——bazel编译(带GPU)

    这一系列基本上是属于我自己进行到了那个步骤就做到那个步骤的 由于新装了GPU (GTX750ti)和CUDA9.0.CUDNN7.1版本的软件,所以希望TensorFlow能在GPU上运行,也算上补上 ...

  8. poj 1007 DNA sorting (qsort)

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 95209   Accepted: 38311 Des ...

  9. 2.(基础)tornado的请求与响应

    之前我们介绍了tornado 的基础流程,但是还遗留了一些问题,今天我们就来解决这些遗留问题并学习新的内容 settings,使用tornado.web.Application(handler, ** ...

  10. or/in/union与索引优化

    假设订单业务表结构为: order(oid, date, uid, status, money, time, …) 其中: oid,订单ID,主键 date,下单日期,有普通索引,管理后台经常按照da ...