Max On Java
The value of hands-on experience as compared to book learning is
smaller in software development than in many other fields.
BlogJava 首页 新随笔 联系 聚合 管理
随笔-19 评论-1336 文章-0 trackbacks-0
Struts 2与AJAX(第三部分)
很久没有更新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方法。如下图所示:
图
1 DWR
工作原理
其实DWR原理也不复杂,它先在web.xml中配置一个Servlet,映射到
Struts 2与AJAX(第三部分) - Max On Java - BlogJava http://www.blogjava.net/max/archive/2007/08/16/137363.html
1 of 24 2008-6-4 17:57
特定的路径(通常是%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”
中;
图
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
>
2006年10月 (3)
搜索
最新评论
1. re: Struts 2的基石——拦截器
(Interceptor)[未登录]
通俗易懂,又有所收获了
--John
2. re: 转换器(Converter)——
Struts 2.0中的魔术师
@Spring
@ElgooG
你们的问题解决了吗?我也是同样
的问题
--hover
3. re: Struts 2中的OGNL
评论内容较长,点击标题查看
--sway
4. re: 为Struts 2.0做好准备
好文章!
详细,易懂.
本人就是加包的时候多加了些包,花
了些时间排错.其实不加入其它框架
的情况,加截图中的五个包就够了,否
则要加入其它框架的包
--ysaas
5. re: 编写基于Prototype的
Javascript动画类
firefox浏览器好垃圾的,特别是对中
文网站,显示样式都不正确
--ysaas
阅读排行榜
1. 为Struts 2.0做好准备(48453)
2. 常用的Struts 2.0的标志(Tag)
介绍(31280)
3. Struts 2.0的Action讲解(26864)
4. Struts 2与AJAX(第一部分)
(20493)
5. Struts 2的基石——拦截器
(Interceptor)(20466)
评论排行榜
1. 为Struts 2.0做好准备(262)
2. 常用的Struts 2.0的标志(Tag)
介绍(116)
3. 在Struts 2中实现IoC(112)
4. 在Struts 2.0中实现表单数据校验
(Validation)(103)
5. Struts 2.0的Action讲解(95)
Struts 2与AJAX(第三部分) - Max On Java - BlogJava http://www.blogjava.net/max/archive/2007/08/16/137363.html
2 of 24 2008-6-4 17:57
<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>);
]]>
Struts 2与AJAX(第三部分) - Max On Java - BlogJava http://www.blogjava.net/max/archive/2007/08/16/137363.html
3 of 24 2008-6-4 17:57
</signatures>
</dwr>
<!-- END SNIPPET: dwr -->
清单
2 WebContent/WEB-INF/dwr.xml
通过以上配置,我们可以将DWRValidator中的方法暴露为Javascript
可以调用的远程接口。
在正确完成以上步骤之后,我们发布运行一下应用程序,在浏览器地址
栏中输入http://localhost:8080/Struts2_Ajax3/dwr/,应该会出现
如下页面:
图
3 DWR Servlet
默认输出页面
接下来,我们要开始编写Action类了,代码如下:
package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public class AjaxValidation extends ActionSupport {
private static final long serialVersionUID =
-7901311649275887920L;
private String name;
private String password;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
Struts 2与AJAX(第三部分) - Max On Java - BlogJava http://www.blogjava.net/max/archive/2007/08/16/137363.html
4 of 24 2008-6-4 17:57
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() {
return SUCCESS;
}
}
清单
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})$的作用是保证密码由至少包括一个
Struts 2与AJAX(第三部分) - Max On Java - BlogJava http://www.blogjava.net/max/archive/2007/08/16/137363.html
5 of 24 2008-6-4 17:57