赢在执行

这个世界上只有两样东西愈分享愈多,那就是智慧与爱。

BlogJava 首页 新随笔 联系 聚合 管理
  17 Posts :: 11 Stories :: 13 Comments :: 0 Trackbacks
Struts2的Ajax输入校验   文章指数:0  CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。

    这段时间在研究Struts2,学习资料是新上市的李刚著的《Struts2权威指南》,很不错的一本书,看了觉得收获很大。刚研究完Struts2中的Ajax输入校验,并做了一些例子,现总结如下:


    Ajax的输入校验不是客户端校验,而是服务器端校验,但这种服务器端校验是以异步方式进行的,浏览者无需显示提交请求,当浏览者输入完成后,系统自动完成校验。Struts2的Ajax校验建立在DWR和Dojo两个框架之上,其中DWR负责实现在JavaScript中调用远程Java方法,而Dojo则负责实现页面效果的实现。
一. 配置DWR的核心Servlet
DWR是Java领域的Ajax框架,它允许客户端JavaScript代码直接调用服务器端的Java方法,而这个过程是通过一个核心Servlet的转换来实现的。为了让DWR的核心Servlet起作用,必须在web.xml文件中配置该核心Servlet。配置DWR的核心Servlet的配置片段如下:
<!-- 配置Struts2的核心Servlet -->
<servlet>
<servlet-name>dwr</servlet-name>
<!-- 指定Servlet的实现类 -->
 <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
 <!-- 指定处于开发阶段 -->
 <init-param>
    <param-name>debug</param-name>
    <param-value>true</param-value>
 </init-param>
</servlet>
<!-- 指定DWR的核心Servlet拦截的URL -->
<servlet-mapping>
 <servlet-name>dwr</servlet-name>
 <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
在上面配置文件中增加了DWR的核心Servlet后,该Servlet负责将服务器端的Java方法暴露出来。到底那些Java方法需要被暴露出来,通过在dwr.xml配置文件中指定即可,因此需要在本应用中增加一个dwr.xml文件。
提示:此处并不许需要开发者自己开发Ajax应用,并不需要开发者利用DWR框架,我们只需利用Struts2对DWR的封装即可。因此,只需在Web应用的WEB-INF路径下增加dwr.xml文件即可,而且dwr.xml文件的代码也是固定的:
<!DOCTYPE dwr PUBLIC
 "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
 "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
 <!-- 定义所有需要被暴露的Java方法 -->
     <allow>
  <!-- 定义将org.apache.struts2.validators.DWRValidator创建成一个validator对象 -->
         <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>
