Ajax非常完美的改善了用户体验,使用户体验了一种连续的状态,避免了传统的Web应用进行请求——等待——响应的流程。Ajax使用户可以连续的发送多次异步请求,不需要服务器响应。当服务器的相应成功返回浏览器时,浏览器利用DOM将服务器相应数据加载到当前页面的相应容器中。
Struts2的Ajax支持需要建立在DWR和Dojo这两个成熟的Ajax框架。Struts2在两个成熟的Ajax框架上进一步封装,从而简化了Ajax的开发。
- DWR
是一个改善Web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含Ajax技术的网站。
Ajax的输入校验不是基于客户端,而是基于服务器端,是以异步方式实现的校验方式。
Java是同步的,而Ajax是异步的。所以当你调用一个远程方法时,你要给DWR一个回调函数,当数据从网络上回来时,DWR会调用这个函数。
DWR包含 2个主要部分:
(1) 一个运行在服务器端的Java Servlet,它处理请求并且向浏览器发回响应。
(2) 运行在浏览器端的JavaScript,它发送请求而且还能动态更新网页。
DWR工作原理是通过动态把Java类生成为Javascript。它的代码就像Ajax魔法一样,你感觉调用就像发生在浏览器端,但是实际上代码调用发生在服务器端,DWR负责数据的传递和转换。这种从Java 到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制,而且DWR的优点在于不需要任何的网页浏览器插件就能运行在网页上。
- 下载与配置DWR
1)在web应用中加载DWR的Jar包
目前2.0尚不支持struts2
如果是用dwr2.0的jar包,还需要同时导入log4j.jar和commons-loggin.jar包
2)放入WEB-INF/目录下
3)配置web.xml文件(配置DWR的核心Servlet,该Servlet负责将服务器端的Java方法暴露出来)
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <filter>
- <filter-name>struts</filter-name>
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
- <init-param>
- <param-name>actionPackages</param-name>
- <param-value>org.apache.struts2.showcase.person</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>struts</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- 在web.xml中配置的Dwr的核心Servlet -->
- <span style="color:#ff0000;"><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>
- </span></web-app>
4)Java方法被暴露出来了,但是具体要暴露哪些方法,需要在dwr.xml中配置被暴露的方法,且dwr.xml需要房子WEB-INF/lib目录下
- <?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>
dwr.xml配置文件中,将org.apache.struts2.validators.DWRValidator类创建成一个JavaScript对象,名为validator。DWR框架提供中方式,允许客户端调用validator的方法时,转换成调用DWRValidator实例的方法。
4)建立前台Jsp登陆页面
- <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>My JSP 'index.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- <s:head theme="ajax"/>
- <s:form method="post" action="rs" validate="true" theme="ajax">
- <s:textfield label="用户名" name="username" />
- <s:password label="密码" name="password"></s:password>
- <s:textfield label="年龄" name="age"></s:textfield>
- <s:submit value="注册" />
- </s:form>
- </body>
- </html>
注意的是:需要将表单设置为Ajax主题,并且设置validate="true".当某个输入组件失去焦点时,系统将负责将输入内容发送到服务器端进行校验。
5)建立Action类
- import com.opensymphony.xwork2.ActionSupport;
- @SuppressWarnings("serial")
- public class ReAction extends ActionSupport {
- private String username;
- private String userpass;
- private int age;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getUserpass() {
- return userpass;
- }
- public void setUserpass(String userpass) {
- this.userpass = userpass;
- }
- public String execute() throws Exception{
- return SUCCESS;
- }
- }
action类用于接收前台数据
6)建立相应的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.devMode" value="true"></constant>
- <constant name="struts.il8n.encoding" value="gbk"></constant>
- <package name="ge" extends="struts-default">
- <action name="rs" class="com.zhuxuli.action.ReAction">
- <result name="input">/index.jsp</result>
- <result name="success">/success.jsp</result>
- </action>
- </package>
- </struts>
7)现在一个完整的登陆流程都写完了,最后差的一点就是需要在action包下面配置一个校验文件了
注意,本流程是用户登陆的Ajax验证,文件名为:“action类名-validation.xml”
- <!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="username">
- <field-validator type="requiredstring">
- <message>用户名不能为空</message>
- </field-validator>
- </field>
- <field name="userpass">
- <field-validator type="requiredstring">
- <message>密码不能为空</message>
- </field-validator>
- </field><field name="age">
- <field-validator type="int">
- <param name="min">1</param>
- <param name="max">100</param>
- <message>年龄必须在1到100之间</message>
- </field-validator>
- </field>
- </validators>
现在一个完整的DWR in struts2的验证模式已经成功。
转载出处:https://blog.csdn.net/zhuali_linkin/article/details/7272231