2008-05-10

struts2中的ajax运用

关键字: struts2

最近从书店买了本struts2的书在看,顺便试验了一下书中的AJAX部分。

由于本人是初学编程,而且又是第一次发贴,所以如果有什么不对的地方还请大家批评指正。

Struts2 Ajax的输入校验不是客户端校验,而是服务器端校验,Struts 2中集成的是时下Java EE平台中比较流行的ajax框架——Dojo和DWR。

在开始前先导入struts2的JAR包到WEB-INF/lib目录下。

要使用DWR,则要在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> <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>


    这个文件是不用修改的直接COPY过来即可。在上面配置文件中,将org.apache.struts2.validators.DWRValidator类创建成一个JavaScript对象,这个对象名为validator。当然,这里所说的创建是假创建,因为Java类是无法创建JavaScript对象,但DWR提供一种方式,允许当我们在客户端调用validator的方法时,转换成调用DWRValidator实例的方法。值得指出的是,为了让Web应用增加DWR支持,显然还需要将DWR的二进制包复制到Web应用中。即使对于Struts2.0.6正式版,依然不支持DWR的的最新版本(DWR的最新版本是2.0.1),因此只能使用DWR的前一个正式版1.1.3,将dwr-1.1.3.jar文件复制到Web应用中的lib目录下即可。

然后修改web.xml文件:

web.xml:

<?xml version="1.0" encoding="GBK"?> <web-app 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"> <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> <!-- 定义Struts2的FilterDispathcer的Filter --> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求。 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>


  

 接下来写一个JSP页面:

register.jsp:

<%@ page contentType="text/html;charset=GBK" language="java"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>远程ajax表单</title> <s:head theme="ajax" /> </head> <body> <s:div id="mydiv"></s:div> <s:div> <s:form id="theForm2" action="AjaxTest" method="post" theme="ajax" validate="true"> <s:textfield name="name" label="请输入你的用户名" /> <s:password name="pass" label="请输入你的密码" /> <s:submit value="登录" targets="mydiv" loadingText="请稍后..." /> </s:form> </s:div> </body> </html>


    

 其中一定在在<head></head>之间加入<s:head theme="ajax" />这句话,然后在后面的form中也要将theme设置成ajax,validate设为true,这样struts2就会自动地将form表单内的各个域设成validate为true.validate=true即表明要进行ajax检验。

 下面再写一个AJAX响应JSP页面片断:

AjaxResult.jsp:

<%@ page contentType="text/html;charset=GBK" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <% request.setAttribute("decorator", "none"); response.setHeader("Cache-Control","no-cache"); //HTTP 1.1 response.setHeader("Pragma","no-cache"); //HTTP 1.0 response.setDateHeader ("Expires", 0); //prevents caching at the proxy server %> 你的姓名是:<s:property value="name"/><br> 你的密码是:<s:property value="pass"/>


 

下一步要做的就是编写Action类:

AjaxTestAction.java:

package test; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; import java.io.Serializable; @SuppressWarnings("serial") public class AjaxTestAction implements Action, Serializable { private String name; private String pass; public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String execute() throws Exception { return SUCCESS; } }


  

 接下来是编写验证文件,在进行struts2 ajax验证是推荐使用校验规则文件来进行,尽量不要使用“重写Action类的validate方法,重写该方法来完成ajax校验可能会出现一些未知的异常!校验规则文件如下: 

AjaxTestAction-validation.xml:

<?xml version="1.0" encoding="GBK"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="name"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>必须输入名字</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <message>您输入的用户名只能是长度在4到25之间的字母或数字</message> </field-validator> </field> <field name="pass"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>必须输入密码</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <message>您输入的密码只能是长度在4到25之间的字母或数字</message> </field-validator> </field> </validators>

   

最后一步啦!修改struts2 Action配置文件:

struts.xml: 

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="ajax" extends="struts-default"> <action name="AjaxTest" class="test.AjaxTestAction"> <result name="success">/AjaxResult.jsp</result> <result name="input">/register.jsp</result> </action> </package> </struts>

   

 

 一切准备就绪,启动服务器,在地址栏中输入以下地址:http://localhost:8080/Test/register.jsp就可以看到登录界面,在用户名和密码框中如果你输入的信息不正确,那么在该组件失去焦点后,ajax组件就会将用户名和密码框的值传到服务器进行校验,然后将校验结果返回客户端从而达到很好的用户体验。

最后想要说明一点是:在struts2以前版本中对DWR有一些BUG,不过好像在最新的struts 2.0.11.1中已经解决,建议大家将struts2升级至最新版本。

还有一个我在练习中犯的一个错误,就是当我想用AjaxResult.jsp返回内容填充我原来的theForm2时,theForm2的内容会被刷掉,也就是不能引用原来theForm2内容的组件。这时如果在AjaxResult.jsp中使用<s:property value="name"/>时会出现问题。不知道我分析的对不对!如有错误还请批评指正。文件内容如下:

register.jsp: 

<%@ page contentType="text/html;charset=GBK" language="java"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>远程ajax表单</title> <s:head theme="ajax" /> </head> <body> <s:div id="mydiv"></s:div> <s:div> <s:form id="theForm2" action="AjaxTest" method="post" theme="ajax" validate="true"> <s:textfield name="name" label="请输入你的用户名" /> <s:password name="pass" label="请输入你的密码" /> <s:submit value="登录" targets="theForm2" loadingText="请稍后..." /> </s:form> </s:div> </body> </html>

   

 

 AjaxResult.jsp:

 

 

<%@ page contentType="text/html;charset=GBK" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <% request.setAttribute("decorator", "none"); response.setHeader("Cache-Control","no-cache"); //HTTP 1.1 response.setHeader("Pragma","no-cache"); //HTTP 1.0 response.setDateHeader ("Expires", 0); //prevents caching at the proxy server %> 你的姓名是:<s:property value="name"/><br> 你的密码是:<s:property value="pass"/>


    我在使用这个编辑器编辑这篇文章时不知道为什么有些符号或字母显示不正常了,弄了好半天了,大家也就凑合着看吧,呵呵!总的说来在struts2中使用ajax是非常方便,而且依靠DWR和DOJO这两个强大的AJAX框架,struts2 的ajax运用也会相当出色。随着struts渐渐淡出历史舞台,我想struts的王储----struts2正在异军突起,彰显魅力!

 

  • Test.zip (3.4 MB)
  • 描述: 源文件
  • 下载次数: 122
评论
wujiekangyun 2008-05-18
liuqiyu 写道
为什么不直接用DWR+JS验证?

一般来说是应该直接用dwr+js验证,直接全部使用ajax验证无疑加大了服务器的压力。我一般还是只用来验证重复用户名等问题,其他的还是普通验证和js结合
liuqiyu 2008-05-13
为什么不直接用DWR+JS验证?
guo_david_wei 2008-05-13
做的不错!
我也刚接触struts2...
icanfly 2008-05-13
有时候public class AjaxTestAction implements Action, Serializable 是改成public class AjaxTestAction extends ActionSupport我也不知道是什么原因!
icanfly 2008-05-11
引用
wing929 3 小时前
你要做的是数据校验?没必要这么复杂吧?直接写配置文件不就行了吗?

直接写配置文件能实现ajax校验?受教了?
wing929 2008-05-11
你要做的是数据校验?没必要这么复杂吧?直接写配置文件不就行了吗?
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

icanfly
搜索本博客
我的相册
Ac435f08-3144-3854-a8d8-63c30ce88b36-thumb
奥运火炬传递中国区路线图
共 2 张
最近加入圈子
最新评论