`
seattle2881
  • 浏览: 32460 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

基于Struts2的分页复选框记忆选择

 
阅读更多

之前项目中一直没有用到分页checkBox需要记住兄弟页面选择的需求,分页一直都是页面的整体刷新,然后在后台根据传来的参数,重新从数据库读取数据展示到前台,只是简单的分页展示,功能简单。

而最近一个需求,要求不止是分页展示,还要记住兄弟页面的checkbox的选择情况,并最终将所有选择信息传到后台生成记录。

因为整个模块代码分布比较零散,不方便将代码粘贴上来。就简单记录下自己的思路吧。

1.首先,每个分页的选择记录需要有一个容器来存储,开始我是用页面传值来记录每一个选择id,后来发现添加id容易,但是取消之前选择过的id麻烦,最终选择用SESSION来存储一个HashSet集合,所有的id也都放在这个集合里,因为是set集合,所以即使重复添加,也没有重复的id值,去除id也很简单,总之,类似于这样的对数据的处理,放在后台处理肯定比在前端方便多了。

2.必须保证这个set集合里的数据是正确的,也是最新的。保持正确的话,就需要适时对set里的数据进行更新,及清空,防止里面有脏数据。目前我的做法,是在跳转到当前分页模块的时候,就对SESSION中的set集合进行一次清空,防止上一次操作遗留的set数据成为脏数据,同时,在完成一次记录的添加后,set集合中的数据也就不需要了,也要进行一次清空。需要注意的一点是,翻页的时候,不需要清空哦,呵呵呵,不然做啥都是枉然啦。至于数据的最新,因为是分页记忆选择,我选择在每次点击分页按钮的时候,也就是对后台发送分页请求的时候,在发送分页请求前,先执行一次ajax请求,将当前分页中checkbox已经选中的,和没有选中的id都传到后台,在后台先将已经选中的数据进行一次添加,再将没有选中的id进行一次移除,并且在最后请求返回的时候,获取session中set集合的个数,也就是选择id的最新个数,以便传到前台,通过js控制id的选择数量。当然,在最后完成选择,进行添加记录请求的时候,因为当前的操作不需要点击分页了,用户已经完成了最终选择,那么在提交添加记录请求前,同样的也要完成一次ajax请求,对当前分页的checkbox进行一次添加和移除,并且返回最终所有选择的id数量。如果数量符合需求的要求,则进行添加记录请求。

3.另外一点就是客户的体验,当你跳转到之前选择的页面时,要保证页面中你选择过的复选中是选中状态,这样才是正确的用户体验。我的做法是将session中的set集合遍历出来,将set中的id值放在隐藏的input标签中,然后将隐藏的input标签用jquery进行遍历,获取到当前标签的value值,也就是选中的id值,通过id值利用jquery选择器定位到对应的分页复选框,将当前复选框设为选中状态。

至此,大致的思路步骤就到此。

附上ajax请求到后台的struts2 Action的代码

/*

 * 作者		liteng
 * 开发环境	WindowsXp MyEclipse6.5 JDK1.6.0_22
 * 开发日期	2011-10-26
 */

package com.tydic.mpms.use.choosechild;

import java.util.HashSet;
import java.util.Set;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.json.annotations.JSON;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import framework.base.action.BaseAction;
import framework.base.constant.SpringScope;
import framework.utils.StringTools;


@Controller("Famous_ChooseAction")
@Scope(SpringScope.PROTOTYPE)
@Results( {
	@Result(name="json",params = { "contentType", "text/plain" },type="json")
    })
public class FamousChooseAction extends BaseAction {
	/**
	 * @author liteng
	 */
	private static final long serialVersionUID = -8789701624699257485L;

	//最终选择的七个id字符串 添加的时候判断是否超过7个 如果超过7个 不能添加
	private int 			   idNum;

	//选中的所有id字符串 添加避免重复
	private String 			   checkIds;   
	
	//取消的所有id字符串 有则取消 无则不操作
	private String             cancelIds;
	
	@Override
	public String execute() throws Exception {
		this.log.debug("FamousChooseAction start()");
		//首先获取最新的id数量
		this.getNewIdNum();
		
		if(StringTools.isBlank(checkIds)){
			log.debug("==========================checkIds is null");
		}else{
			String[] checkIdsArray = checkIds.split(" ");
			for(String id : checkIdsArray){
				this.setIdToSessionSet(id);
			}
		}
		if(StringTools.isBlank(cancelIds)){
			log.debug("===========================cancelIds is null");
		}else{
			String[] cancelIdsArray = cancelIds.split(" ");
			for(String id : cancelIdsArray){
				this.removeIdFromSessionSet(id);
			}
		}
		
		//最后再获取最新的id数量
		this.getNewIdNum();
		
		log.debug("选中的明星儿时图片数量为"+idNum);
		this.log.debug("FamousChooseAction End()");
		return "json";
	}

	//将id插入到set集合中
	@SuppressWarnings({ "unchecked" })
	private void setIdToSessionSet(String checkId){
		if(this.session.getAttribute("FAMOUSIDSET") == null){
			Set<String> famousIdSet = new HashSet<String>();
			famousIdSet.add(checkId);
			this.session.setAttribute("FAMOUSIDSET", famousIdSet);
		}else{
			Set<String> famousIdSet = (Set<String>) this.session.getAttribute("FAMOUSIDSET");
			famousIdSet.add(checkId);
			this.session.setAttribute("FAMOUSIDSET", famousIdSet);
		}
	}
	//将id移出set集合中
	@SuppressWarnings({ "unchecked" })
	private void removeIdFromSessionSet(String cancelId){
		if(this.session.getAttribute("FAMOUSIDSET") != null){
			Set<String> famousIdSet = (Set<String>) this.session.getAttribute("FAMOUSIDSET");
			famousIdSet.remove(cancelId);
			this.session.setAttribute("FAMOUSIDSET", famousIdSet);
		}
	}
	//获取当前选中的id数量
	@SuppressWarnings("unchecked")
	private void getNewIdNum(){
		if(this.session.getAttribute("FAMOUSIDSET") == null){
			idNum = 0;
		}else{
			Set<String> famousIdSet = (Set<String>)this.session.getAttribute("FAMOUSIDSET");
			idNum = famousIdSet.size();
		}
	}
	
	@JSON(serialize=false)
	public String getCheckIds() {
		return checkIds;
	}

	public void setCheckIds(String checkIds) {
		this.checkIds = checkIds;
	}
	
	
	@JSON(serialize=false)
	public String getCancelIds() {
		return cancelIds;
	}

	public void setCancelIds(String cancelIds) {
		this.cancelIds = cancelIds;
	}
	
	@JSON(serialize=true)
	public int getIdNum() {
		return idNum;
	}

	public void setIdNum(int idNum) {
		this.idNum = idNum;
	}


	
	
	

	
	
}
 
分享到:
评论

相关推荐

    struts2+hibernate学生信息管理系统

    1. 完善学生信息管理系统,增加如下功能: (1)记录的分页浏览。 (2)按照某个字段输入搜索关键字模糊分页查询。 (3)每条记录前加选择复选框,批量删除所选记录。

    Struts开发实例.rar

     7、Struts复选框的实现;  8、Struts下拉框的实现;  9、如何实现Struts 数据库应用程序;  10、如何在Struts 数据库应用程序中实现分页显示;  11、如何在Struts 数据库应用程序中实现记录的删除、更新及...

    Struts开发实例

    7、Struts复选框的实现 8、Struts下拉框的实现 9、如何实现Struts 数据库应用程序 10、如何在Struts 数据库应用程序中实现分页显示 11、如何在Struts 数据库应用程序中实现记录的删除、更新及链接 12、如何在Struts ...

    ssh整合的分页、批量删除

    struts、hibernate、spring整合实现list的分页、复选框批量删除例子,带数据库文件

    SH整合 部门和员工表

    其中修改的时候,采用了ajax的技术来提高用户的交互体验, 并且加入了回显功能,搜索提供了模糊查询,采用复选框来选择你要的部门, 非常适用于框架初学者来学习,系统已经完全完善。如有bug欢迎联系作者修改。

    structs程序设计从入门到精通word文档

    12.1 Struts下JSP页面传递复选框值技巧 15 12.1 Struts中下拉和选取/选项列表的HTML标签 15 12.1 Struts中html:errors的HTML标签 15 12.1 Struts中使用标签上传文件 15 第13章 Struts Bean标签库 15 13.1 如何获得...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    1、 Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Servlet,JSP和custom tag library构建Web应用的一项非常有用的技术。由于Struts能充分满足应用开发...

    Wicket 8.X开发文档(中文翻译+英文原版)

    使用单选按钮和复选框 12.12。使用ListMultipleChoices和Palette选择多个值 12.13。摘要 13.使用中继器显示多个项目 13.1。RepeatingView组件 13.2。ListView组件 13.3。RefreshingView组件 13.4。可分页的中继器 ...

Global site tag (gtag.js) - Google Analytics