JSP如何保存页面上众多的复选状态
一、描述:
最近写的一个问题管理模块,录入问题时需要选择客户(也就是那些客户存在这些问题),当保存完问题后,再次编辑问题时,如何从数据库里读取上次选中的客户并展示位勾选状态呢?问题表cust_question表中用一个字段保存选中的客户Id,多个客户用逗号隔开;界面如图:
二、查询客户的Action方法:
1 //查询客户列表 2 public String selectCust(){ 3 HttpServletRequest request = ServletActionContext.getRequest(); 4 //查询所有客户id,name 5 String sql = " select id, name from customer where isvalid = true " ; 6 //查询该条问题现保存的客户Ids 7 String sql2 = " select cust_ids from cust_question where isvalid=true and id= "+ques.getId() +" limit 0,1" ; 8 Connection conn = null ; 9 Statement st = null ; 10 ResultSet rs = null; 11 List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); 12 //这里声明的list就是存放cust_ids字段存放的客户Id转换成list,然后就可以用list的contains方法判断,如果包含则input标签加上checked属性 13 List list2 = new ArrayList(); 14 try { 15 conn = BaseDao.getConnection(); 16 st = conn.createStatement(); 17 rs = st.executeQuery(sql); 18 while(rs.next()){ 19 Map<String,Object> map = new HashMap<String,Object>(); 20 map.put("id", rs.getString("id")); 21 map.put("name", rs.getString("name")); 22 list.add(map); 23 } 24 if(ques.getId()>0){ //如何是新增问题则不需要进入此方法 25 rs = st.executeQuery(sql2); 26 while(rs.next()){ 27 String[] ids = rs.getString("cust_ids").split(","); 28 list2 = Arrays.asList(ids); 29 } 30 } 31 32 } catch (SQLException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 37 //定义页面输出表格(因为这个页面是嵌入主页面的iframe) 38 StringBuffer htmStr = new StringBuffer("<div class=\"wsy_date_box\" id=\"userDiv\">"); 39 htmStr.append("<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"); 40 //每行显示个数 41 int rowSize = 2; 42 for(int i=0;i<list.size();i++){ 43 if(i%rowSize==0){ 44 htmStr.append("<tr>"); 45 } 46 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") + 47 "');\" 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") ); 48 htmStr.append("</span></td>"); 49 if((i+1)%rowSize==0){ 50 htmStr.append("</tr>"); 51 } 52 } 53 if(list.size()%rowSize!=0){ //如果记录总是不是rowSize的整数倍需要在结尾加上行的结束符</tr> 54 htmStr.append("</tr>"); 55 } 56 htmStr.append("</table> </div>"); 57 58 //html添加js 59 htmStr.append("\n<script type=\"text/javascript\">"); 60 htmStr.append("\nfunction sonCheck(id,name){ debugger ;"); 61 // htmStr.append("\n alert(\"id...\"+id);"); 62 // htmStr.append("\n alert(\"name...\"+name);"); 63 htmStr.append("\n parent.checkCustomer(id,name); "); 64 // htmStr.append("\n return false ;"); 65 htmStr.append("\n }"); 66 67 htmStr.append("\n</script>"); 68 69 //System.out.println(htmStr.toString()); 70 request.setAttribute("quesId", ques.getId()) ; 71 request.setAttribute("custList", htmStr.toString()); 72 73 return "selectCust";
或者在页面处理,因为EL表达式中也可以用List的contains方法;
1 <input type="checkbox" name="cust_id" onclick="sonCheck(1)" id="chk_${c1.id }" value="${c1.id }" 2 ${list2.contains(c1.id) ? "checked" : "" }/>${c1.name }</span>
三、父页面JS方法要实现,当用户选择新客户时不能冲掉已经勾选的客户;
1 <input type="hidden" id="customer_ids" name="ques.customer_ids" value="${qu.customer_ids }" style="width: 500px" /> 2 <input type="text" id="customer_names" name="ques.customer_names" value="${qu.customer_names }" style="width: 500px" readonly="readonly"/> 3 <script> 4 var custIdsArray = new Array(); //存放客户id的数组 5 var custNameArray = new Array(); 6 var custIds = document.getElementById("customer_ids").value; 7 var custNames = document.getElementById("customer_names").value; 8 //如果是修改问题,则input域是有值的,所以要先填入到JS声明的数组中 9 if(custIds!=''){ 10 custIdsArray = custIds.split(','); 11 } 12 if(custNames!=''){ 13 custNameArray = custNames.split(','); 14 } 15 function checkCustomer(id,name){debugger; 16 if(custIdsArray.length>0){ 17 var status = true ; //用于标识是否从数组中被删除过 18 for(var i=0;i<custIdsArray.length;i++){ 19 var idValue = custIdsArray[i]; 20 var nameValue = custNameArray[i]; 21 if(idValue==id){ 22 status = false ; 23 custIdsArray.splice(i,1); 24 } 25 if(nameValue==name){ 26 custNameArray.splice(i,1); 27 } 28 } 29 //添加到数组的操作不能在for循环中,因为添加之后数组长度就变了,导致每次添加完后立即有被循环遍历清除掉了 30 if(status){ 31 custNameArray.push(name); 32 custIdsArray.push(id); 33 } 34 }else{ 35 custIdsArray.push(id); 36 custNameArray.push(name); 37 } 38 39 //alert(custIdsArray.join(",")); 40 //alert(custNameArray.join(",")); 41 42 $("#customer_ids").val(custIdsArray.join(",")); //更新隐藏域 43 $("#customer_names").val(custNameArray.join(",")); 44 } 45 </script>
这样,在父页面提交时,就可以保证不会冲掉已经选中的客户;
此随笔主要记录下如何保存复选框的勾选状态,其实就两处重点:
1. List的contains方法在EL表达式中、Java程序中的使用
2. 还有父页面JS怎么处理保存数据的问题;
边系鞋带边思考人生.