前言

页面局部刷新是日常工作中使用的很多的功能,通常会借助jQuery的load/get/post/ajax方法,或者使用jquery.form.js的ajaxSubmit来提交表单。
使用传统的jQuery的load/get/post/Ajax方式组装表单,以及返回的响应内容太过麻烦,除了使用jquery.form.js,我们还可以使用AjaxAnywhere来实现页面局部的刷新。

使用步骤

1.添加maven依赖:

1
2
3
4
5
<dependency>
<groupId>org.ajaxanywhere</groupId>
<artifactId>ajaxanywhere</artifactId>
<version>1.2-rc2</version>
</dependency>

2.在web.xml中配置aa过滤器:

1
2
3
4
5
6
7
8
9
<!--界面局部刷新-->
<filter>
<filter-name>AjaxAnywhere</filter-name>
<filter-class>org.ajaxanywhere.AAFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AjaxAnywhere</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3.测试页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2017/6/1
Time: 19:10
To change this template use File | Settings | File Templates.
--%>
<%@include file="/WEB-INF/views/head.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>AjaxAnywhere使用</title>
</head>
<body>
<form name="myForm" action="${ctx}/aa/test" method="post">
<table>
<tr>
<td>
<label for="username"></label>
<input type="text" name="username" id="username"/>
</td>
<td>
<button type="button" onclick="searchForm();">查询</button>
</td>
</tr>
</table>
</form>
<hr>
<aa:zone name="refreshDataZone">
<table border="1" style="border-collapse:collapse;">
<thead>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>电话</td>
<td>住址</td>
</tr>
<tbody>
<c:forEach var="item" varStatus="j" items="${dataList}">
<tr>
<td>${j.index+1}</td>
<td>${item.name}</td>
<td>${item.age}</td>
<td>${item.sex==1?"男":"女"}</td>
<td>${item.phone}</td>
<td>${item.address}</td>
</tr>
</c:forEach>
</tbody>
</thead>
</table>
</aa:zone>
<script src="${ctx}/js/jquery.js"></script>
<script src="${ctx}/js/aa.js"></script>
<script>
function searchForm() {
var aa = new AjaxAnywhere();
aa.formName = "myForm";
aa.getZonesToReload = function() {
return "refreshDataZone";
};
aa.submitAJAX();
}
</script>
</body>
</html>

head.jsp:

1
2
3
4
5
6
7
8
9
10
<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@taglib uri="http://ajaxanywhere.sourceforge.net/" prefix="aa" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<c:set var="ctx" value="<%=path%>" />

页面步骤:
1、 添加aa的标签引用;
2、 添加aa.js(ajaxAnywhere的js)
3、 在页面中使用aa:zone指定需要刷新的区域。如上例
4、 点击查询的方法处理添加aa的处理。
formName:指定表单的名称;
重写aa.getZonesToReload方法,返回刷新区域的名称,aa:zone中指定的名称。
最后一步调用aa.submitAJAX();
aa会自动组装form表单的内容提交。

后台代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Controller
@RequestMapping("/aa")
public class AjaxAnywhereController {
@RequestMapping("/test")
public ModelAndView aaTest() {
// 准备测试数据
List<User> users = new ArrayList<>(15);
for (int i=0;i<15;i++) {
User user = new User();
user.setUserId(new Long(i+1));
user.setName("测试用户" + (i + 1));
user.setAge((short) (Math.random() * 100));
user.setSex((short) (Math.random() < 0.5 ? 0 : 1));
user.setPhone("138-8888-8888");
user.setAddress("广东省深圳市福田区商业大厦A栋16楼");
users.add(user);
}
ModelAndView mv = new ModelAndView();
mv.setViewName("/aa/aaTest");
mv.addObject("dataList",users);
return mv;
}
}

使用AjaxAnyWhere应该是实现页面局部刷新最简答的一种方式了。
传统的是直接方法一个页面,如果是Ajax请求后台需要做特殊处理,比如spring需要使用@ResponseBody来指定,前台也相应的需要修改。使用了AjaxAnyWhere后后台没有任何改动,页面仅仅需要添加几行代码就搞定了。