背景
在添加某些编码时,我们需要在表单中控制该编码与名称的唯一性,因此用到了validate实时验证。
Form表单内容:
<form:form id="bankInformationForm" modelAttribute="bankInformation" action="${ctx}/sys/bankInformation/save" method="post" class="form-horizontal">
<form:hidden path="id"/>
<div class="control-group">
<label class="control-label">银行代码:</label>
<div class="controls">
<form:input path="code" htmlEscape="false" class="required" />
<span class="help-inline"><font color="red">*</font> </span>
</div>
</div>
<div class="control-group">
<label class="control-label">银行名称:</label>
<div class="controls">
<form:input path="bankName" htmlEscape="false" class="required"/>
<span class="help-inline"><font color="red">*</font> </span>
</div>
</div>
....省略
</from:from>
JS代码:
$(document).ready(function() { // 一定要进行文档加载完自动执行,否则验证不生效
$("#bankInformationForm").validate({
rules: {
bankName: {remote: "${ctx}/sys/bankInformation/verification?oldBankName=" + encodeURIComponent('${bankInformation.bankName}')},
// 加oldBankName是因为存在修改时验证的问题
// 这里本来可以用JQuery操作DOM进行获取输入的值,但是原文档中使用了encodeURIComponent()这个,可以实时获取输入的值,并编译到连接中;恶心的问题就在这。。。(看下面 ↓)
code: {remote: "${ctx}/sys/bankInformation/verification?oldCode=" + encodeURIComponent('${bankInformation.code}')}
},
messages: {
bankName: {remote: "此银行名称已存在"},
code: {remote: "此银行代码已存在"}
},
submitHandler: function(form){
loading('正在提交,请稍等...');
form.submit();
},
errorContainer: "#messageBox",
errorPlacement: function(error, element) {
$("#messageBox").text("输入有误,请先更正。");
if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
error.appendTo(element.parent().parent());
} else {
error.insertAfter(element);
}
}
});
});
关于JavaScript encodeURIComponent()方法的问题
这个方法最头疼的就是,传到后台是乱码的,如果你首次加载页面${bankInformation.bankName}有值的话,进行encodeURIComponent(encodeURIComponent())两次编译,传到后台,网上有四种转成中文的方式:
String s = URLDecoder.decode(bankInformation.getBankName(),"utf-8");
String s2 = new String(bankInformation.getBankName().getBytes("ISO8859-1"),"utf-8");
String s3 = URLDecoder.decode(request.getParameter("bankName"), "UTF-8");;
String s4 = new String(request.getParameter("bankName").getBytes("ISO8859-1"),"utf-8");
这个我没验证!
但是,当你输入之后,进行验证时,传到后台。只有
String s4 = new String(request.getParameter("bankName").getBytes("ISO8859-1"),"utf-8");
可以正常转成中文。
此处还存在一个问题,因为有修改和添加,当修改时,名字没改你不能再验证,所以需要判断 oldBankName与bankName相等,这是不能用嵌套的encodeURIComponent(),因为两个传到后台如果不解码的话,这两个是不相等的。
贴Java代码:
// 判断code或name是否存在
@RequestMapping(value = "verification")
@ResponseBody
public Boolean verification(BankInformation bankInformation,@RequestParam(required=false)String oldBankName,@RequestParam(required=false)String oldCode,HttpServletRequest request) {
try {
String bankName = null ;
String code = null ;
if((bankName = bankInformation.getBankName()) != null){
bankInformation.setBankName(new String(request.getParameter("bankName").getBytes("ISO8859-1"),"utf-8"));
if (oldBankName != null && bankName.equals(oldBankName)) {
return true;
}
}else if((code = bankInformation.getCode()) != null){
if (oldCode != null && code.equals(oldCode)) {
return true;
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return bankInformationService.findBankInfoIsExist(bankInformation) ;
}