当前位置: 代码迷 >> Web前端 >> 基于Struts2的分页复选框记忆取舍
  详细解决方案

基于Struts2的分页复选框记忆取舍

热度:324   发布时间:2012-11-23 22:54:33.0
基于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;
	}


	
	
	

	
	
}
?
  相关解决方案