DWR:Easy AJAX for JAVA,在web2.0时代,ajax扮演着十分重要的角色,它使一个web站点更加人性化。如今java仍然是企业开发的首选,相应的也就有很多 ajax框架支持java,像dwr,dojo等。应用dwr可以方便的实现浏览器上的javascript方法调用运行在web服务器上java方法, DWR会根据你的Java类动态的生成Javascript代码。这些代码的魔力是让你感觉整个Ajax调用都是在浏览器上发生的,但事实上是服务器执行了这些代码,DWR负责数据的传递和转换。
我从网上找了个例子,经过多方修改,终于可以运行了,写下来作个纪念。
本例要完成的任务:
1.增加表格的行2 删除一行 3 编辑选定的一行,这些操作都不会刷新页面,而是通过dwr调用server端的java方法,在客户端动态更新。
1下载dwr的lib
2 和其他框架一样,应用dwr,需要在web。Xml加入拦截器,如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" 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">
<display-name>dwr</display-name>
<servlet>
<servlet-name>dwr-invoke</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-invoke</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>editable.jsp</welcome-file>
</welcome-file-list>
</web-app>
3 还需要一个dwr.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="People" scope="script">
<param name="class" value="demo.People"/>
</create>
<convert match="demo.Person" converter="bean"/>
</allow>
</dwr>
看到了吧,这里就定义了如何让javascript调用远端的java方法,这里还有很多细节,以后看看再写。这里创建了一个javascript对象 People,dwr根据java类demo.People生成客户端js文件。然后People就可以用java代码一样调用远端的java方法。
4 接下来我写一个server端的java代码:
People。Java
package demo;
import java.util.Set;
import java.util.HashSet;
import java.util.Random;
public class People {
private Random rd=new Random();
public Set getAllPeople() {
return people;
}
public void setPerson(Person person) {
if (person.getId() == -1) {
person.setId(getNextId());
}
people.remove(person);
people.add(person);
}
private int getNextId() {
return rd.nextInt(100);
}
public void deletePerson(Person person) {
people.remove(person);
}
private Set people = new HashSet();
}
Person。Java
package demo;
public class Person{
private int id;
private String name;
private String address;
private float salary;
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
}
好了,这就是server端的java代码。
5 客户端代码
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/interface/People.js'></script>
<script type='text/javascript' src='/dwr/dwr/util.js'></script>
<script type="text/javascript">
function init() {
fillTable();
}
var peopleCache = { };
var viewed = -1;
function fillTable() {
People.getAllPeople(function(people) {
dwr.util.removeAllRows("peoplebody", {
filter:function(tr) {
return (tr.id != "pattern");
}
});
var person, id;
people.sort(function(p1, p2) { return p1.name.localeCompare(p2.name); });
for (var i = 0; i < people.length; i++) {
person = people[i];
id = person.id;
dwr.util.cloneNode("pattern", { idSuffix:id });
dwr.util.setValue("tableName" + id, person.name);
dwr.util.setValue("tableSalary" + id, person.salary);
dwr.util.setValue("tableAddress" + id, person.address);
$("pattern" + id).style.display = "";
peopleCache[id] = person;
}
});
}
function editClicked(eleid) {
var person = peopleCache[eleid.substring(4)];
dwr.util.setValues(person);
}
function deleteClicked(eleid) {
var person = peopleCache[eleid.substring(6)];
if (confirm("Are you sure you want to delete " + person.name + "?")) {
dwr.engine.beginBatch();
// People.deletePerson({ id:id });
People.deletePerson(person);
fillTable();
dwr.engine.endBatch();
}
}
function writePerson() {
var person = { id:viewed, name:null, address:null, salary:null };
dwr.util.getValues(person);
dwr.engine.beginBatch();
People.setPerson(person);
fillTable();
dwr.engine.endBatch();
}
function clearPerson() {
viewed = -1;
dwr.util.setValues({ id:-1, name:null, address:null, salary:null });
}
</script>
</head>
<body>
<h3>All People</h3>
<table border="1" class="rowed grey">
<thead>
<tr>
<th>Person</th>
<th>Salary</th>
<th>Actions</th>
</tr>
</thead>
<tbody id="peoplebody">
<tr id="pattern" style="display:none;">
<td>
<span id="tableName">Name</span><br/>
<small><span id="tableAddress">Address</span></small>
</td>
<td>$<span id="tableSalary">Salary</span></td>
<td>
<input id="edit" type="button" value="Edit" onclick="editClicked(this.id)"/>
<input id="delete" type="button" value="Delete" onclick="deleteClicked(this.id)"/>
</td>
</tr>
</tbody>
</table>
<h3>Edit Person</h3>
<table class="plain">
<tr>
<td>Name:</td>
<td><input id="name" type="text" size="30"/></td>
</tr>
<tr>
<td>Salary:</td>
<td>$<input id="salary" type="text" size="20"/></td>
</tr>
<tr>
<td>Address:</td>
<td><input type="text" id="address" size="40"/></td>
</tr>
<tr>
<td colspan="2" align="right">
<small>(ID=<span id="id">-1</span>)</small>
<input type="button" value="Save" onclick="writePerson()"/>
<input type="button" value="Clear" onclick="clearPerson()"/>
</td>
</tr>
</table>
</body>
</html>
这里要注意的是
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/interface/People.js'></script>
<script type='text/javascript' src='dwr/dwr/util.js'></script>
Dwr是你web的虚拟目录,其它的javascript方法这里就不解释了,感觉这些javascript写的很精巧。
就这样,一个简单的dwr就好了,非常简单吧。
总结:
Dwr真的很酷,这也让我更喜欢javascript了,脚本语言有些特性真是太酷了,回调,动态执行,也难怪ruby这样受欢迎。同时也看到了,这里用dwr可以直接调用java的server方法,那java MVC框架是否还再需要。随着富客户端的发展,也许真的能统一java MVC世界。