DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
以下模拟一个简单的dwr入门案例,重点理解dwr是如何跟java后台服务器打交道的
模拟效果如下
该功能说明了dwr是怎么跟后台服务器打交道的
模拟从服务器加载下拉列表数据
模拟保存功能
模拟查询功能
接下来为dwr+spring集成步骤:
1、新建一个web工程,导入dwr+spring所需jar,如下图
目录结构图
修改web.xml
<?
xml version
=
"
1.0
encoding
UTF-8
?>
<
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">
<!--
Spring上下文
-->
context
param
>
name
contextConfigLocation
</
value
classpath:resource
/
app
*
.xml
listener
class
org.springframework.web.context.ContextLoaderListener
配置DWR前端控制器
servlet
dwrServlet
org.directwebremoting.servlet.DwrServlet
指定配置文件
init
config
如果有多个用
,
分开
WEB
INF
classes
dwr.xml
debug
true
mapping
url
pattern
>/
dwr
/*
</url-pattern> </servlet-mapping> </web-app>
新建实体类Dept
package
entity;
public
Dept {
private
Long id;
String name;
Dept() { }
Dept(Long id,String name) {
this
.id
id;
.name
name; }
Long getId() {
return
id; }
void
setId(Long id) {
String getName() {
setName(String name) {
name; } }
新建业务逻辑类
DeptServices类
services;
import
java.util.ArrayList;
java.util.HashMap;
java.util.List;
java.util.Map;
entity.Dept; @SuppressWarnings(
unchecked
)
DeptServices {
List findDept() {
throw
new
RuntimeException(
查找失败!
); }
deleteDept(Long id) { System.out.println(
Delete dept
+
id); }
List getDeptsForPo() { List depts
ArrayList(); depts.add(
Dept(
1l
教质部
)); depts.add(
2l
学术部
3l
就业部
4l
咨询部
));
depts; }
saveDept(List
Dept
depts) {
System.out.println(dept.getId() + ":" + dept.getName());
System.out.println(depts); }
List getDepts() { List depts
ArrayList(); Map map
HashMap(); map.put(
id
01
); map.put(
); depts.add(map); map
02
03
04
); depts.add(map);
try
{ Thread.sleep(
1000
catch
(InterruptedException e) { e.printStackTrace(); }
depts; } }
HelloServices类
/**
*
@author
dlwu *
*/
HelloServices {
String sayHello(String name){ System.out.println(
Hello now!
);
Hello
name
!
; } }
LoginService类
org.directwebremoting.WebContext;
org.directwebremoting.WebContextFactory;
LoginService {
checkUserLogin(String userid,String pwd){ WebContext ctx
WebContextFactory.get(); ctx.getSession().setAttribute(
userid
String getLoginUser(){ WebContext ctx
WebContextFactory.get();
(String)ctx.getSession().getAttribute(
); } }
配置applicationContext.xml
配置系统基础环境
beans xmlns
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
bean id
deptServices
services.DeptServices
></
bean
loginSrv
services.LoginService
beans
>
配置dwr.xml,dwr.xml是前台js跟java服务器沟通的桥梁
<!
DOCTYPE dwr PUBLIC
-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN
http://getahead.org/dwr/dwr20.dtd
通用dwr配置
allow
建立JS对象,将目标对象的方法转换成JS对象的方法
create javascript
helloSrv
creator
new
param name
class
value
services.HelloServices
create
从Spring中获取Java对象
deptSrv
spring
beanName
禁止执行
exclude method
deleteDept
/>
指定针对于特定对象的转换器
convert match
entity.*
converter
convert
java.lang.Throwable
include
message
>
页面
hello.jsp页面
<%
@ page language
java
java.util.*
pageEncoding
%>
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
'
hello.jsp
starting page
meta http
equiv
pragma
content
no-cache
cache-control
expires
0
keywords
keyword1,keyword2,keyword3
description
This is my page
记得引入js,测试地址: http:
localhost:8083/dwrweb/dwr/ -->
script type
text/javascript
src
dwr/engine.js
script
dwr/interface/helloSrv.js
dwr/util.js
function hello(){
方法一
返回处理后的结果信息
var fn = function(result){ $("msg").innerHTML = result; } helloSrv.sayHello($("name").value,fn);
方法二
helloSrv.sayHello($(
).value,function(result){ $(
msg
).innerHTML
result; });
方法三
使用如下的好处为:不用导入如上三个js
第一个参数: dwr访问路径,在web.xml中配置,如: <url-pattern>/dwr/*</url-pattern>
第二个参数: dwr与java服务器通信变量,在dwr.xml中声明
第三个参数: 服务器方法名
第四个参数: 页面请求参数,即服务器方法名得参数
第五个参数: 回调函数
dwr.engine._execute("dwr",'helloSrv','sayHello',$("name").value,0)"> }
body
div id
div
input type
text
id
button
Hello
onclick
hello();
>
dept.jsp页面
function loadDept(){
说明已经加载,不必重新加载
if
($(
depts
).options.length
){
; } DWRUtil.addOptions(
''
正在下载...
}],0)">); dwr.engine._execute(
getDepts
); DWRUtil.addOptions(
); }); } function loadDept2(){
depts2
getDeptsForPo
); }); } function saveDept(){
声明dept对象
var dept
{ id:$(
deptid
deptname
).value }; dwr.engine._execute(
saveDept
保存成功!
); }); } function find(){ dwr.engine._execute(
findDept
查询成功!
); },errorHandler:function(e){ alert(
查询失败:
e); } }); }
select id
loadDept();
select
loadDept2();
hr
ID:
input id
type
size
8
Name:
input value
保存部门
saveDept();
查找
find();
>