Ajax的输入校验不是客户端校验,而是服务器端校验,但这种服务器端校验是以异步方式进行的,浏览者无需显示提交请求,系统自动完成校验。
Struts2的Ajax校验建立在DWR和Dojo两个框架之上,其中DWR负责实现在JavaScript中调用远程方法,而Dojo则负责
页面效果的实现。
DWR是Java领域的Ajax框架,它允许客户端JavaScript代码直接调用服务器端的Java方法,这个过程是通过一个核心Servlet的转换来实现的。为了让DWR的核心Servlet起作用,必须在web.xml文件中配置该核心Servlet。
如下:
- <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>
<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的核心Servlet后,该Servlet负责将服务器端的Java方法暴露出来。具体哪些方法需要被暴露出来,可以通过在dwr.xml文件中指定。(dwr.xml文件应放在WEB-INF路径下)
- 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>
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>
为了使用Ajax表单,必须使用<s:head theme="ajax" />标签来导入Ajax头。
- regist.jsp文件:
- <%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>regist</title>
- <s:head theme="ajax" />
- </head>
- <body>
- <H1>请输入您的注册信息</H1>
- <s:form action="regist" theme="ajax" validate="true" >
- <s:textfield name="name" label="姓名" />
- <s:textfield name="pass" label="密码" />
- <s:textfield name="age" label="年龄" />
- <s:textfield name="birth" label="生日" />
- <s:submit value="注册" targets="show"/>
- </s:form>
- <div id="show"></div>
- </body>
- </html>
regist.jsp文件:
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>regist</title>
<s:head theme="ajax" />
</head>
<body>
<H1>请输入您的注册信息</H1>
<s:form action="regist" theme="ajax" validate="true" >
<s:textfield name="name" label="姓名" />
<s:textfield name="pass" label="密码" />
<s:textfield name="age" label="年龄" />
<s:textfield name="birth" label="生日" />
<s:submit value="注册" targets="show"/>
</s:form>
<div id="show"></div>
</body>
</html>
- RegistAction.java文件
- package com.pracbiz.struts2AjaxDemo.action;
- import java.util.Date;
- import com.opensymphony.xwork2.ActionSupport;
- public class RegistAction extends ActionSupport {
- private static final long serialVersionUID = -802101249451189323L;
- private String name;
- private String pass;
- private int age;
- private Date birth;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPass() {
- return pass;
- }
- public void setPass(String pass) {
- this.pass = pass;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public Date getBirth() {
- return birth;
- }
- public void setBirth(Date birth) {
- this.birth = birth;
- }
- }
RegistAction.java文件
package com.pracbiz.struts2AjaxDemo.action;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class RegistAction extends ActionSupport {
private static final long serialVersionUID = -802101249451189323L;
private String name;
private String pass;
private int age;
private Date birth;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
尽理不要重写action类的validate方法
- RegistAction-validation.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
- <validators>
- <!-- Field-Validator Syntax -->
- <field name="name">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>必须输入名字.</message>
- </field-validator>
- </field>
- <field name="pass">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>必须输入密码.</message>
- </field-validator>
- </field>
- <field name="age">
- <field-validator type="int">
- <param name="min">1</param>
- <param name="max">120</param>
- <message>年龄必须在${min}到${max}之间.</message>
- </field-validator>
- </field>
- <field name="birth">
- <field-validator type="required">
- <message>必须输入生日.</message>
- </field-validator>
- <field-validator type="date">
- <param name="min">1900-01-01</param>
- <param name="max">2050-02-21</param>
- <message>生日必须在${min}到${max}之间.</message>
- </field-validator>
- </field>
- </validators>
RegistAction-validation.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
<!-- Field-Validator Syntax -->
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入名字.</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入密码.</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">120</param>
<message>年龄必须在${min}到${max}之间.</message>
</field-validator>
</field>
<field name="birth">
<field-validator type="required">
<message>必须输入生日.</message>
</field-validator>
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message>生日必须在${min}到${max}之间.</message>
</field-validator>
</field>
</validators>
- 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>
- <constant name="struts.i18n.encoding" value="UTF-8" />
- <package name="com" extends="struts-default">
- <action name="regist" class="com.pracbiz.struts2AjaxDemo.action.RegistAction">
- <result>/welcome.jsp</result>
- </action>
- </package>
- </struts>
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>
<constant name="struts.i18n.encoding" value="UTF-8" />
<package name="com" extends="struts-default">
<action name="regist" class="com.pracbiz.struts2AjaxDemo.action.RegistAction">
<result>/welcome.jsp</result>
</action>
</package>
</struts>
- welcome.jsp文件
- <%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <html>
- <head>
- <title>My JSP 'welcome.jsp' starting page</title>
- </head>
- <body>
- here is your information:<br>
- <s:property value="name" /><br>
- <s:property value="pass" /><br>
- <s:property value="age" /><br>
- <s:property value="birth" />
- </body>
- </html>