zoukankan      html  css  js  c++  java
  • 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("
    <script type="text/javascript">");
    60         htmStr.append("
    function sonCheck(id,name){ debugger ;");
    61 //        htmStr.append("
     alert("id..."+id);");
    62 //        htmStr.append("
     alert("name..."+name);");
    63         htmStr.append("
     parent.checkCustomer(id,name); ");
    64 //        htmStr.append("
     return false ;");
    65         htmStr.append("
     }");
    66         
    67         htmStr.append("
    </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=" 500px" />
     2 <input type="text" id="customer_names" name="ques.customer_names" value="${qu.customer_names }" style=" 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怎么处理保存数据的问题;

    边系鞋带边思考人生.
  • 相关阅读:
    二分法检索数组
    Linux安装CDH
    myeclipse操作hdfs
    Linux安装hbase
    Linux安装zookeeper
    Linux安装msql
    fluem全分布环境搭建
    bash: jps: 未找到命令...
    自动化项目Jenkins持续集成
    linux卸载mysql====安装新的虚拟机 自带的基本都要卸载!? mysql tomcat java Python可以不用卸载
  • 原文地址:https://www.cnblogs.com/crazytrip/p/4936485.html
Copyright © 2011-2022 走看看