首先,描述一下问题:
因为最近需要在进行中的 J2EE 项目中(已经快结束了,不然会考虑用 ROR的 ),需要支持 AJAX 的功能(Type Aheand suggest),所以在页面中引用了 prototype.js , 同时,项目本身早就用上 Struts Validator,并且启用client端的就 javascript 验证,在成功实现了Ajax 的 Type Ahead Suggest 后, 欣喜之后发现:client端的就 javascript 验证不起作用了,查了3个小时,最终发现:是上述两个框架冲突了。
接下来,详解:
以上一帖的“必填”验证为例:
function theForm_required ()
{
this.a0 = new Array("theField", "The Field is required.", new Function ("varName", " return this[varName];"));
}
接下来,我提一下 Struts Validator 包中的javascript目录里的validateRequired.js 的function validateRequired(form) 函数,如下:
function validateRequired(form) {
var isValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
var formName = form.getAttributeNode("name");
oRequired = eval('new ' + formName.value + '_required()');
alert(oRequired);
for (x in oRequired) {
var field = form[oRequired[x][0]];
alert(x);
if ((field.type == 'hidden' ||
field.type == 'text' ||
field.type == 'textarea' ||
field.type == 'file' ||
field.type == 'checkbox' ||
field.type == 'select-one' ||
field.type == 'password') &&
field.disabled == false) {
var value = '';
// get field's value
if (field.type == "select-one") {
var si = field.selectedIndex;
if (si >= 0) {
value = field.options[si].value;
}
} else if (field.type == 'checkbox') {
if (field.checked) {
value = field.value;
}
} else {
value = field.value;
}
if (trim(value).length == 0) {
if (i == 0) {
focusField = field;
}
fields[i++] = oRequired[x][1];
isValid = false;
}
} else if (field.type == "select-multiple") {
var numOptions = field.options.length;
lastSelected=-1;
for(loop=numOptions-1;loop>=0;loop--) {
if(field.options[loop].selected) {
lastSelected = loop;
value = field.options[loop].value;
break;
}
}
if(lastSelected < 0 || trim(value).length == 0) {
if(i == 0) {
focusField = field;
}
fields[i++] = oRequired[x][1];
isValid=false;
}
} else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
isChecked=-1;
for (loop=0;loop < field.length;loop++) {
if (field[loop].checked) {
isChecked=loop;
break; // only one needs to be checked
}
}
if (isChecked < 0) {
if (i == 0) {
focusField = field[0];
}
fields[i++] = oRequired[x][1];
isValid=false;
}
}
}
if (fields.length > 0) {
focusField.focus();
alert(fields.join('\n'));
}
return isValid;
}
请注意我在上面的代码中标示红色的代码行,看到了吧,其实 'new ' + formName.value + '_required()' 就是 theForm_required() 函数名, 而 oRequired 就是利用javascript 强大的动态解析功能得到的theForm_required对象,后面的代码我就不用多做解析了吧,就是循环此对象的每个内部的数组(每个数组就是配置文件内容的客户端表示,就此例来说分别是:字段名,出错提示,提示参数获取函数)。
本帖重点:
说了那么多,前面描述的问题还没用解决呢? 好,开始把,其实很简单(看似简单的问题最会搞死人! ^_^); 只要在 Struts Validator 包中的javascript目录里的的每一个 .js 文件里的函数内部加入以下标示为红色的代码行即可!
function validateRequired(form) {
var isValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
var formName = form.getAttributeNode("name");
oRequired = eval('new ' + formName.value + '_required()');
alert(oRequired);
for (x in oRequired) {
var re = /^a\d+/;
if(! re.test(x) )
{
continue;
}
var field = form[oRequired[x][0]];
alert(x);
if ((field.type == 'hidden' ||
field.type == 'text' ||
field.type == 'textarea' ||
field.type == 'file' ||
field.type == 'checkbox' ||
field.type == 'select-one' ||
field.type == 'password') &&
field.disabled == false) {
var value = '';
// get field's value
if (field.type == "select-one") {
var si = field.selectedIndex;
if (si >= 0) {
value = field.options[si].value;
}
} else if (field.type == 'checkbox') {
if (field.checked) {
value = field.value;
}
} else {
value = field.value;
}
if (trim(value).length == 0) {
if (i == 0) {
focusField = field;
}
fields[i++] = oRequired[x][1];
isValid = false;
}
} else if (field.type == "select-multiple") {
var numOptions = field.options.length;
lastSelected=-1;
for(loop=numOptions-1;loop>=0;loop--) {
if(field.options[loop].selected) {
lastSelected = loop;
value = field.options[loop].value;
break;
}
}
if(lastSelected < 0 || trim(value).length == 0) {
if(i == 0) {
focusField = field;
}
fields[i++] = oRequired[x][1];
isValid=false;
}
} else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
isChecked=-1;
for (loop=0;loop < field.length;loop++) {
if (field[loop].checked) {
isChecked=loop;
break; // only one needs to be checked
}
}
if (isChecked < 0) {
if (i == 0) {
focusField = field[0];
}
fields[i++] = oRequired[x][1];
isValid=false;
}
}
}
if (fields.length > 0) {
focusField.focus();
alert(fields.join('\n'));
}
return isValid;
}
总结:
由于 prototype.js 对 Object() 类作了扩展,因此上面的 eval() 语句动态生成的对象除了this.a0 还有其他的字段, 而 Struts Validator 所需要的是配置文件内容的客户端表示的 a[XXXX] 字段而已。
注意!要在 Struts Validator 包中的javascript目录里的的每一个 .js 文件里的函数内部都加入以上标示为红色的代码行,并重新打包成.jar。
后语:
本帖提到的Ajax支持的后端也是本人在Struts Action 基础上实现的,后端没有用其他的Ajax框架,前端还用到了 Rico 框架!
分享到:
相关推荐
Struts 1.1 Validator 校验实例 完全代码, 直接工程 导入 <br>参考 Struts in action 上面修改!!!
这篇博客讨论的是在使用Commons Validator 1.3版本与Struts 1.1版本时遇到的问题及其解决方案。 Apache Commons Validator提供了一套强大的验证规则,用于确保用户输入的数据符合预设的规范。它允许开发者定义XML...
Struts的Validator框架是Java Web开发中用于处理用户输入验证的一种强大的工具,它与MVC架构中的控制器层紧密结合,提供了一种便捷的方式来确保用户提交的数据符合预设的业务规则。这个框架大大简化了数据验证的过程...
struts中自定义validator验证 <br>很多时候需要验证“密码”与“重复密码”是否一致,如果放在服务器端验证就浪费资源了。 如何在客户端进行验证...JS可以实现,但是struts的validator框架是否能实现呢?-见示例
Struts的Validator-rules是Apache Struts框架的一个关键组件,主要用于处理Web应用中的表单验证。这个组件使得开发者能够方便地定义和实现客户端与服务器端的数据验证规则,从而确保用户输入的数据符合业务逻辑的...
Struts Validator是一个强大的验证框架,它是Apache Struts框架的一部分,用于在Java Web应用程序中实现数据输入验证。这个项目集成了验证规则,使得开发者能够轻松地确保用户提交的数据符合预期的格式和约束,从而...
6. **Integration with Struts Controller**:Validator框架与Struts控制器紧密集成,当验证失败时,控制器会阻止业务逻辑的执行,转而返回错误页面。 总结来说,Struts中的Validator框架提供了一种强大的方式来...
Struts Validator 是 Apache Struts 框架的一个重要组成部分,它提供了一种方便的方式来验证用户输入数据的有效性。Struts 通过插件(Plugin)机制来集成 Validator 功能,使得开发者可以轻松地在应用中添加数据验证...
Struts 1.1 API 是一个关键的开发者资源,它为使用Apache Struts框架进行Java Web应用程序开发提供了详细的文档和接口定义。Struts是一个开源的MVC(模型-视图-控制器)框架,用于构建可维护性和可扩展性高的企业级...
相比于Struts内置的ActionForm Bean验证方式,Struts Validator提供了更灵活、更强大的验证功能,能够处理复杂的验证逻辑,并且可以与Spring和Hibernate等其他框架无缝集成,形成完整的Struts2 + Spring + Hibernate...
综上所述,Struts1的Validator框架为Java Web开发者提供了一套完整的表单验证解决方案。通过合理的配置和使用,可以有效增强应用的数据安全性和用户体验。然而,随着技术的发展,现代Web应用可能更倾向于使用Spring ...
Struts Validator是一个强大的验证框架,它是Apache Struts项目的一部分,用于在Java Web应用程序中执行客户端和服务器端的数据验证。这个“一个validator的验证程序.rar_struts_validator”压缩包包含了一个作者自...
下面我们将详细介绍Struts1.3中Validator的使用和与Struts1.2的区别。 1. 配置文件:在Struts1.3中,Validator的配置通常位于`validation.xml`文件中,这里定义了验证规则和错误消息。每个ActionForm对应一个验证...
总之,Struts1.x的Validator框架为Java Web开发者提供了一种方便、强大的数据验证解决方案。通过理解其工作原理和配置方式,我们可以有效地提高应用程序的安全性和用户体验。这个入门例子将帮助你快速掌握Validator...
在描述中提到的"struts2 plus是方便了struts2 validator的应用",这指的是Struts2 Plus对Struts2的内置验证框架进行了优化和增强。Struts2 Validator是Struts2中用于处理用户输入数据验证的组件,它允许开发者定义一...
Struts是Java Web开发中的一个流行MVC框架,它的核心组件之一是Validator,用于处理表单数据的验证。本文将详细介绍Struts验证器Validator的使用,包括基础配置、自定义验证器的创建,以及如何在Maven项目中管理和...
自0.5版以来,Struts Validator就已集成在Struts中,起初作为开发人员包的一部分,随后其核心代码迁移到Jakarta Commons库和Struts特别扩展中,成为Struts 1.1的一个关键特性。由于其易用性和强大的功能,许多开发者...
Struts的Validator验证框架是Java Web开发中常用的一个组件,主要用于处理用户输入的数据验证。它提供了强大的、可扩展的验证规则,使得开发者可以方便地在应用程序中实施数据校验,从而保证了数据的准确性和安全性...
Struts是Java Web开发中的一款经典MVC框架,它的Validator组件是用于表单验证的核心工具。Validator验证在Struts应用程序中扮演着至关重要的角色,它能够确保用户输入的数据符合预设的规则,从而提高应用的健壮性和...