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怎么处理保存数据的问题;

 

posted @ 2015-11-04 16:55  穷苦书生  阅读(449)  评论(0编辑  收藏  举报