实时数据验证是AJAX技术的一大优势之一。通过应用此技术,struts验证框架将增强struts MVC,并使Web应用程序更接近于桌面应用程序。
此验证框架用于验证字段。有许多在Web应用程序上进行验证的方法。这些方法可分为两类:服务器端方法和客户端方法。Struts验证框架是面向基于Java的Web应用环境的最佳框架之一。它能够配置应用程序,方法是使用服务器端验证和错误消息,此错误消息在处理请求时呈现在调用的验证流程上,它还能够进行客户端验证,方法是使用请求页面上呈现的JavaScript。
AJAX是一种JavaScript技术,它能够异步呼叫服务器并获取XML文档,这类文档最近非常流行。其用途之一就是实时数据验证。
本文关注使用AJAX增强现有struts验证框架。必须开发几个组件(例如控制器),以选择验证框架,并呈现特定格式的消息(用于客户端)和标签库(处理错误消息呈现)。
必要条件
需要一个具有Eclipse和Tomcat应用服务器的Windows系统。请确定已在操作系统中注册了MSXML 3.0 ActiveX对象。还需要Struts库(http://struts.apache.org)和JDOM库(www.jdom.org),以用于XML开发(参见图1和图2)。


服务器端场景
StrustsActionServlet
我们必须扩展来自org.apache.struts.action.ActionServlet的类,以获得servletMapping变量,此变量存储关于如何针对动作类将该扩展格式化为浏览器地址形式的动作路径的信息。当添加代码时,我们必须将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>
...
StrutsActionServlet Java代码如下:
public class StrutsActionServlet extends the ActionServlet.
{
public String getServletMapping() {
return this.servletMapping;
}
}
AjaxValidationRequestProcessor
要在第一步中支持现有Struts框架,我们必须扩展来自Struts软件包的RequestProcessor。我们必须定制化此请求处理器,因为我们必须判别将如何进行验证(通过使用现有Struts框架,还是利用AJAX概念),还因为我们将在服务器和客户端之间制订一个有关如何解释消息的契约。在消息呈现方面,我们将使用XML格式,这是一种很好的媒体消息传递格式。我们将应用的XML格式的定义是:
XML Format
XML Format
<?xml version="1.0" encoding="UTF-8"?>
<message>
<identity name=messageAreaId>
<description>
MessageValue
</description>
</identity>
</message>
描述
- Identity是客户端JavaScript用于了解消息将被置于何处的ID。
- Description是在服务器端呈现错误消息后的结果。
首先我们需要在继续流程映射之前,从Web描述符获得servlet映射配置。调用此流程后,应用程序将准备表单实例,此实例继承自AjaxForm类。这一处理管理AJAX验证,并且应进行检查以确定来自客户端的请求没有使用struts验证框架。其他在请求过程中执行的流程是流程填充(用于收集客户端发送到动作表单的信息)和流程验证(通过使用现有Struts验证框架中已经存在于AjaxValidationRequestProcessor的父类TilesRequestProcessor中的方法)。
来自TilesRequestProcessor的验证流程将调用所有基于struts验证框架的验证,并将动作错误存储到请求。我们需要仔细分析动作错误,并生成XML消息验证,此验证将被发送到客户端。因为我们希望更改支持验证的行为方式,所以验证流程应检查所用的验证框架的指示器(参见图3)。

使用JDOM作为处理引擎,生成XML消息。如图4所示,如果流程验证被调用,且验证框架的条件等同于AJAX验证框架,则流程将继续填充错误消息并构建XML消息验证。

ErrorMessageHandler
该类处理XML消息生成器的功能。此Java类将构建基于identity和description属性的XML消息。调用方调用了buildXMLMessage之后,它将准备文档并设置XML消息的根元素。此类还具有一个addNextXMLMessage函数,以将更多验证消息添加到XML(参见清单1)。
清单1
...
public void buildXMLMessage() throws ParserConfigurationException {
// initiate document builder to prepare the media of XML Message
this.rootElement = new Element(CONSTANT_MESSAGE);
addNextXMLMessage();
}
...
public void addNextXMLMessage() throws ParserConfigurationException {
// creating the xml message based on format above
Element identityElement = new Element(CONSTANT_IDENTITY);
identityElement.setAttribute(CONSTANT_NAME, this.identity);
Element descriptionElement = new Element(CONSTANT_DESCRIPTION);
descriptionElement.addContent(this.description);
identityElement.addContent(descriptionElement);
rootElement.addContent(identityElement);
}
此流程方法将响应的内容类型设置为“text/xml”,并将XML消息作为字符串发送。AjaxValidationRequestProcessor代码上的流程函数如清单2所示。
清单2
public void process(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
if ( request.getParameter(CONSTANT_VALIDATION_FRAMEWORK_ARG) != null )
{
...
this.processValidate(req, resp, form, mapping);
response.setContentType(CONSTANT_XML_CONTENT_TYPE);
response.getWriter().write(sbXMLMessage.toString());
response.flushBuffer();
}
} else
{
super.process(req, resp);
}
}
processValidation方法将填充
动作错误,并基于面向客户端的XML格式契约构建消息。AjaxValidationRequestProcessor代码上的processValidation函数如下所示:
...
ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY);
Locale locale = (Locale) request.getAttribute(Globals.LOCALE_KEY);
generateXMLMessage(errors, identity, locale, sbXMLMessage);
...
客户端场景
构建标签库组件
- AjaxJavaScriptLibraryTag:此标签库组件在客户端呈现JavaScript功能,以实现基本XMLHTTP控制器功能。
- AjaxErrorHtmlRenderTag:此标签库组件在JSP页面呈现错误消息区域。
配置标签库定义
开发出标签库组件之后,我们需要配置清单3中显示的标签库tld文件。
清单3
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>ajaxLib</shortname>
<tag>
<name>library</name>
<tagclass>net.sf.ajax.taglib.AjaxJavaScriptLibrary
</tagclass>
<bodycontent>JSP</bodycontent>
</tag>
<tag>
<name>error</name>
<tagclass>net.sf.ajax.taglib.AjaxErrorHtmlRender
</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>property</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>event</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
构建JSP和Struts配置
要模拟验证处理的结果,我们首先需要构建呈现层,方法是合并我们已经构建的标签库。在此例中,我试图给出一个示例验证(通过使用来自Struts的验证规则组件)以及来自表单本身的验证。准备五个JSP页面下的文本框。第一个到第四个文本框使用验证规则配置,第五个文本框使用来自动作表单的验证流程。除此之外,我们还需要一个提交按钮,以在提交表单后模拟它,现有的struts验证仍在没有AJAX的情况下工作。用户界面外观如图5所示。

