一、描述:

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

    1.Nginx 配置 ssl 模块 默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块 ...

  2. Python 安装mysqldb

    切换目录: cd /usr/local/src/ 一.下载资源 wget http://sourceforge.net/projects/mysql-python/files/mysql-python ...

  3. Spring使用环境变量控制配置文件加载

    项目中需要用到很多配置文件,不同环境的配置文件是不一样的,因此如果只用一个配置文件,势必会造成配置文件混乱,这里提供一种利用环境变量控制配置文件加载的方法,如下: 一.配置环境变量 如果是window ...

  4. nginx相关配置说明

    基础: nginx配置文件主要分为六个区域:main section.events section.http section.sever section. location section.upstr ...

  5. iOS 定位于地理反编码

    - (void)viewDidLoad { [self startLocation]; } //开始定位 -(void)startLocation{ self.locationManager = [[ ...

  6. xml与json 介绍

    一.JSON数据格式 1)概念:json是一种网络数据传输格式,有值/对象:{“A”:1,”B”:”2”…}词典:对象的序列:[,,,,,]数组两种数据类型 2)URLWithString 将字符串网 ...

  7. RMAN_学习笔记1_RMAN Structure概述和体系结构

    2014-12-23 Created By BaoXinjian

  8. java语言实现堆排序

    package secondChapter; import java.util.Random; public class HeapSort { private static int AHeapSize ...

  9. mysql中in和exists二者的区别和性能影响

    mysql查询语句in和exists二者的区别和性能影响 还记得一次面试中被人问到in 和 exists的区别,当然只是草草做答,现在来做下分析. mysql中的in语句是把外表和内表作hash 连接 ...

  10. List集合中的对象根据属性排序

    集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A.B.C,则取得时候,则也是A.B.C的顺序,实际场景中,有时我们需要根据自定义的规则对List中的元素进行排序,该如何实现呢?看 ...