在上面配置文件中,将org.apache.struts2.validators.DWRValidator类创建成一个JavaScript对象,这个对象名为validator。当然,这里所说的创建是假创建,因为Java类是无法创建JavaScript对象,但DWR提供一种方式,允许当我们在客户端调用validator的方法时,转换成调用DWRValidator实例的方法。
提示:关于DWR的运行原理和使用细节,请读者参考笔者所著的《基于J2EE的Ajax宝典》一书。此处由于篇幅管理,无法详述DWR的用法和细节。
实际上,对于一个Struts2的开发者而言,无需理会这些实现细节,因为Struts2已经为我们提供了这些封装,我们只需要在Struts2封装的基础上进行开发即可。
值得指出的是,为了让Web应用增加DWR支持,显然还需要将DWR的二进制包复制到Web应用中。即使对于Struts2.0.6正式版,依然不支持DWR的的最新版本(DWR的最新版本是2.0.1),因此只能使用DWR的前一个正式版1.1.3,将dwr-1.1.3.jar文件复制到Web应用中即可。
提示:由于Struts2发行版中并未包含DWR二进制文件。因此,dwr-1.1.3.jar文件必须到DWR的官方站点(http://getahead.ltd.uk/dwr/)自行下载。

二. 设置页面的Ajax主题
正如前面已经提到的,实现Ajax交互必须在页面中导入Ajax风格的controlheader.ftl,这个控件负责当每个输入组件失去焦点时,将输入结果发送到服务器端进行校验。
为了实现Ajax校验,还需要将表单设置成Ajax主题,并且设置validate="true"。下面是本示例应用中regist.jsp页面的代码:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<!-- 导入Struts2标签库 -->
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>请输入您的注册信息</title>
<!-- 导入Ajax主题的controlheader.ftl -->
<s:head theme="ajax"/>
</head>
<body>
<H1>请输入您的注册信息</H1>
<!-- 设置表单使用Ajax主题,并且设置validate="true" -->
<s:form action="regist" theme="ajax" validate="true">
 <s:textfield name="name" label="作者名"/><br>
 <s:textfield name="pass" label="密码"/>
 <s:textfield name="age" label="年龄"/>
 <s:textfield name="birth" label="生日"/>
 <s:submit value="注册"/>
</s:form>
</body>
</html>
在上面的表单被设置成Ajax主题(这将意味着该表单是一个远程表单),并且设置了validate="true"属性。一旦完成了上面设置后,当某个输入组件失去焦点时,系统会负责将输入内容发送到服务器端进行校验。

三. 设置校验规则
对于使用Ajax校验的Action类,与基本校验的Action类并没有太大的不同之处。但必须指出:尽量不要重写Action类的validate方法,重写该方法来完成Ajax校验可能出现一些未知异常(这可能是Struts2还需要完善的地方)。
注意:不同通过重写validate方法来完成Ajax校验。
为了完成输入校验,我们通过定义自己的校验规则文件来完成输入校验,本输入校验文件使用字段校验器风格来配置校验规则。下面是校验文件的代码:
文件,该文件指定了Action的属性必须满足怎样的规则,下面是该应用中Action的校验文件的代码。
<?xml version="1.0" encoding="GBK"?>
<!-- 指定校验配置文件的DTD信息 -->
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
 "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<!-- 校验文件的根元素 -->
<validators>
 <!-- 校验Action的name属性 -->
     <field name="name">
  <!-- 指定name属性必须满足必填规则 -->
         <field-validator type="requiredstring">
   <param name="trim">true</param>
             <message>必须输入名字</message>
         </field-validator>
  <!-- 指定name属性必须匹配正则表达式 -->
         <field-validator type="regex">
            <param name="expression"><![CDATA[(\w{4,25})]]></param>
             <message>您输入的用户名只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
     </field>
 <!-- 校验Action的pass属性 -->
 <field name="pass">
  <!-- 指定pass属性必须满足必填规则 -->
  <field-validator type="requiredstring">
   <param name="trim">true</param>
   <message>必须输入密码</message>
  </field-validator>
  <!-- 指定pass属性必须满足匹配指定的正则表达式 -->
  <field-validator type="regex">
   <param name="expression"><![CDATA[(\w{4,25})]]></param>
   <message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
  </field-validator>
 </field>
 <!-- 指定age属性必须在指定范围内-->
 <field name="age">
  <field-validator type="int">
   <param name="min">1</param>
   <param name="max">150</param>
   <message>年纪必须在1到150之间</message>
  </field-validator>
</field>
 <!-- 指定birth属性必须在指定范围内-->
 <field name="birth">
  <field-validator type="date">
   <!-- 下面指定日期字符串时,必须使用本Locale的日期格式 -->
   <param name="min">1900-01-01</param>
   <param name="max">2050-02-21</param>
   <message>年纪必须在${min}到${max}之间</message>
  </field-validator>
 </field>
</validators>
实际上,这份校验文件与之前进行基本校验的校验文件并没有太大的区别。这也证明了Struts2框架的简单、易用。
完成上面定义后,如果浏览者在输入页面中输入用户名,将焦点移到密码输入框时,将看到Ajax校验效果。

posted on 2008-02-05 00:13 飛雪(leo) 阅读(5425) 评论(8)  编辑  收藏

Feedback

# re: Struts2的Ajax输入校验 [未登录] 2008-05-06 09:35 过客
你这是总结吗?直接把书上的内容打进电脑上了.  回复  更多评论
  

# re: Struts2的Ajax输入校验 2008-05-27 17:51 小骗子
校验是校验了,那校验后信息提示信息的位置怎么设置?
  回复  更多评论
  

# re: Struts2的Ajax输入校验 2008-09-30 18:03 ffff
晕了,李刚的书。一字不差。就是不能用  回复  更多评论
  

# re: Struts2的Ajax输入校验 [未登录] 2009-01-17 10:07 anson
试试!那有电子书阿?
  回复  更多评论
  

# re: Struts2的Ajax输入校验 2009-02-25 18:19 kao
这样有意思吗?无聊
照抄  回复  更多评论
  

# re: Struts2的Ajax输入校验 2009-02-26 22:22 楼主是个托
是李刚的一个书托  回复  更多评论
  

# re: Struts2的Ajax输入校验 [未登录] 2009-04-04 20:19 java
不看还好,一看就来气。这本书不适合初学者,该举例子的时候一笔带过。总是使用前面的例子来对后面的进行说明,没有考虑读者根本不会将例子记住。所以不得不不断翻阅前面的内容。而且对路径问题含糊不清,源代码不全。可能适合有一定基础的人,但对初学者来说,只会耽误跟多时间1  回复  更多评论
  

# re: Struts2的Ajax输入校验 2011-07-22 15:12 阿斯顿发
只使用于struts2.0版本,2.1以后的不能用  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: