其实上移下移的思想分几步:

核心思想:交换两个记录的位置字段的值。

问题:如何根据当前记录,找到前一个或者后一个的记录的位置。

第一:在java类属性定义一个position位置字段,不同的位置position的值不同。

第二:前台页面显示移动的效果是查询的时候,根据position的升序查询显示出来的。所以要重写查询方法。

第三:当点击按钮的时候,可以获取该记录的id,根据id获取该记录的对象的position。然后通过查询语句获取前一个或者后一个记录

第四:如何保证在添加新的信息的时候,position的值不会重复。这里很巧妙:根据id的值来设置position的值。


package cn.itcast.oa.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import cn.itcast.oa.base.DaoSupportImpl;
import cn.itcast.oa.domain.ForumManage;
import cn.itcast.oa.service.ForumManageService;
@Service
@Transactional
public class ForumManageServiceImpl extends DaoSupportImpl<ForumManage> implements ForumManageService {
/*实现上下移动的操作,页面如何更新已经改过的信息呢,因为之前的findAll查询没有条件的,没有排序的,而我们这个列表是根据postion来进行排序展示的
子类继承父类的方法,可以重写父类的方法以实现自己的功能.子类重写了父类,就执行自己的方法了。
*/ @Override
public List<ForumManage> findAll() {
return getSession().createQuery("FROM ForumManage ORDER BY position ").list();
} //当添加一个新的记录时,position的值是不能重复的,这里的方法很巧妙,根据id来保存position的值,id为什么,position就是什么,这样子就不会重复了
@Override
public void save(ForumManage forum) {
super.save(forum);
//先保存了对象后,根据id来保存position的值,这样就不会重复了
forum.setPosition(forum.getId().intValue());
} @Override
public void moveUp(Long id) {
/*jsp页面上的上移下移功能实现:
* 分析:上下移动每条记录是针对记录的位置进行的移动,所以这里我们在java类中的字段中设置一个position位置来记录每条记录的位置信息。
* 而想要交换两条记录,只要将这两条记录的位置信息交换,然后利用查询的时候order by来进行查询,就可以将两条记录来交换。
* 第一步:之前我们写的查询方法是无条件查询,这里的查询是有条件的查询,所以需要重写父的findAll方法,否则数据库改了,页面是不会改变的。
* (关于子类继承父类,这个可以联想生活中的父子关系,子类继承了父类的某个特点,将这个特点修改了下成了自己特有的,所以重写是先使用自己的特点)
* 第二步:当我们点击上下移动按钮时,这时候页面传递是改记录的id信息,根据id信息来获取当前的对象。
* 第三步:如何获取当前记录之前的或者之后的记录呢。这是问题的关键:即如何获取前一个或者后一个对象。
* 第四步:将第一步和第二步的对象position信息进行交换,然后更新到数据库。
* 子类继承父类,调用父类的方法:直接拿过来用即可,即在子类中直接写父类的方法就可以。比如我们要使用爸爸的东西,我们不用汇报,而使用别人的东西需要汇报说一声。这个汇报就是先声明一个对象
* */
//当前对象和前面一个或者后面一个对象的获取,当前对象通过id获取,后面一个对象通过查询语句获取
ForumManage forum= getById(id);
ForumManage other=null;
//这是查询上下对象的方法:select * from itcast_forumManage where position<当前的对象的位置 order by position DESC limit 0,1
other=(ForumManage) getSession().createQuery(//
"FROM ForumManage WHERE position < ? ORDER BY position DESC ")
.setParameter(0,forum.getPosition())
.setFirstResult(0)
.setMaxResults(1)
.uniqueResult();
//最上面的一个不能上移
if (other==null) {
return; }
//获取到了前面一个对象后,得到该对象的位置,将两者的位置进行交换,注意这里需要用到第三方来转接
Integer temp=null;
temp=forum.getPosition();
forum.setPosition(other.getPosition());
other.setPosition(temp);
//交换之后,更新到数据库,
getSession().update(forum);
getSession().update(other); }
//下移跟上移的原理是一样的
@Override
public void moveDown(Long id) {
//当前对象和前面一个或者后面一个对象的获取,当前对象通过id获取,后面一个对象通过查询语句获取
ForumManage forum= getById(id);
ForumManage other=null;
//这是查询上下对象的方法:select * from itcast_forumManage where position<当前的对象的位置 order by position DESC limit 0,1
other=(ForumManage) getSession().createQuery(//
"FROM ForumManage WHERE position > ? ORDER BY position ")
.setParameter(0,forum.getPosition())
.setFirstResult(0)
.setMaxResults(1)
.uniqueResult();
//最下面的一个不能下移
if (other==null) {
return; }
//获取到了前面一个对象后,得到该对象的位置,将两者的位置进行交换,注意这里需要用到第三方来转接
Integer temp=null;
temp=forum.getPosition();
forum.setPosition(other.getPosition());
other.setPosition(temp);
//交换之后,更新到数据库,
getSession().update(forum);
getSession().update(other); } }

  上下移动功能,记录在最上面的时候将上移的图片为灰色,最下面的时候下移的图标为灰色的实现:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>版块列表</title>