构建动作和动作表单
为获得Struts动作,我们转到已经构建的JSP。此动作代码如下所示:
public ActionForward execute(...) {
return mapping.findForward("success");
}
如果输入为空,则此动作表单代码将验证requiredText属性。请记住,要从AjaxForm类扩展此表单。动作表单的验证方法如下所示:
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);
}
应用Struts验证规则
配置Struts验证规则(例如最小长度、最大长度、电子邮件和模式文本)将应用于客户端的输入对象,且配置与清单4类似。
清单4
<field property="paternText"
depends="required,mask">
<arg0 key="label.paternText"/>
<var>
<var-name>mask</var-name>
<var-value>^[0-9]{3}-[0-9]{2}___FCKpd___8lt;/var-value>
</var>
</field>
<field property="minLength"
depends="minlength">
<arg0 key="label.minLength"/>
<arg1 key="${var:minlength}" resource="false"/>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
</field>
<field property="maxLength"
depends="maxlength">
<arg0 key="label.maxLength"/>
<arg1 key="${var:maxlength}" resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>5</var-value>
</var>
</field>
<field property="email"
depends="email">
<arg0 key="label.email"/>
</field>
验证处理流
首先客户端会初始化XMLHTTP组件以执行到服务器的请求,然后在用户触发器开始构建时,URL参数将被发送到服务器。在完成构建参数后,客户端会连接oneadystatechange XMLHTTP事件,以侦听来自服务器端的响应。收到响应后,客户端会开始分析XML验证消息,并将消息放置到正确的区域(参见图6)。

