前后台参数验证组件
大致思路:
合法性规则用正则表达式配置在配置文件中后台写校验类作为后台验证组件
定义servlet启动的时候读取配置文件生成js文件。作为前台验证
页面校验引入生成的js文件
一:合法性校验规则
1.定义config.properties 文件
#合法性规则限制
reg.username =^[a-zA-Z0-9]{32}$
reg.nickName =^[a-zA-Z0-9]{32}$
reg.loginName =^[a-zA-Z\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]{3,20}$
reg.password =^[a-zA-Z0-9]{32}$
reg.oldpwd =^[a-zA-Z0-9]{32}$
reg.newpwd =^[a-zA-Z0-9]{32}$
reg.email =[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
reg.mobile =^1[3|5|8][0-9]\\d{8}$
# 长度限制
minLen.email = 3
maxLen.email = 32
minLen.linkEmail= 3
maxLen.linkEmail= 32
maxLen.website= 100
注意:上述正则表达式有可能错误,实验用了username 和nickName没有问题。
二:后台验证
1.编写读取配置文件通用类
public abstract class PropertyUtil{
private static final String DEFAULT_PROPERTY = "config";
private static final String PROPERTY_SUFIX = ".properties";
private static final Map<String, PropertiesConfiguration> CONFIGURATIONS = new HashMap<String, PropertiesConfiguration>();
。。。
详见实际工程
2.验证类
读取配置文件放在map中,然后判断
public void isValid(String paramName, String paramValue) {
if(StringUtils.isBlank(paramValue)) { // 如果参数的值是空
return;
}
// 正则验证
String paramPattern = regMap.get(paramName);
if (paramPattern == null) {
return; // 没有记录相关的验证信息
}
if(!paramValue.matches(paramPattern)) {
//throw newValidateException(paramName, ErrorCode.ILLEGAL_PARAM);
System.out.println(paramName);
System.out.println(ErrorCode.ILLEGAL_PARAM);
}
// 长度验证
}
详见实际工程
3.后台需要验证的地方直接调用上述验证类
三:前台验证
1. 定义servlet启动的时候读取配置文件生成js文件
该文件内容完整
@SuppressWarnings("serial")
public class ValidateServlet extends HttpServlet {
private String username = null;
private String nickName = null;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
StringBuilder contentBuilder = newStringBuilder();
contentBuilder.append("var usernamePattern=/").append(username).append("/g; ");
contentBuilder.append("\r\n");
contentBuilder.append("var nickNamePattern=/").append(nickName).append("/g; ");
contentBuilder.append("\r\n");
contentBuilder.append("$(document).ready(function() {");
contentBuilder.append("\r\n");
contentBuilder.append(" try{\r\n");
contentBuilder.append(" jQuery.validator.addMethod(\"regExp\", function(val, element,param) {\r\n");
contentBuilder.append(" if(val && \"\"!=val) {\r\n");
contentBuilder.append(" var regExp = param;\r\n");
contentBuilder.append(" if(!val.match(regExp)) {\r\n");
contentBuilder.append(" return false;\r\n");
contentBuilder.append(" }\r\n");
contentBuilder.append(" }\r\n");
contentBuilder.append(" returntrue;\r\n");
contentBuilder.append(" },\"\");\r\n");
contentBuilder.append(" }catch(e){}\r\n");
contentBuilder.append(" });");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/javascript;charset=UTF-8");
/* 不缓存 */
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Expires", "-1");
PrintWriter out = resp.getWriter();
out.print(contentBuilder.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
@Override
public void init() throws ServletException {
super.init();
// 将配置文件中的信息取出
username = PropertyUtil.get("reg.username");
nickName = PropertyUtil.get("reg.nickName");
}
}
2. web.xml中配置该servlet生成的js文件
<servlet>
<servlet-name>ValidateServlet</servlet-name>
<servlet-class>com.common.util.validate.ValidateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ValidateServlet</servlet-name>
<url-pattern>/js/customvalidate.js</url-pattern>
</servlet-mapping>
3.js文件的完整内容
var usernamePattern=/^[a-zA-Z0-9]{32}$/g;
var nickNamePattern=/^[a-zA-Z0-9]{32}$/g;
$(document).ready(function() {
try{
jQuery.validator.addMethod("regExp", function(val, element,param) {
if(val && ""!=val) {
var regExp = param;
if(!val.match(regExp)) {
return false;
}
}
returntrue;
},"");
}catch(e){}
});
3. 页面验证
页面完整
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type"content="text/html; charset=utf-8" />
<link href="css/style.css"rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.history.js"></script>
<script type="text/javascript" src="js/customvalidate.js"></script>
<script type="text/javascript" src="js/jquery.validate.min.js"></script>
<script>
$(document).ready(function(){
//为inputForm注册validate函数
$("#inputForm").validate({
rules: {
username: {
required:true,
maxlength: 20,
minlength: 4,
regExp: usernamePattern
},nickName: {
required:true,
maxlength: 20,
minlength: 4,
regExp: nickNamePattern
}
},
messages: {
username: {
regExp: "username is not valid"
},
nickName:{
regExp: "nickname is not valid"
}
}
});
});
function save(){
$("#inputForm").submit();
}
</script>
</head>
<ul class="l_tab_cright">
<form id="inputForm" method="post" >
<table width=" " border="0"cellspacing="0" cellpadding="0"class="l_masg">
<tr>
<td align="right"><label class="l_xing">*</label ><label for="loginName" class="control-label">username:</label></td>
<td><input type="text"name="username" id="username"class="l_onf l_onf_naml" maxlength="20" tip="username"/>
</td>
</tr>
<tr>
<td align="right"><label for="nickName" class="control-label">nickname:</label></td>
<td><input type="text"name="nickName" id="nickName"class="l_onf l_onf_naml" maxlength="20" tip="<spring:messagecode='screen.user.nickname.tip'/>"/></td>
</tr>
<tr>
<td align="right"></td>
<td>
<a id="submit_btn"class="l_ok" onclick="save()" style="cursor:hand" >submit</a>
<a id="cancel_btn" class="l_cancel" value=""onclick="history.back()"style="cursor:hand">return</a>
</td>
</tr>
</table>
</form>
</ul>
</html>