一、描述:

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

    HSB(hue.saturation.bright)  基于人眼 RGB 基于光 CMYK 基于色 LAB 基于大自然颜色库(理论)

  2. VB6对象与地址相互转换

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (lpDest As ...

  3. <script>标签应该放到</body>标签之前

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:贺师俊 链接:http://www.zhihu.com/question/20027966/answer/13727164 ...

  4. 一步步构建自己的AngularJS(1)——项目初始化

    Angular1距离2009年发布已经好多年了,Angular2也已经出了Beta版,估计今年就能正式发布.大多数人对于Angular1.X的认识仅限于能够在项目中使用,对于其中的深层原理知道的并不多 ...

  5. PHP入门part2

    PHP的数据类型 php数据类型分为三大类, 标量类型:整型.浮点型.布尔型和字符串型 复合类型:数组型和对象(object) 特殊类型:空类型和资源型 !资源型以后会讲 整形(int)就是整数的数值 ...

  6. Logistic Regression逻辑回归

    参考自: http://blog.sina.com.cn/s/blog_74cf26810100ypzf.html http://blog.sina.com.cn/s/blog_64ecfc2f010 ...

  7. Ajax (一)

    Ajax:即异步的XML和Javascript,在不刷新和提交的情况下,页面局部更新,实现前后端分离. Ajax的核心对象是XMLHttpRequest,服务器通过xhr对象与浏览器异步通信 关于HT ...

  8. E:in-range伪类选择器与E:out-of-range伪类选择器

    E:in-range伪类选择器用来指定当元素的有效值被限定在一段范围之内(通常通过min属性值与max属性值来限定),且实际输入值在该范围内时使用的样式.E:out-of-range伪类选择器用来指定 ...

  9. 有关RAVE报表 - 大富翁论坛20050419

    部分资料来源于RAVE开发人员指南 ravedevguide5 新闻组News.Nevrona.com RAVE的官方主页  www.nevrona.com/rave KeyLife富翁笔记  作者 ...

  10. ActionScript 3.0 for the Lunder Algorithm

    package com.feiruo.Calendar.LunderCalendar { /* *@ClassName: package:com.feiruo.Calendar.LunderCalen ...