本站首页    管理页面    写新日志    退出


«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031


公告
本博客在此声明所有文章均为转摘,只做资料收集使用。并无其他商业用途。

我的分类(专题)

日志更新

最新评论

留言板

链接

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的配置文件,内容如下所示: <


阅读全文(1622) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144793075 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号