如果请求被服务器接受,则服务器会开始检查AJAX验证条件的参数,并处理验证。完成之后,将从生成的错误对象过滤出与用户输入对象相关的特定错误。在过滤流程完成之后,将生成XML消息,并发送回客户端(参见图7)。

结束语
在本文中,我们构建了一个控制器,它能够接收来自客户端的异步请求,并合并struts验证流程以产生动作错误对象。在产生错误对象并生成作为应答返回客户端以指示错误消息的XML消息之后,将对被验证的特定输入对象进行过滤(参见图8和图9)。


原文出处:http://jdj.sys-con.com/read/171472.htm
<!--文章其他信息-->
作者简介
|
|
Sonny Hastomo 是Sigma Cipta Caraka公司面向银行解决方案的电子交付通道团队的产品开发顾问,他目前专注于使用OS/400和AIX操作系统的遗留应用程序的集成和连接。 |
Listing 1
...
public void buildXMLMessage() throws ParserConfigurationException {
// initiate document builder to prepare the media of XML Message
this.rootElement = new Element(CONSTANT_MESSAGE);
addNextXMLMessage();
}
...
public void addNextXMLMessage() throws ParserConfigurationException {
// creating the xml message based on format above
Element identityElement = new Element(CONSTANT_IDENTITY);
identityElement.setAttribute(CONSTANT_NAME, this.identity);
Element descriptionElement = new Element(CONSTANT_DESCRIPTION);
descriptionElement.addContent(this.description);
identityElement.addContent(descriptionElement);
rootElement.addContent(identityElement);
}
Listing 2
public void process(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
if ( request.getParameter(CONSTANT_VALIDATION_FRAMEWORK_ARG) != null )
{
...
this.processValidate(req, resp, form, mapping);
response.setContentType(CONSTANT_XML_CONTENT_TYPE);
response.getWriter().write(sbXMLMessage.toString());
response.flushBuffer();
}
} else
{
super.process(req, resp);
}
}
Listing 3
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>ajaxLib</shortname>
<tag>
<name>library</name>
<tagclass>net.sf.ajax.taglib.AjaxJavaScriptLibrary
</tagclass>
<bodycontent>JSP</bodycontent>
</tag>
<tag>
<name>error</name>
<tagclass>net.sf.ajax.taglib.AjaxErrorHtmlRender
</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>property</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>event</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Listing 4
<field property="paternText"
depends="required,mask">
<arg0 key="label.paternText"/>
<var>
<var-name>mask</var-name>
<var-value>^[0-9]{3}-[0-9]{2}___FCKpd___9lt;/var-value>
</var>
</field>
<field property="minLength"
depends="minlength">
<arg0 key="label.minLength"/>
<arg1 key="${var:minlength}" resource="false"/>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
</field>
<field property="maxLength"
depends="maxlength">
<arg0 key="label.maxLength"/>
<arg1 key="${var:maxlength}" resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>5</var-value>
</var>
</field>
<field property="email"
depends="email">
<arg0 key="label.email"/>
</field>
分享到:
相关推荐
4. **Struts 2与AJAX的集成**:介绍如何在Struts 2应用中使用AJAX,可能包括XMLHttpRequest对象、JSON数据格式、以及Struts2-AJAX插件的使用。 5. **实战示例**:提供了一些实际的开发案例,如创建一个简单的Struts ...
**AJAX技术与Struts验证框架的结合应用** 在现代Web开发中,AJAX(Asynchronous JavaScript and XML)技术已经成为提升用户体验的重要手段。它允许页面部分更新,无需刷新整个页面,从而实现更快、更流畅的交互。而...
一个简单的例子是使用`$.ajax()`函数,指定URL为Struts2 Action的路径,方法为GET或POST,根据你的需求来传递参数,如待验证的用户名。 3. **服务器端验证**:在Action类中,你需要编写一个方法来检查用户名是否已...
**Ajax + Struts 与 Ajax 的 DWR 框架使用详解** 在现代Web开发中,Ajax(Asynchronous JavaScript and XML)技术极大地提升了用户体验,它允许网页在不刷新整个页面的情况下与服务器进行交互。Struts作为Java EE...
8. 实例演示:使用Struts2+Jquery+Ajax实现动态加载数据或表单验证 "struts2 jar"文件包含了Struts2框架的核心库,可能包括struts2-core、struts2-convention、struts2-json-plugin等依赖,这些是开发Struts2应用必...
在Web开发领域,Ajax(Asynchronous JavaScript and XML)框架与Struts框架的结合使用,能够构建出具有高度交互性和响应性的应用程序。这篇文章将深入探讨如何有效地整合这两种技术,以提升用户体验。 **Ajax框架的...
**Ajax 框架与 Struts 框架的整合详解** 在Web开发中,Ajax(Asynchronous JavaScript and XML)框架和Struts框架是两种常用的技术。Ajax允许创建动态、无需刷新整个页面即可更新内容的Web应用,而Struts则是一种...
在那个时期,Struts2已经整合了WebWork框架的核心功能,引入了Action、Result和Interceptor等概念,提供了强大的表单验证和国际化支持。这个版本的Struts2引入了OGNL(Object-Graph Navigation Language)表达式语言...
此外,为了更好地展示数据,可能还需要在Struts2中使用Interceptor(拦截器),例如,`params`拦截器用于将请求参数绑定到Action,`validation`拦截器负责验证表单数据,`workflow`拦截器管理Action的生命周期。...
框架struts的使用,用Ajax验证用户名的登录,真的很好,初学框架的人快来看看哦
Struts2、jQuery和Ajax是Web开发中的三大关键技术,它们结合使用可以构建高效、动态且用户友好的登录验证系统。以下是对这些技术及其在登录验证中的应用的详细说明。 Struts2是一个基于MVC(Model-View-Controller...
在IT行业中,构建一个自定义Ajax框架和模拟Struts框架是一项高级技能,涉及到Web开发的核心技术。Ajax(Asynchronous JavaScript and XML)是一种用于创建快速、动态网页的技术,它允许页面在不重新加载整个页面的...
总结来说,这个AjaxStruts2Json实例展示了如何在Struts2框架下利用Ajax进行异步请求,通过JSON传递和处理数据,从而实现网页的局部刷新。实践这个实例,开发者可以更深入地理解Struts2、Ajax以及JSON在实际项目中的...
在这个名为"struts-ajax.zip"的压缩包中,我们可以推测它包含了使用Struts框架与Ajax技术(通过JavaScript实现)进行开发的一些实例和资源。 Struts是一个开源的Java MVC(Model-View-Controller)框架,主要用于...
- Struts2拥有丰富的插件生态系统,如REST插件、Ajax插件、Freemarker和Velocity模板插件等,可以扩展框架的功能。 9. **与Spring的整合** - 使用`struts2-spring-plugin`,可以直接在Spring容器中管理Action实例...
AJAX实现用户登录注册(Struts+Spring+Hibernate+Ajax框架) AJAX实现用户登录注册(Struts+Spring+Hibernate+Ajax框架) AJAX实现用户登录注册(Struts+Spring+Hibernate+Ajax框架)
5. **验证框架**:`struts2-validation-plugin.jar`包含Struts2的内置验证框架,可以方便地对用户输入进行验证,并在验证失败时提供反馈。 6. **Tiles框架集成**:虽然Struts1时代就有的Tiles框架在Struts2中仍然...