一、描述:

最近写的一个问题管理模块,录入问题时需要选择客户(也就是那些客户存在这些问题),当保存完问题后,再次编辑问题时,如何从数据库里读取上次选中的客户并展示位勾选状态呢?问题表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. 解决Ubuntu输入正确密码后无法进入桌面,一直停留在登陆界面的问题

    在登陆界面按下Ctrl + Shift + F1 进入命令行模式,输入你的用户名和密码之后,敲入下面几行命令就可以了! $ cd - $ sudo chown 你的用户名:你的用户名 .Xauthor ...

  2. ZFS(一):ZFS在Debian GNU/Linux上的安装

    以下内容翻译自https://pthree.org/2012/04/17/install-zfs-on-debian-gnulinux/,并附有原文,由于是第一次翻译,如有任何翻译不恰当之处,欢迎指出 ...

  3. 从头开始linux-centos

    测试环境,下面二者之一CentOS-6.5-x86_64-minimal.isoCentOS-7-x86_64-Minimal-1511.iso 第一步系统检测与优化,即初始化工作,常规型的 rpm ...

  4. Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法【转载】

    摘自:http://www.cnblogs.com/douqiumiao/default.aspx?opt=msg Validation failed for one or more entities ...

  5. CentOS 7 时间同步

    在做这个之前需要先搭建yum http://www.cnblogs.com/jw31/p/5955852.html 在做之前我们需要先安装ntp服务 yum install ntp -y vi /et ...

  6. [Freemarker] - 使用struts的component调用freemarker的ftl模板方法

    struts中的component标签,可以用来调用freemarker的ftl模板文件,使用component标签传参可以这样写: 使用property方式写法: <s:component t ...

  7. nova-scheduler start flow

  8. python标准库xml.etree.ElementTree的bug

    使用python生成或者解析xml的方法用的最多的可能就数python标准库xml.etree.ElementTree和lxml了,在某些环境下使用xml.etree.ElementTree更方便一些 ...

  9. Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations

    题意: 对于一个长度为n的排列P,如果P在所有长度为n的排列中,按照字典序排列后,在第s位,则P的value为s 现在给出一个长度为n的排列P,P有一些位置确定了,另外一些位置为0,表示不确定. 现在 ...

  10. jquery 文本域光标操作(选、添、删、取)

    一.JQuery扩展 ; (function ($) { /* * 文本域光标操作(选.添.删.取)的jQuery扩展 http://www.cnblogs.com/phpyangbo/p/55286 ...