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>
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>