提要 实时的数据校验是AJAX技术的重要优点之一,Struts校验框架通过加入这种技术进一步丰富了其MVC,从而使得Web应用程序的开发效果更接近于桌面应用程序。
一、 引言
校验框架的根本目的是实现域校验。在Web应用程序中有许多方法可以实现域校验,总体上可以分为两类:服务器端和客户端。其中,Struts校验框架是 适合于基于Java的Web应用程序环境最好的框架之一。它可以使用服务器端校验来配置应用程序并且使用在校验过程(在请求处理期间激活)中生成的错误消 息;而且它也可以通过在请求页面上生成的JavaScript来实现客户端校验。
AJAX是一种能异步地调用服务器并返回XML文档的技术,近来十分流行。它的重要优点之一是能够实现数据的实时校验。
本文将主要探讨如何使用AJAX技术进一步增强现有Struts校验框架的功能。为此,我们必须开发几个组件来实现选择校验框架并且为客户端生成指定格式的消息,还要开发一个处理错误消息生成的标签库。
二、 前提
你需要使用Windows操作系统,并安装Eclipse集成开发环境和Tomcat应用程序服务器,还要确保在你的操作系统上已经注册了MSXML 3.0 ActiveX对象。另外,你还需要Struts库(http://struts.apache.org)和JDOM库(www.jdom.org,用于 XML开发),请分别参考下面的图1和图2。
图1.AjaxForm类层次图
图2.ErrormessageHandler类层次图
三、 服务器端
StrustsActionServlet
首先,我们必须用这个类扩展org.apache.struts.action.ActionServlet类以创建一个servletMapping 变量,并用此变量来存储有关浏览器地址的action路径的信息。当添加代码时,我们必须把web.xml配置为一个用于应用程序服务器的Web应用程序 描述器。
web.xml的配置如下:
相应的StrutsActionServlet代码看上去具有如下形式:
AjaxValidationRequestProcessor
为了支持现有的Struts框架,我们必须扩展Struts包中的RequestProcessor类。为此,我们必须定制请求处理器,其一是因为我们 必须区分怎样实现校验-使用现有的Struts框架还是使用基于AJAX的方案;其二是因为我们将在服务器和客户端之间在有关如何拦截消息方面签订一种协 约。在消息生成过程中,我们使用的是XML格式-这是一种很好的媒体消息发送格式。我们所使用的XML格式的定义如下:
XML Format
描述
· Identity是客户端JavaScript的ID,用于指明消息应该放置的位置。
· Description是服务器端生成错误消息以后的结果。
首先,在处理映射前,我们需要从Web描述符中得到servlet映射配置信息。激活该过程后,应用程序就着手准备继承自AjaxForm类的表单实 例。接下来的处理将管理AJAX校验并且应该进行检查以确保来自客户端的请求没有使用Struts校验框架。在请求期间另外要实现,其一是处理收集的由客 户端发送到action表单的信息的填充问题;其二是通过使用已经存在于父类AjaxValidationRequestProcessor (TilesRequestProcessor)中的现有Struts校验框架中的方法来处理校验问题。
TilesRequestProcessor中的校验过程将调用所有基于Struts校验框架的校验并且把action错误保存到请求中。我们需要把 action错误分析成片断并生成将被发送到客户端的XML消息校验。既然我们想改变校验方式,那么在校验过程中,我们应该检查我们使用的是哪一种校验框 架(见图3)。
图3.控制器处理流程
在此,我们把JDOM作为处理引擎并使用它生成XML消息。如图4所示,当开始校验并且所用校验框架是AJAX校验框架时,接下来要进行填充错误消息并且构建XML消息校验。
图4.过滤和XML校验生成过程
ErrorMessageHandler
这个类具有XML消息构建器的功能,它基于identity和description属性来构建XML消息。在调用buildXMLMessage后, 调用者就会准备文档并设置XML消息的根元素。这个类还有一个addNextXMLMessage函数,这个函数负责把其它校验消息添加进XML(见源代 码中的列表1)。
AjaxValidationRequestProcessor类中的process方法负责把响应的content type设置为"text/xml"并且以字符串形式发送XML消息。该方法的代码如列表2(见所附源码)所示。
AjaxValidationRequestProcessor类中的processValidation方法负责填充action错误并且基于XML格式约定为客户端构建消息。此函数的代码如下所示:
构建Taglib组件
· AjaxJavaScriptLibraryTag:该taglib组件负责生成客户端基本的XMLHTTP控制器函数的JavaScript函数部分。
· AjaxErrorHtmlRenderTag:该taglib组件负责在JSP页面上生成显示错误消息的区域。
配置Taglib定义
在开发完taglib组件后,我们需要使用如列表3(见所附源码)的方式来配置taglib的tld文件。
五、 构建JSP和Struts配置
为了模仿校验处理的结果,我们首先需要构建描述层-这可以通过加入我们已经构建的taglib来实现。在本文实例中,我将尽力使用Struts提供的校 验规则组件和表单本身的校验功能来给出一个校验的实例。现在,我们在JSP页面中准备5个文本框。第一到第四个文本框使用校验规则配置,第5个文本框使用 来自action表单的校验过程。此外,我们还需要一个提交按钮来实现提交表单后对此的模仿。注意,至此,现有的Struts校验仍然没有使用AJAX。 用户接口如图5所示。
图5.JSP校验页面
六、 构建Action和Action表单
对于Struts action,我们只需把它转发到我们已经构建的JSP即可,相应的action代码具有如下类似形式:
如果输入为空,那么Action表单代码就对requiredText属性进行校验。记住,要从AjaxForm类中派生此表单类。此Action表单的validate方法看上去如下:
七、 应用Struts校验规则
接下来要配置Struts校验规则,例如最小长度,最大长度,电子邮件和模式文本,等等。然后,把这些数据应用于客户端的输入对象。这一部分相应的配置类见列表4(详见所附源码)。
八、 校验处理流程
首先,客户端初始化XMLHTTP组件以实现对服务器的请求。然后,一旦开始构建用户激活的事件,URL的参数就被发送给服务器。在结束构建参数后,客 户端将依附oneadystatechange XMLHTTP事件来听取(listen)来自服务器端的响应。在接收响应后,客户端开始分析XML校验消息并且把该消息存放到适当的地方(见图6)。
图6.客户端处理流程
当服务器接收请求时,它就开始检查AJAX校验的参数并且进行校验。一旦完成校验,生成的对象就被过滤到与用户输入对象相联系的特定的错误中。在过滤操作完成后,即刻生成XML消息并把该消息发送回客户端(见图7)。
图7.服务器端处理流程
九、 总结
在本文中,我们构建了一个控制器,它能够接收来自客户端的异步请求并且加入Struts校验过程来生成action错误对象。在生成错误对象和XML消息(见图8和图9)之后,对于即将被校验的特定输入对象的过滤操作立即执行。
图8.在Struts校验框架内使用AJAX实现应用程序校验测试
图9.Struts校验框架用例
一、 引言
校验框架的根本目的是实现域校验。在Web应用程序中有许多方法可以实现域校验,总体上可以分为两类:服务器端和客户端。其中,Struts校验框架是 适合于基于Java的Web应用程序环境最好的框架之一。它可以使用服务器端校验来配置应用程序并且使用在校验过程(在请求处理期间激活)中生成的错误消 息;而且它也可以通过在请求页面上生成的JavaScript来实现客户端校验。
AJAX是一种能异步地调用服务器并返回XML文档的技术,近来十分流行。它的重要优点之一是能够实现数据的实时校验。
本文将主要探讨如何使用AJAX技术进一步增强现有Struts校验框架的功能。为此,我们必须开发几个组件来实现选择校验框架并且为客户端生成指定格式的消息,还要开发一个处理错误消息生成的标签库。
二、 前提
你需要使用Windows操作系统,并安装Eclipse集成开发环境和Tomcat应用程序服务器,还要确保在你的操作系统上已经注册了MSXML 3.0 ActiveX对象。另外,你还需要Struts库(http://struts.apache.org)和JDOM库(www.jdom.org,用于 XML开发),请分别参考下面的图1和图2。
图1.AjaxForm类层次图
图2.ErrormessageHandler类层次图
三、 服务器端
StrustsActionServlet
首先,我们必须用这个类扩展org.apache.struts.action.ActionServlet类以创建一个servletMapping 变量,并用此变量来存储有关浏览器地址的action路径的信息。当添加代码时,我们必须把web.xml配置为一个用于应用程序服务器的Web应用程序 描述器。
web.xml的配置如下:
...
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>net.sf.struts.servlet.StrutsActionServlet</servlet-class>
...
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
...
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>net.sf.struts.servlet.StrutsActionServlet</servlet-class>
...
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
...
相应的StrutsActionServlet代码看上去具有如下形式:
public class StrutsActionServlet extends the ActionServlet.
{
public String getServletMapping() {
return this.servletMapping;
}
}
{
public String getServletMapping() {
return this.servletMapping;
}
}
AjaxValidationRequestProcessor
为了支持现有的Struts框架,我们必须扩展Struts包中的RequestProcessor类。为此,我们必须定制请求处理器,其一是因为我们 必须区分怎样实现校验-使用现有的Struts框架还是使用基于AJAX的方案;其二是因为我们将在服务器和客户端之间在有关如何拦截消息方面签订一种协 约。在消息生成过程中,我们使用的是XML格式-这是一种很好的媒体消息发送格式。我们所使用的XML格式的定义如下:
XML Format
<?xml version="1.0" encoding="UTF-8"?>
<message>
<identity name=messageAreaId>
<description>
MessageValue
</description>
</identity>
</message>
<message>
<identity name=messageAreaId>
<description>
MessageValue
</description>
</identity>
</message>
描述
· Identity是客户端JavaScript的ID,用于指明消息应该放置的位置。
· Description是服务器端生成错误消息以后的结果。
首先,在处理映射前,我们需要从Web描述符中得到servlet映射配置信息。激活该过程后,应用程序就着手准备继承自AjaxForm类的表单实 例。接下来的处理将管理AJAX校验并且应该进行检查以确保来自客户端的请求没有使用Struts校验框架。在请求期间另外要实现,其一是处理收集的由客 户端发送到action表单的信息的填充问题;其二是通过使用已经存在于父类AjaxValidationRequestProcessor (TilesRequestProcessor)中的现有Struts校验框架中的方法来处理校验问题。
TilesRequestProcessor中的校验过程将调用所有基于Struts校验框架的校验并且把action错误保存到请求中。我们需要把 action错误分析成片断并生成将被发送到客户端的XML消息校验。既然我们想改变校验方式,那么在校验过程中,我们应该检查我们使用的是哪一种校验框 架(见图3)。
图3.控制器处理流程
在此,我们把JDOM作为处理引擎并使用它生成XML消息。如图4所示,当开始校验并且所用校验框架是AJAX校验框架时,接下来要进行填充错误消息并且构建XML消息校验。
图4.过滤和XML校验生成过程
ErrorMessageHandler
这个类具有XML消息构建器的功能,它基于identity和description属性来构建XML消息。在调用buildXMLMessage后, 调用者就会准备文档并设置XML消息的根元素。这个类还有一个addNextXMLMessage函数,这个函数负责把其它校验消息添加进XML(见源代 码中的列表1)。
AjaxValidationRequestProcessor类中的process方法负责把响应的content type设置为"text/xml"并且以字符串形式发送XML消息。该方法的代码如列表2(见所附源码)所示。
AjaxValidationRequestProcessor类中的processValidation方法负责填充action错误并且基于XML格式约定为客户端构建消息。此函数的代码如下所示:
...
ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY);
Locale locale = (Locale) request.getAttribute(Globals.LOCALE_KEY);
generateXMLMessage(errors, identity, locale, sbXMLMessage);
...
四、 客户端
ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY);
Locale locale = (Locale) request.getAttribute(Globals.LOCALE_KEY);
generateXMLMessage(errors, identity, locale, sbXMLMessage);
...
构建Taglib组件
· AjaxJavaScriptLibraryTag:该taglib组件负责生成客户端基本的XMLHTTP控制器函数的JavaScript函数部分。
· AjaxErrorHtmlRenderTag:该taglib组件负责在JSP页面上生成显示错误消息的区域。
配置Taglib定义
在开发完taglib组件后,我们需要使用如列表3(见所附源码)的方式来配置taglib的tld文件。
五、 构建JSP和Struts配置
为了模仿校验处理的结果,我们首先需要构建描述层-这可以通过加入我们已经构建的taglib来实现。在本文实例中,我将尽力使用Struts提供的校 验规则组件和表单本身的校验功能来给出一个校验的实例。现在,我们在JSP页面中准备5个文本框。第一到第四个文本框使用校验规则配置,第5个文本框使用 来自action表单的校验过程。此外,我们还需要一个提交按钮来实现提交表单后对此的模仿。注意,至此,现有的Struts校验仍然没有使用AJAX。 用户接口如图5所示。
图5.JSP校验页面
六、 构建Action和Action表单
对于Struts action,我们只需把它转发到我们已经构建的JSP即可,相应的action代码具有如下类似形式:
public ActionForward execute(...) {
return mapping.findForward("success");
}
return mapping.findForward("success");
}
如果输入为空,那么Action表单代码就对requiredText属性进行校验。记住,要从AjaxForm类中派生此表单类。此Action表单的validate方法看上去如下:
public ActionErrors validate(...) {
ActionErrors errors = new ActionErrors();
if (StringUtils.isEmpty(this.requiredText)) {
errors.add("requiredText", new ActionError("error.required.input"));
}
request.setAttribute(Globals.ERROR_KEY, errors);
}
ActionErrors errors = new ActionErrors();
if (StringUtils.isEmpty(this.requiredText)) {
errors.add("requiredText", new ActionError("error.required.input"));
}
request.setAttribute(Globals.ERROR_KEY, errors);
}
七、 应用Struts校验规则
接下来要配置Struts校验规则,例如最小长度,最大长度,电子邮件和模式文本,等等。然后,把这些数据应用于客户端的输入对象。这一部分相应的配置类见列表4(详见所附源码)。
八、 校验处理流程
首先,客户端初始化XMLHTTP组件以实现对服务器的请求。然后,一旦开始构建用户激活的事件,URL的参数就被发送给服务器。在结束构建参数后,客 户端将依附oneadystatechange XMLHTTP事件来听取(listen)来自服务器端的响应。在接收响应后,客户端开始分析XML校验消息并且把该消息存放到适当的地方(见图6)。
图6.客户端处理流程
当服务器接收请求时,它就开始检查AJAX校验的参数并且进行校验。一旦完成校验,生成的对象就被过滤到与用户输入对象相联系的特定的错误中。在过滤操作完成后,即刻生成XML消息并把该消息发送回客户端(见图7)。
图7.服务器端处理流程
九、 总结
在本文中,我们构建了一个控制器,它能够接收来自客户端的异步请求并且加入Struts校验过程来生成action错误对象。在生成错误对象和XML消息(见图8和图9)之后,对于即将被校验的特定输入对象的过滤操作立即执行。
图8.在Struts校验框架内使用AJAX实现应用程序校验测试
图9.Struts校验框架用例