一、描述:

最近写的一个问题管理模块,录入问题时需要选择客户(也就是那些客户存在这些问题),当保存完问题后,再次编辑问题时,如何从数据库里读取上次选中的客户并展示位勾选状态呢?问题表cust_question表中用一个字段保存选中的客户Id,多个客户用逗号隔开;界面如图:

二、查询客户的Action方法:

     //查询客户列表
public String selectCust(){
HttpServletRequest request = ServletActionContext.getRequest();
//查询所有客户id,name
String sql = " select id, name from customer where isvalid = true " ;
//查询该条问题现保存的客户Ids
String sql2 = " select cust_ids from cust_question where isvalid=true and id= "+ques.getId() +" limit 0,1" ;
Connection conn = null ;
Statement st = null ;
ResultSet rs = null;
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
//这里声明的list就是存放cust_ids字段存放的客户Id转换成list,然后就可以用list的contains方法判断,如果包含则input标签加上checked属性
List list2 = new ArrayList();
try {
conn = BaseDao.getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
while(rs.next()){
Map<String,Object> map = new HashMap<String,Object>();
map.put("id", rs.getString("id"));
map.put("name", rs.getString("name"));
list.add(map);
}
if(ques.getId()>0){ //如何是新增问题则不需要进入此方法
rs = st.executeQuery(sql2);
while(rs.next()){
String[] ids = rs.getString("cust_ids").split(",");
list2 = Arrays.asList(ids);
}
} } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //定义页面输出表格(因为这个页面是嵌入主页面的iframe)
StringBuffer htmStr = new StringBuffer("<div class=\"wsy_date_box\" id=\"userDiv\">");
htmStr.append("<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">");
//每行显示个数
int rowSize = 2;
for(int i=0;i<list.size();i++){
if(i%rowSize==0){
htmStr.append("<tr>");
}
htmStr.append("<td><span><input type=\"checkbox\" name=\"cust_id\" onclick=\"return sonCheck("+list.get(i).get("c_id")+ ",'"+list.get(i).get("c_trademark") +
"');\" id=\""+list.get(i).get("c_id")+"\" value=\""+list.get(i).get("c_trademark")+"\" "+(list2.contains(list.get(i).get("c_id"))?"checked" : "")+ "/>" + list.get(i).get("c_trademark") );
htmStr.append("</span></td>");
if((i+1)%rowSize==0){
htmStr.append("</tr>");
}
}
if(list.size()%rowSize!=0){ //如果记录总是不是rowSize的整数倍需要在结尾加上行的结束符</tr>
htmStr.append("</tr>");
}
htmStr.append("</table> </div>"); //html添加js
htmStr.append("\n<script type=\"text/javascript\">");
htmStr.append("\nfunction sonCheck(id,name){ debugger ;");
// htmStr.append("\n alert(\"id...\"+id);");
// htmStr.append("\n alert(\"name...\"+name);");
htmStr.append("\n parent.checkCustomer(id,name); ");
// htmStr.append("\n return false ;");
htmStr.append("\n }"); htmStr.append("\n</script>"); //System.out.println(htmStr.toString());
request.setAttribute("quesId", ques.getId()) ;
request.setAttribute("custList", htmStr.toString()); return "selectCust";

或者在页面处理,因为EL表达式中也可以用List的contains方法;

 <input type="checkbox" name="cust_id" onclick="sonCheck(1)" id="chk_${c1.id }" value="${c1.id }"
${list2.contains(c1.id) ? "checked" : "" }/>${c1.name }</span>

三、父页面JS方法要实现,当用户选择新客户时不能冲掉已经勾选的客户;

 <input type="hidden" id="customer_ids" name="ques.customer_ids" value="${qu.customer_ids }" style="width: 500px" />
<input type="text" id="customer_names" name="ques.customer_names" value="${qu.customer_names }" style="width: 500px" readonly="readonly"/>
<script>
var custIdsArray = new Array(); //存放客户id的数组
var custNameArray = new Array();
var custIds = document.getElementById("customer_ids").value;
var custNames = document.getElementById("customer_names").value;
//如果是修改问题,则input域是有值的,所以要先填入到JS声明的数组中
if(custIds!=''){
custIdsArray = custIds.split(',');
}
if(custNames!=''){
custNameArray = custNames.split(',');
}
function checkCustomer(id,name){debugger;
if(custIdsArray.length>0){
var status = true ; //用于标识是否从数组中被删除过
for(var i=0;i<custIdsArray.length;i++){
var idValue = custIdsArray[i];
var nameValue = custNameArray[i];
if(idValue==id){
status = false ;
custIdsArray.splice(i,1);
}
if(nameValue==name){
custNameArray.splice(i,1);
}
}
//添加到数组的操作不能在for循环中,因为添加之后数组长度就变了,导致每次添加完后立即有被循环遍历清除掉了
if(status){
custNameArray.push(name);
custIdsArray.push(id);
}
}else{
custIdsArray.push(id);
custNameArray.push(name);
} //alert(custIdsArray.join(","));
//alert(custNameArray.join(",")); $("#customer_ids").val(custIdsArray.join(",")); //更新隐藏域
$("#customer_names").val(custNameArray.join(","));
}
</script>

这样,在父页面提交时,就可以保证不会冲掉已经选中的客户;

此随笔主要记录下如何保存复选框的勾选状态,其实就两处重点:

1. List的contains方法在EL表达式中、Java程序中的使用

2. 还有父页面JS怎么处理保存数据的问题;

JSP如何保存页面上众多的复选状态的更多相关文章

  1. PyQt(Python+Qt)学习随笔:QTableWidgetItem项的复选状态checkState访问方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件中的QTableWidgetItem项可以单独设置复选状态,如图所有 ...

  2. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项中列的复选状态访问方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项,项中每列数据都可以单独设置复选状 ...

  3. NopCommerce 3.4中商品详情页面单选框、复选框的美化

    先上图给大家看看效果,点这里打开网站(后期可能会找不到这个商品,现在再测试阶段) 现在你能看到的这个页面中,尺寸.文本描述是单选框(属性是我乱写的名字),上门安装是复选框.效果就看到这里,请君跳过图片 ...

  4. JS在页面限制checkbox最大复选数

    应该是挺简单的代码, 记录一下分享. 首先最直接的想法就是使用循环, 用局部变量记录已选的checkbox, 达到最大值就将余下的checkbox都禁止选择, 例如以下: <!DOCTYPE h ...

  5. 如何在jsp和html页面上获取当前时间

    要想在JSP页面中获得当前时间并显示出来,首先得导入相关的Java包,然后创建Date对象. <%@page import="java.text.SimpleDateFormat,ja ...

  6. JSP里比对单选框或复选框的数值而自动打勾

    <table> <tr> <td class="tableleft">状态</td> <td><input typ ...

  7. jquery 1.9版本下复选框 全选/取消实现

    http://zhangzhaoaaa.iteye.com/blog/1914497 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Tran ...

  8. 【JSP】layui+jsp,根据后台数据给复选框默认勾选

    1.项目中经常使用复选框,当重复加载,就需要从数据库给复选框一个默认的值了. 2.接下来使用的是JSP中迭代的方法,给复选框绑定值.思路和方法不一定好,仅供参考. <input type=&qu ...

  9. Selenium2+python自动化19-单选框和复选框(radiobox、checkbox)

    本篇主要介绍单选框和复选框的操作 一.认识单选框和复选框 1.先认清楚单选框和复选框长什么样 2.各位小伙伴看清楚哦,上面的单选框是圆的:下图复选框是方的,这个是业界的标准,要是开发小伙伴把图标弄错了 ...

随机推荐

  1. git相关

    进入到想要用git管理的project目录下 1.git init 意即该目录会被git监视一切的变动 同时生成一个.git文件夹下面存放了管理该project的一切必要信息 2.git add &l ...

  2. spring技术核心概念纪要

    一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述 ...

  3. Firebug在Firefox DevTools 中复活

    英文:Firefox,编译:开源中国 链接:www.oschina.net/news/80230/firebug-lives-on-in-firefox-devtools 技术最前线转注:2016年1 ...

  4. linux -小记(3) 问题:linux 安装epel扩展源报错

    EPEL提供的软件包大多基于其对应的Fedora软件包,不会与企业版Linux发行版本的软件发生冲突或替换其文件. epel安装对应的rpm包 centos5 32位epel源下载地址: www.li ...

  5. [JBoss] - 环境搭建

    安装Java和设置JAVA_HOME等步骤跳过. 1.去官网下载jboss: http://jbossas.jboss.org/downloads/ 这里使用的是7.1.1 final,jboss版本 ...

  6. Unity2D多分辨率屏幕适配方案(转载)

    一下内容转自:http://imgtec.eetrend.com/forum/3992 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有 ...

  7. UIView常用的一些方法小记之setNeedsDisplay和setNeedsLayout

    1,UIView的setNeedsDisplay和setNeedsLayout方法 首先两个方法都是异步执行的.而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到  UI ...

  8. mysql日志详细解析

    MySQL日志: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql ...

  9. 《Linux内核分析》课程总结

    朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 不知不觉,在网易 ...

  10. Windows 2008等操作系统升级时出现800F0818错误代码的解决方法

    今天我在网络中的一台Windows Server 2008 R2升级时,出现“代码800F0818”的错误提示,如图1-1所示.