之前项目中一直没有用到分页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;
}
}
分享到:
相关推荐
1. 完善学生信息管理系统,增加如下功能: (1)记录的分页浏览。 (2)按照某个字段输入搜索关键字模糊分页查询。 (3)每条记录前加选择复选框,批量删除所选记录。
7、Struts复选框的实现; 8、Struts下拉框的实现; 9、如何实现Struts 数据库应用程序; 10、如何在Struts 数据库应用程序中实现分页显示; 11、如何在Struts 数据库应用程序中实现记录的删除、更新及...
7、Struts复选框的实现 8、Struts下拉框的实现 9、如何实现Struts 数据库应用程序 10、如何在Struts 数据库应用程序中实现分页显示 11、如何在Struts 数据库应用程序中实现记录的删除、更新及链接 12、如何在Struts ...
struts、hibernate、spring整合实现list的分页、复选框批量删除例子,带数据库文件
其中修改的时候,采用了ajax的技术来提高用户的交互体验, 并且加入了回显功能,搜索提供了模糊查询,采用复选框来选择你要的部门, 非常适用于框架初学者来学习,系统已经完全完善。如有bug欢迎联系作者修改。
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 如何获得...
1、 Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Servlet,JSP和custom tag library构建Web应用的一项非常有用的技术。由于Struts能充分满足应用开发...
使用单选按钮和复选框 12.12。使用ListMultipleChoices和Palette选择多个值 12.13。摘要 13.使用中继器显示多个项目 13.1。RepeatingView组件 13.2。ListView组件 13.3。RefreshingView组件 13.4。可分页的中继器 ...