<%@ include file="/WEB-INF/jsp/public/commons.jspf" %>
<style type="text/css">
.disabled{
color: gray;
cursor: pointer;
}
</style>
</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">
<!-- status是循环里面的标签,里面包含了first和last标签 -->
<s:iterator value="#forumList" status="status"> <tr class="TableDetail1 template">
<td>${name} </td>
<td>${description} </td>
<td>
<s:a action="forumManage_delete?id=%{id}" onclick="return delConfirm()">删除</s:a>
<s:a action="forumManage_editUI?id=%{id}">修改</s:a> <!-- 最上面的不能上移 -->
<s:if test="#status.first">
<span class="disabled">上移</span>
</s:if>
<s:else>
<s:a action="forumManage_moveUp?id=%{id}">上移</s:a>
</s:else> <!-- 最下面的不能下移 -->
<s:if test="#status.last">
<span class="disabled">下移</span>
</s:if>
<s:else>
<s:a action="forumManage_moveDown?id=%{id}">下移</s:a>
</s:else> </td>
</tr>
</s:iterator> </tbody>
</table> <!-- 其他功能超链接 -->
<div id="TableTail">
<div id="TableTail_inside">
<s:a action="forumManage_addUI"><img src="${pageContext.request.contextPath}/style/images/createNew.png" /></s:a>
</div>
</div>
</div> <div class="Description">
说明:<br />
1,显示的列表按其位置排列。<br />
2,可以通过上移与下移功能调整顺序。最上面的不能上移,最下面的不能下移。<br />
</div> </body>
</html>

 

web系统中上下移动功能的实现的更多相关文章

  1. (系统架构)标准Web系统的架构分层

    标准Web系统的架构分层 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层 ...

  2. Web系统大规模并发——电商秒杀与抢购

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

  3. Web系统的常用测试方法

    在51上看到一篇不错的文章,拿过来分享一下,学习学习! Web系统的常用测试方法如下: 1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确. 2. 相关性检查:删除/增加一项会不会 ...

  4. 大型web系统数据缓存设计

    1. 前言 在高访问量的web系统中,缓存几乎是离不开的:但是一个适当.高效的缓存方案设计却并不容易:所以接下来将讨论一下应用系统缓存的设计方面应该注意哪些东西,包括缓存的选型.常见缓存系统的特点和数 ...

  5. 亿级 Web 系统的容错性建设实践

    一. 重试机制 最容易也最简单被人想到的容错方式,当然就是“失败重试”,总而言之,简单粗暴!简单是指它的实现通常很简单,粗暴则是指使用不当,很可能会带来系统“雪崩”的风险,因为重试意味着对后端服务的双 ...

  6. 亿级Web系统搭建——单机到分布式集群

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  7. 转:亿级Web系统的高容错性实践(好博文)

    亿级Web系统的高容错性实践 亿级Web系统的高容错性实践 背景介绍 大概三年前,我在腾讯负责的活动运营系统,因为业务流量规模的数倍增长,系统出现了各种各样的异常,当时,作为开发的我,7*24小时地没 ...

  8. Web系统大规模并发——电商秒杀与抢购 【转】

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

  9. 标准Web系统的架构分层

    标准Web系统的架构分层 – 转载请注明出处 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求 ...

随机推荐

  1. ConcurrentHashMap(JDK1.8)为什么要放弃Segment

    今天看到一篇博客:jdk1.8的HashMap和ConcurrentHashMap,我想起了前段时间面试的一个问题:ConcurrentHashMap(JDK1.8)为什么要使用synchronize ...

  2. 食物链 POJ 1182(种类并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  3. “Hello World!”团队第五周第一次会议

    今天是我们团队“Hello World!”团队第五周召开的第一次会议,欢迎我们的新小伙伴刘耀泽同学.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议 ...

  4. HDU 5179 beautiful number 数位dp

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

  5. JS 中substring() , substr(), slice() 的区别

    substr(start, length) : 截取从start索引开始的字符,长度为length的字符串 substring(start, end) : 截取从start索引开始的字符,以end索引 ...

  6. float精度丢失的问题

    在做IPTV的时候,遇到以下这个问题: 现有一个float型数据,以下代码打印输出: float n = 40272.48f; System.out.println(new Double(n * 10 ...

  7. jQuery之_元素滚动

    对应的知识点铺垫,但是有一个很重要的问题就是兼容IE和chorme的 1. scrollTop(): 读取/设置滚动条的Y坐标2. $(document.body).scrollTop()+$(doc ...

  8. 蜗牛慢慢爬 LeetCode 1.Two Sum [Difficulty: Easy]

    题目 Given an array of integers, return indices of the two numbers such that they add up to a specific ...

  9. 将java开发的wordcount程序提交到spark集群上运行

    今天来分享下将java开发的wordcount程序提交到spark集群上运行的步骤. 第一个步骤之前,先上传文本文件,spark.txt,然用命令hadoop fs -put spark.txt /s ...

  10. Hadoop HDFS环境搭建

    1,首先安装JDK,下面如果JDK出现安装错误,可以卸载 卸载 1.卸载用 bin文件安装的JDK方法: 删除/usr/java目录下的所有东西 2.卸载系统自带的jdk版本方法: 查看自带的jdk: ...