2011-04-17 75 views
1

我想在复选框被选中时启用输入字段。此外,我想做一个服务器端验证的文本字段,填充,如果复选框被选中,问题我面对的是,当我检查多个并提交表单的空值该字段然后在servlet中进行验证并将结果返回给用户以填充输入,其中一个检查字段被检查,另一个不是,即使我使用param来提高稳定性,我也不知道是什么原因!JSP:某些表单字段稳定,而其他表单字段不稳定!

这里的HTML代码

<div class="groupElement"> 

    <input type="checkbox" name="communicationWay" id="communicationWay2" value="emailOption" ${param.communicationWay == 'emailOption'?'checked':'' } onchange="chgtx('email','communicationWay2')"/> 
    <label>Email</label> 


    <input class="inpClass" id="email" type="text" name="emailComm" value="${param.emailComm}" disabled/> 

</div> 

<div class="groupElement"> 

    <input type ="checkbox" name="communicationWay" id="communicationWay" value="cellPhoneOption" ${param.communicationWay == 'cellPhoneOption'?'checked':''} onchange="chgtx('cellPhone','communicationWay')" /> 
    <label> Cell phone number</label> 

    <input class="inpClass" id="cellPhone" type ="text" name="cellPhoneNoComm" value="${param.cellPhoneNoComm}" disabled /> 

    </div> 

和这里的,启用和禁用输入字段

function chgtx(field, checkbox) { 

      var myField = document.getElementById(field); 
      var checkBtton = document.getElementById(checkbox); 
      myField.disabled= !checkBtton.checked; 

     } 

回答

2

你的复选框元素具有相同的名称之间触发Java脚本功能。所以在服务器端,您必须使用request.getParameterValues()来获取所有选中的值。

String[] communicationWays = request.getParameterValues("communicationWay"); 
// ... 

当您使用request.getParameter(),如${param}是干什么的,只有一个值将被退回,这是该组中的第一个。您可以使用${paramValues}来获取EL中的所有值。

但是,使用EL中的${paramValues}来设置checked状态并不十分微不足道。有两种方法来解决这个问题:

  1. 创建自定义EL函数确实像

    ${util:contains(paramValues.communicationWays, 'emailOption') ? 'checked' : ''} 
    ${util:contains(paramValues.communicationWays, 'phoneOption') ? 'checked' : ''} 
    

    public static boolean contains(Object[] array, Object value) { 
        Arrays.sort(array); 
        return Arrays.binarySearch(array, value) > -1; 
    } 
    
  2. 创建servlet的一个Map<String, Boolean>,并用它来代替在EL。

    Map<String, Boolean> communicationWays = new HashMap<String, Boolean>(); 
    request.setAttribute("communicationWays", communicationWays); 
    
    for (String communicationWay : request.getParameterValues("communicationWay")) { 
        communicationWays.put(communicationWay, true); 
    } 
    

    ${communicationWays.emailOption ? 'checked' : ''} 
    ${communicationWays.phoneOption ? 'checked' : ''} 
    
+0

@BlausC,我做了第二个选项,它的工作原理,许多感谢名单。但关于第一种方法,我应该在哪里定义contains方法? – palAlaa 2011-04-17 21:16:25

+1

如何定义和配置自定义EL函数的例子在这个答案的底部附近提到:http://stackoverflow.com/questions/2523430/hidden-features-of-jsp-servlet/2525995#2525995 – BalusC 2011-04-17 22:30:23

+0

@blausC,您是否有任何建议让文本输入字段的禁用功能仅在页面加载时第一次起作用,因为如果我提交表单并从servlet返回,则会检查检查字段的位置,因为字段已禁用! 如何在页面第二次加载时启用它? – palAlaa 2011-04-17 23:08:26