« | October 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | |
| 公告 |
本博客在此声明所有文章均为转摘,只做资料收集使用。并无其他商业用途。 |
Blog信息 |
blog名称: 日志总数:210 评论数量:205 留言数量:-19 访问次数:923764 建立时间:2007年5月10日 |

| |
[struts2]Struts 2与AJAX(3) 文章收藏, 网上资源, 软件技术, 电脑与网络
李小白 发表于 2007/10/27 13:07:24 |
很久没有更新BLOG了,前一段时间公司的项目比较忙,另外我还和一位出版社的朋友谈写书的事情,所以一直没有时间,完成《Struts 2与AJAX》。后来写书的事情吹了,趁今天有点空闲就把它完成。
在大家看这部分文章之前,我想对于写书的事情说两句,或者应该叫发牢骚才对。通过这次写书失败的经历,我明白为什么国内的IT书籍多数是滥于充数、粗制滥造、缺乏经典。其实说白了就是一个“钱”字作怪。为了市场,很多编辑可能会“建议”你去“抄考”一些国内相对畅销的同类书籍,例如写Struts就一定要按所谓的MVC进行目录分类,美其名曰“容易入门”。我认为“MVC”的概念虽然重要,但对初学者而言,需要对编程有一定的了解才容易明白此概念。另外,为了“实用”,不惜使用相同的技术重复编写不同的范例。可能是我不太了解读者的心理吧。
言归正传,在上两部分的《Struts 2与AJAX》中我介绍了Struts 2与DOJO结合实现AJAX的知识,本文将介绍在Struts 2中使用DWR实现AJAX表单校验。
什么是DWR
DWR(Direct Web Remoting)是在Java EE中较流行的AJAX框架,它的最大优势就是可以像使用本地的Javascript函数一样,调用服务器上的Java方法。如下图所示:
500)this.width=500'> 图1 DWR工作原理
其实DWR原理也不复杂,它先在web.xml中配置一个Servlet,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个Servlet的作用就是初始化要暴露给Javascript调用的Java类(通过dwr.xml进行配置),并生成相应的代理的Javascript类代码。在XHR请求到来的时候,Servlet负责将请求的参数变成对应的Java对象,并以其为参数调用目标Java方法,并将返回值转化为Javascript代码。详情请参考:http://getahead.ltd.uk/dwr/
Struts 2与DWR
在Struts 2.0.x中使用DWR实现AJAX表单校验。在大家掌握了DWR的原理后,下面我想详细介绍一下实现的步骤。
首先,到以下站点https://dwr.dev.java.net/files/documents/2427/47455/dwr.jar下载DWR的1.1.4版本的JAR包。需要注意的是,DWR虽然已经发布2.0版本,但它与1.1.4有很大的区别,所以请大家不要使用2.0版本,否则会出现异常的;
接着,新建WEB工程,将下图所示的JAR包加入到工程的“Build Path”中;
500)this.width=500'> 图2 依赖的JAR包
接下来,配置web.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Struts 2 AJAX Part 3</display-name> <filter> <filter-name>struts-cleanup</filter-name> <filter-class> org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class> </filter> <filter-mapping> <filter-name>struts-cleanup</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 开始DWR配置 --> <servlet> <servlet-name>dwr</servlet-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> <!-- 结束DWR配置 --> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list></web-app>清单1 WebContent/WEB-INF/web.xml
然后是DWR的配置文件:
<?xml version="1.0" encoding="UTF-8"?><!-- START SNIPPET: dwr --><!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"><dwr> <allow> <create creator="new" javascript="validator"> <param name="class" value="org.apache.struts2.validators.DWRValidator"/> </create> <convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/> </allow> <signatures> <![CDATA[ import java.util.Map; import org.apache.struts2.validators.DWRValidator; DWRValidator.doPost(String, String, Map<String, String>); ]]> </signatures></dwr><!-- END SNIPPET: dwr -->清单2 WebContent/WEB-INF/dwr.xml
通过以上配置,我们可以将DWRValidator中的方法暴露为Javascript可以调用的远程接口。
在正确完成以上步骤之后,我们发布运行一下应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_Ajax3/dwr/,应该会出现如下页面:
500)this.width=500'> 图3 DWR Servlet默认输出页面
接下来,我们要开始编写Action类了,代码如下:
500)this.width=500'>package tutorial;500)this.width=500'>500)this.width=500'>import com.opensymphony.xwork2.ActionSupport;500)this.width=500'>500)this.width=500'>500)this.width=500'>public class AjaxValidation extends ActionSupport 500)this.width=500'>{500)this.width=500'> private static final long serialVersionUID = -7901311649275887920L;500)this.width=500'>500)this.width=500'> private String name;500)this.width=500'> private String password;500)this.width=500'> private int age;500)this.width=500'> 500)this.width=500'>500)this.width=500'> public int getAge() 500)this.width=500'>{500)this.width=500'> return age;500)this.width=500'> }500)this.width=500'> 500)this.width=500'>500)this.width=500'> public void setAge(int age) 500)this.width=500'>{500)this.width=500'> this.age = age;500)this.width=500'> }500)this.width=500'> 500)this.width=500'>500)this.width=500'> public String getName() 500)this.width=500'>{500)this.width=500'> return name;500)this.width=500'> }500)this.width=500'> 500)this.width=500'>500)this.width=500'> public void setName(String name) 500)this.width=500'>{500)this.width=500'> this.name = name;500)this.width=500'> }500)this.width=500'> 500)this.width=500'>500)this.width=500'> public String getPassword() 500)this.width=500'>{500)this.width=500'> return password;500)this.width=500'> }500)this.width=500'> 500)this.width=500'>500)this.width=500'> public void setPassword(String password) 500)this.width=500'>{500)this.width=500'> this.password = password;500)this.width=500'> }500)this.width=500'> 500)this.width=500'> @Override500)this.width=500'>500)this.width=500'> public String execute() 500)this.width=500'>{ 500)this.width=500'> return SUCCESS;500)this.width=500'> }500)this.width=500'>}清单3 src/tutorial/AjaxValidation.java
上述代码一目了然,相信大家已经很熟悉了。下面,我们再来看看表单校验的配置代码:
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"><validators> <validator type="regex"> <param name="fieldName">password</param> <param name="expression"> <![CDATA[(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$]]> </param> <message>Password must be between 8 and 10 characters, contain at least one digit and one alphabetic character, and must not contain special characters</message> </validator> <field name="name"> <field-validator type="requiredstring"> <message>You must enter a name</message> </field-validator> </field> <field name="age"> <field-validator type="int"> <param name="min">18</param> <param name="max">127</param> <message>Age must be between 18 and 127</message> </field-validator> </field></validators>清单4 src/tutorial/AjaxValidation-validation.xml
对于AjaxValidation类的name、password和age三个字段,我分别用了非空、正规表达式和范围验证。正规表达式(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$的作用是保证密码由至少包括一个数字和一个字母,且不能含有符号的长度为8到10的字符串组成。它也是所谓强密码(Strong Password)的普通实现。
接下来的是JSP的代码,内容如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><%@ taglib prefix="s" uri="/struts-tags"%><!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> <title>Struts 2 AJAX - Validation</title> <s:head theme="ajax" /> </head> <body> <h2> AJAX Validation Using DWR </h2> <s:form method="post" validate="true" theme="ajax"> <s:textfield label="Name" name="name" /> <s:password label="Password" name="password" /> <s:textfield label="Age" name="age" /> <s:submit /> </s:form> </body></html>清单5 WebContent/AjaxValidation.jsp
以上代码也不复杂,不过需要的是注意的是除了要加入<s:head theme="ajax" />外,<s:form />也必须加入validate="true" theme="ajax"的属性。
最后是Struts 2的配置文件,内容如下所示:
< |
|
|