还可以定义其他的验证规则。应用自定义的规则很容易,自定义规则和内置规则用法是一样的。
在此,提供一个有用的验证规则,那就是针对select下拉框的验证:
Javascript代码
/**
* 自定义验证规则——增加对select的验证
*/
$.validator.addMethod(
"selectNone", // name验证方法名
function(value, element) // 验证规则
{
if (value == "none") // select默认值需要设置为"none"(当然可以自定义其他值)
{
return false;
}
else
{
return true;
}
},
"必须选择一项" // 默认验证消息(自定义规则信息的国际化是否不起作用?)
);
/**
* 自定义验证规则——增加对select的验证
*/
$.validator.addMethod(
"selectNone", // name验证方法名
function(value, element) // 验证规则
{
if (value == "none") // select默认值需要设置为"none"(当然可以自定义其他值)
{
return false;
}
else
{
return true;
}
},
"必须选择一项" // 默认验证消息(自定义规则信息的国际化是否不起作用?)
);
二、验证信息的国际化
验证信息国际化是很方便的,默认验证信息是英文的,只需导入validation已写好的国际化文件,如:
Javascript代码
<script type="text/javascript" src="scripts/jQuery/plugins/jquery.validate.js"></script>
<script type="text/javascript" src="scripts/jQuery/plugins/jquery.validate.messages_cn.js"></script>
<script type="text/javascript" src="scripts/jQuery/plugins/jquery.validate.js"></script>
<script type="text/javascript" src="scripts/jQuery/plugins/jquery.validate.messages_cn.js"></script>
在验证时,去掉message,提示信息就会变成中文。
可以改国际化文件中的提示信息内容,使其更加个性化、符合项目要求。另外,如果在验证时使用了message,message中指定的字段提示信息会覆盖国际化文件中的信息。
这里有一个问题,国际化时似乎没法根据浏览器的locale来自动识别该用什么语言来显示。笔者测试了一下,当导入多国语言文件时,总是会使用最后一次导入的语言。因此,要实现真正的国际化,可以通过一个链接之类的来选择语言,然后用javascript来导入不同的语言文件。
三、远程验证
远程验证很有用,用户体验很好,因为不需要提交表单就知道自己注册用户的是否已被注册。validation插件通过remote规则来实现验证。在此讲解一下如果将请求提交给struts2的action来验证。
remote规则的格式为:
Javascript代码
remote: {
url: "ajax/validateUserName.action", //后台处理程序
type: "post", //数据发送方式
dataType: "json", //接受数据格式
data: { //要传递的数据,默认已传递应用此规则的表单项
email: function() {
return $("#email").val();
}
}
remote: {
url: "ajax/validateUserName.action", //后台处理程序
type: "post", //数据发送方式
dataType: "json", //接受数据格式
data: { //要传递的数据,默认已传递应用此规则的表单项
email: function() {
return $("#email").val();
}
}
由于remote规则只允许后台返回true或false,因此struts2的action得不同于一般的action,不能返回一个字符串,然后dispatch一个视图之类的。研究之后,发现struts2中有一种result类型:stream,通过该类型可以实现返回true或false。action代码如下:
Java代码
view plaincopy to clipboardprint?
// 定义返回的输入流
private InputStream inputStream;
// 定义需要到远程验证的字段
private String userName;
private String email;
// 定义返回值:只能为Boolean类型
private Boolean valid;
/**
* Action执行的方法:实现远程验证,将业务逻辑交给后台处理,并接收结果
* 同时,将结果返回。
* @return
*/
public String execute()
{
// 根据userName判断该SP/CP是否已被注册;根据email判断该账号是否已被占用
if(spcpPreApprovalService.existSpcpAccount(userName, email))
{
valid = false;
}
else
{
valid = true;
}
inputStream = new ByteArrayInputStream(valid.toString().getBytes());
return Action.SUCCESS;
}
// 省略getter、setter
view plaincopy to clipboardprint?
// 定义返回的输入流
private InputStream inputStream;
// 定义需要到远程验证的字段
private String userName;
private String email;
// 定义返回值:只能为Boolean类型
private Boolean valid;
/**
* Action执行的方法:实现远程验证,将业务逻辑交给后台处理,并接收结果
* 同时,将结果返回。
* @return
*/
public String execute()
{
// 根据userName判断该SP/CP是否已被注册;根据email判断该账号是否已被占用
if(spcpPreApprovalService.existSpcpAccount(userName, email))
{
valid = false;
}
else
{
valid = true;
}
inputStream = new ByteArrayInputStream(valid.toString().getBytes());
return Action.SUCCESS;
}
// 省略getter、setter
struts.xml文件的配置为:
Xml代码
<package name="ajax" namespace="/ajax" extends="struts-default">
<action name="validateSpId" class="validateSpcpAction">
<result type="stream">
<param name="contentType">text/html</param><!-- 默认为text/plain -->
<param name="inputName">inputStream</param><!-- 默认就为inputStream -->
</result>
</action>
</package>
<package name="ajax" namespace="/ajax" extends="struts-default">
<action name="validateSpId" class="validateSpcpAction">
<result type="stream">
<param name="contentType">text/html</param><!-- 默认为text/plain -->
<param name="inputName">inputStream</param><!-- 默认就为inputStream -->
</result>
</action>
</package>
这样便可以实现远程验证功能。
总结
可以看出validation使表单验证变得很容易,实现起来很轻松。validation插件还有其他一些功能,需要了解可以查看官方文档。
由于写的demo是把公司项目的一些页面改为ajax+struts2,所以在此不方便把所有的代买贴出来。如果遇到什么问题,可以联系我。