DWR(Direct Web Remoting)是一个使用javascript代码可以调用java代码的远程服务器端Ajax开源框架。
DWR原理是利用java的反射机制使javascript端能够动态的生成javas代码。
下面我们来看一看怎么使用DWR来创建第一个入门程序:
首先导入dwr.jar包,然后导入commons-logging包
配置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>SoftTalent</display-name>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
servlet中的参数debug在开发阶段可以设置为true方便调试,开发完成之后将其设置为false。
web.xml配置完成之后新建一个dwr.xml 里面配置的是java的类以及对应的javascript对象名称:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
"http://getahead.org/dwr/dwr30.dtd">
<dwr>
<allow>
<create creator="new" javascript="demo">
<param name="class" value="com.ipro.softtalents.test.TestDwr"/>
</create>
</allow>
</dwr>
如上面所写的java端的类是com.ipro.softtalents.test包下的TestDwr类在javascript对应的对象名称叫做demo,在javascript端使用demo.xxxx()方法就可以直接调用
java代码了。
java代码如下:
package com.ipro.softtalents.test;
public class TestDwr {
public String rest(){
try{
System.out.println("Test dwr hello world!");
}catch(Exception e){
e.printStackTrace();
}
return "test invoke success!";
}
}
jsp页面代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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">
<link rel="stylesheet" type="text/css" href="css/style.css"></link>
<script type="text/javascript" src="${pageContext.request.contextPath}/dwr/engine.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/dwr/util.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/dwr/interface/demo.js"></script>
<script>
function test1(){
demo.rest(
function(data){
alert(data); //data为java端代码的返回值 javascript的语法
});
}
</script>
<title>title</title>
</head>
<body>
<c:import url="/jsp/common/head.jsp"/>
<input type="button" value="调用Test" οnclick="test1();">
<br>
<c:import url="/jsp/common/root.jsp"/>
</body>
</html>
上面导入的engine.js和util.js是必须要导入的js文件 后面第三个js名称格式为: basePath/dwr/interface/javscript端设置的对象名.js;
basePath最好使用${pageContext.request.contextPath}这样的格式来写,使用
<%
String path=request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getLocalPort()+"/"+path+"/";
%>
<base href="<%=basePath%>">这样的路径在dwr2.0会报出 No data received from server错误
dwr3.0中会报出 dwr.engine.incompleteReply, Incomplete reply from server错误
具体还不知道什么原因,待查。但使用${pageContext.request.contextPath}这样的格式就没有问题:
这是客户端的信息:
test invoke success!
这是服务端控制台打印的信息:Test dwr hello world!