一、描述:

最近写的一个问题管理模块,录入问题时需要选择客户(也就是那些客户存在这些问题),当保存完问题后,再次编辑问题时,如何从数据库里读取上次选中的客户并展示位勾选状态呢?问题表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. maven的SNAPSHOT版本和正式版本不同

    转载文章: http://www.huangbowen.net/blog/2016/01/29/understand-official-version-and-snapshot-version-in- ...

  2. 使用 dynamic 标记解析JSON字符串

    string jsonStr = "{\"data\": {\"ssoToken\": \"70abd3d8a6654ff189c482fc ...

  3. 安全快速修改Mysql数据库名的5种方法

    1. RENAME DATABASE db_name TO new_db_name这个..这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了.据说有可能丢失数据.还是不要用的好.详 ...

  4. 从 Bootstrap 2.x 版本升级到 3.0 版本

    摘自http://v3.bootcss.com/migration/ Bootstrap 3 版本并不向后兼容 v2.x 版本.下面的章节是一份从 v2.x 版本升级到 v3.0 版本的通用指南.如需 ...

  5. 操作配置文件Properties

    // */ // ]]>   操作配置文件Properties Table of Contents 1 定义 2 读取配置值 3 修改和保存配置 4 注意 1 定义 csharp中在Settin ...

  6. 2016中国VR开发者论坛第一期

    由VR界网和暴风魔镜联合举办的2016中国VR开发者论坛第一期已于3月2日下午5点在吉林动画学院圆满落幕,本次论坛云集了VR相关领域的精英,邀请了VR社交<极乐王国>.暴风魔镜.南京睿悦. ...

  7. mpstat, pidstat, iostat和sar

    在我们上一篇文章中,我们已经学习了如何去安装和更新sysstat,并且了解了包中的一些实用工具. 今天,我们将会通过一些有趣的实例来学习mpstat, pidstat, iostat和sar等工具,这 ...

  8. Oracle正确删除archivelog文件(转)

    from:http://www.itpub.net/thread-1636118-6-1.html Oracle在开启了归档模式后,会在指定的archive目录下产生很多的archivelog文件,而 ...

  9. 【总结】我所整理的各种CSS居中

    在网上看了很多文章,自己也总结了一下,虽说是自己写的,但是还是要列出我参考过的那些文章的地址,感谢你们的分享!  http://blog.gejiawen.com/2015/03/13/css-lay ...

  10. EntityFramework tt模板

    http://www.cnblogs.com/hanyinglong/archive/2013/04/18/3029649.html