1.做下论坛的笔记
2.效果如下:
3.我们从最简单的开始做,也就是模块管理,他跟Role管理相似,只是多了上移和下移的功能
4.首先分析多少个请求,前面写过CRUD一共6个请求,所以需要6个方法,再加上上移下移所以ForumAction应该有8个方法
5.设计实体Forum先不考虑和其他表的关联,他自身的属性,代码如下:(此处给出整个论坛设计的UML图)
Forum(上移和下移功能,设计思想是这样的,创建一个int的用于交换位置的position,上移下移其实就是将数据库表的一行记录交换下位置,但是必须考虑的是position的值如何赋予?下面再说)
package com.icss.oa.domain; public class Forum { private Long id; private String name; private String description; private int position; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } }
6.根据实体类写出对应的hbm文件,记得在hibernate文件中加上映射
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.icss.oa.domain"> <class name="Forum" table="t_forum"> <id name="id" > <generator class="native" /> </id> <property name="name" > <column name="forum_name" /> </property> <property name="description" > <column name="forum_description" /> </property> <property name="position" > <column name="forum_position" /> </property> </class> </hibernate-mapping>
7.设计Action中的方法(记得在BaseAction中加入ForumService并且在Action加上注解)
package com.icss.oa.view.action; import java.util.List; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.icss.oa.base.BaseAction; import com.icss.oa.domain.Forum; import com.icss.oa.domain.Role; import com.opensymphony.xwork2.ActionContext; @SuppressWarnings("serial") @Controller @Scope("prototype") public class ForumManageAction extends BaseAction<Forum> { //列表方法 public String list() throws Exception { List<Forum> forumList=forumService.findAll(); ActionContext.getContext().put("forumList", forumList); return "list"; } //删除方法 public String delete() throws Exception { forumService.delete(model.getId()); return "toList"; } //增加页面方法 public String addUI() throws Exception { return "saveUI"; } //增加方法 public String add() throws Exception { forumService.save(model); return "toList"; } //修改页面方法 public String editUI() throws Exception { //回显数据 Forum forum=forumService.getById(model.getId()); ActionContext.getContext().getValueStack().push(forum); return "saveUI"; } //修改方法 public String edit() throws Exception { //从数据库中拿出原有的对象 Forum forum=forumService.getById(model.getId()); //修改属性 forum.setName(model.getName()); forum.setDescription(model.getDescription()); //保存 forumService.save(forum); return "toList"; } //向上移动方法 public String moveUp() throws Exception { forumService.moveUp(model.getId()); return "toList"; } //向下移动方法 public String moveDown() throws Exception { forumService.moveDown(model.getId()); return "toList"; } }
8.方法都差不多所有的回显都加上了功能齐全,记得在struts2.xml中加入jsp回显的结果,下移和上移功能是自己的特殊方法,在ForumServiceImpl文件中实现代码如下:
很多很多的注意点:① 这里需要重写findAll()和save()方法,因为查询需要根据position的value来排序
② 如何为position赋值,利用数据库各自生成主键的策略,每生成一条记录就将forum的id值赋给position,因为id不会重复,而且是自增的每一 次都能保证position的值是最大的
③ 注意SQL语句的优化,如下图:这下面2条效果都是取出当前position的上一条记录,效率相差很大,尽量少用子查询
int position
要求:
显示时按position升序排序。
position的值不能重复,在添加时要指定一个位置号,要是当前最大值再加1。
上移下移就是与上面或下面的Forum交换position的值。
package com.icss.oa.service.impl; import java.util.List; import org.springframework.stereotype.Service; import com.icss.oa.base.BaseDaoImpl; import com.icss.oa.domain.Forum; import com.icss.oa.service.ForumService; @Service @SuppressWarnings("unchecked") public class ForumServiceImpl extends BaseDaoImpl<Forum> implements ForumService { @Override public List<Forum> findAll() { return getSession().createQuery(// "FROM Forum f ORDER BY f.position ASC")// .list(); } @Override public void save(Forum forum) { // 保存到DB,会生成Id的值 getSession().save(forum); // 指定position的值为最大 // SELECT MAX(f.position) FROM Forum f forum.setPosition(forum.getId().intValue()); // 因为是持久化状态,所以不需要调用update()方法。 } public void moveUp(Long id) { // 获取要交换的两个Forum Forum forum = getById(id); // 当前操作的Forum Forum other = (Forum) getSession().createQuery(// 我上面的那个Forum "FROM Forum f WHERE f.position<? ORDER BY f.position DESC")// .setParameter(0, forum.getPosition())// .setFirstResult(0)// .setMaxResults(1)// .uniqueResult(); // 最上面的不能上移 if (other == null) { return; } // 交换position的值 int temp = forum.getPosition(); forum.setPosition(other.getPosition()); other.setPosition(temp); // 更新到数据库中 // 因为是持久化状态,所以不需要调用update()方法。 } public void moveDown(Long id) { // 获取要交换的两个Forum Forum forum = getById(id); // 当前操作的Forum Forum other = (Forum) getSession().createQuery(// 我下面的那个Forum "FROM Forum f WHERE f.position>? ORDER BY f.position ASC")// .setParameter(0, forum.getPosition())// .setFirstResult(0)// .setMaxResults(1)// .uniqueResult(); // 最下面的不能下移 if (other == null) { return; } // 交换position的值 int temp = forum.getPosition(); forum.setPosition(other.getPosition()); other.setPosition(temp); // 更新到数据库中 // 因为是持久化状态,所以不需要调用update()方法。 } }
9.至此论坛模块管理功能全部实现。
10.还记得写好jsp页面,都差不多就是在静态页面上改下标签,迭代取值等等操作,代码如下:
list.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ include file="/WEB-INF/jsp/public/common.jspf" %> <html> <head> <title>版块列表</title> <%@ include file="/WEB-INF/jsp/public/common.jspf" %> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script language="javascript" src="${pageContext.request.contextPath}script/jquery.js"></script> <script language="javascript" src="${pageContext.request.contextPath}script/pageCommon.js" charset="utf-8"></script> <script language="javascript" src="${pageContext.request.contextPath}script/PageUtils.js" charset="utf-8"></script> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}style/blue/pageCommon.css" /> <script type="text/javascript"> </script> </head> <body> <div id="Title_bar"> <div id="Title_bar_Head"> <div id="Title_Head"></div> <div id="Title"><!--页面标题--> <img border="0" width="13" height="13" src="${pageContext.request.contextPath}style/images/title_arrow.gif"/> 版块管理 </div> <div id="Title_End"></div> </div> </div> <div id="MainArea"> <table cellspacing="0" cellpadding="0" class="TableStyle"> <!-- 表头--> <thead> <tr align="CENTER" valign="MIDDLE" id="TableTitle"> <td width="250px">版块名称</td> <td width="300px">版块说明</td> <td>相关操作</td> </tr> </thead> <!--显示数据列表--> <tbody id="TableData" class="dataContainer" datakey="forumList"> <s:iterator value="#forumList"> <tr class="TableDetail1 template"> <td>${name} </td> <td>${description} </td> <td><s:a action="forumManageAction_delete?id=%{id}" onClick="return delConfirm()" >删除</s:a> <s:a action="forumManageAction_editUI?id=%{id}" >修改</s:a> <s:a action="forumManageAction_moveUp?id=%{id}" >上移</s:a> <s:a action="forumManageAction_moveDown?id=%{id}" >下移</s:a> </td> </tr> </s:iterator> </tbody> </table> <!-- 其他功能超链接 --> <div id="TableTail"> <div id="TableTail_inside"> <s:a action="forumManageAction_addUI}" ><img src="${pageContext.request.contextPath}style/images/createNew.png" /></s:a> </div> </div> </div> <div class="Description"> 说明:<br /> 1,显示的列表按其sortOrder值升序排列。<br /> 2,可以通过上移与下移功能调整顺序。最上面的不能上移,最下面的不能下移。<br /> </div> </body> </html>
saveUi.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ include file="/WEB-INF/jsp/public/common.jspf" %> <html> <head> <title>版块设置</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="${pageContext.request.contextPath}script/jquery.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}script/pageCommon.js" charset="utf-8"></script> <script type="text/javascript" src="${pageContext.request.contextPath}script/PageUtils.js" charset="utf-8"></script> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}style/blue/pageCommon.css" /> <script type="text/javascript"> </script> </head> <body> <!-- 标题显示 --> <div id="Title_bar"> <div id="Title_bar_Head"> <div id="Title_Head"></div> <div id="Title"><!--页面标题--> <img border="0" width="13" height="13" src="${pageContext.request.contextPath}style/images/title_arrow.gif"/> 版块设置 </div> <div id="Title_End"></div> </div> </div> <!--显示表单内容--> <div id="MainArea"> <s:form action="forumManageAction_%{id == null ? 'add' : 'edit'}"> <s:hidden name="id"></s:hidden> <div class="ItemBlock_Title1"><!-- 信息说明<DIV CLASS="ItemBlock_Title1"> <IMG BORDER="0" WIDTH="4" HEIGHT="7" SRC="${pageContext.request.contextPath}style/blue/images/item_point.gif" /> 版块信息 </DIV> --> </div> <!-- 表单内容显示 --> <div class="ItemBlockBorder"> <div class="ItemBlock"> <table cellpadding="0" cellspacing="0" class="mainForm"> <tr> <td width="100">版块名称</td> <td><s:textfield name="name" cssClass="InputStyle" /> *</td> </tr> <tr> <td>版块说明</td> <td><s:textarea name="description" cssClass="TextareaStyle"></s:textarea></td> </tr> </table> </div> </div> <!-- 表单操作 --> <div id="InputDetailBar"> <input type="image" src="${pageContext.request.contextPath}style/images/save.png"/> <a href="javascript:history.go(-1);"><img src="${pageContext.request.contextPath}style/images/goBack.png"/></a> </div> </s:form> </div> <div class="Description"> 说明:<br /> 1,新添加的版块默认显示在最下面。<br /> </div> </body> </html>