DWR3 学习笔记

来源:互联网 发布:温暖的句子 知乎 编辑:程序博客网 时间:2024/06/06 19:18

由于最近要写一个在线的聊天工具,找到了这个比较不错的开源工具。 -  DWR (Direct Web Remoting)

最后的架构是希望SSH2 + DWR3实现比较复杂的在线聊天功能。


DWR(Direct  Web Romoting):改善Web页面与Java类交互的远程开元框架,允许在浏览器中使用java函数。

dwr.xml就是将java转化为js文件,实质上调用的是js方法。




废话少说,马上开始。(开发工具:Eclipse Indigo + Tomcat7)


第一个DWR3程序


第一步:导入需要的两个Jar包:(下载地址:http://directwebremoting.org/dwr/downloads/index.html)

  • dwr.jar
  • commons-logging-1.1.1.jar

第二步:创建web.xml文件 (目录在WebContent/WEB-INF/lib/下)

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.     <servlet>  
  4.         <display-name>DWR Servlet</display-name>  
  5.         <servlet-name>dwr-invoker</servlet-name>  
  6.         <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>  
  7.         <init-param>  
  8.             <param-name>debug</param-name>  
  9.             <param-value>true</param-value>  
  10.         </init-param>  
  11.     </servlet>  
  12.     <servlet-mapping>  
  13.         <servlet-name>dwr-invoker</servlet-name>  
  14.         <url-pattern>/dwr/*</url-pattern>  
  15.     </servlet-mapping>  
  16. </web-app>  
第三步:创建dwr.xml文件 (放在与web.xml同一个目录下)

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE dwr PUBLIC  
  3.     "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"  
  4.     "http://directwebremoting.org/schema/dwr30.dtd">  
  5. <dwr>  
  6.   <allow>  
  7.     <!-- 注意,Javascript的类名必须要和真正的class名称一致,否则会报错 -->  
  8.     <create creator="new" javascript="DwrTest">  
  9.         <!-- 具体在server端实现的类 -->  
  10.         <param name="class" value="com.eztalk.bean.DwrTest"/>  
  11.     </create>  
  12.   </allow>  
  13. </dwr>  
第四步:根据上面暴露出的class,写具体的类

[java] view plain copy
 print?
  1. package com.eztalk.bean;  
  2.   
  3. public class DwrTest {  
  4.     public String test(String message)  
  5.     {  
  6.         System.out.println("get Message:" + message);  
  7.         return "hello: " + message;   
  8.     }  
  9. }  

第五步:写客户端的界面:

[html] view plain copy
 print?
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html>  
  4.   
  5. <head>  
  6.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7.     <title>DRM3 Test</title>  
  8.     <!-- 注意以下两个javascript的顺序不能随便改   
  9.     1.第一个是engine.js文件,由dwr.jar包提供  
  10.     2.第二个是根据自己写的类生成的js文件,格式为/{app name/根据自己建立的项目名称修改}/dwr/interface/{在dwr中暴露的javascript类名.js}  
  11.     3.如果对script的写法不好掌握,可以调用以下URL查看:  
  12.         http://urlname/app name/drw/  
  13.     -->  
  14.     <script type='text/javascript' src='/ezTalk/dwr/engine.js'></script>  
  15.     <script type='text/javascript' src='/ezTalk/dwr/interface/DwrTest.js'></script>  
  16.       
  17.           
  18.     <script type="text/javascript">  
  19.   
  20.         function sendMessage()  
  21.         {  
  22.             var message = document.getElementById("message").value;  
  23.             alert(message);  
  24.             //直接用dwr.xml中暴露出来的类来调用,第一个是方法test的传入参数,最后一个是回调的方法  
  25.             DwrTest.test(message,showMessage);  
  26.         }  
  27.         //回调方法  
  28.         function showMessage(data)  
  29.         {alert(data);}  
  30.   
  31.         </script>  
  32. </head>  
  33. <body>  
  34.     <input type="text" id="message" name="message" />  
  35.     <input type="button" value="send message" onclick = "sendMessage()" />  
  36.     <div id="returnmessage"></div>   
  37. </body>  
  38. </html>  

第六步:收工测试 -测试OK

eclipse中的目录结构:


第七步:注意事项

  1. dwr.xml中javascript的名字和类名必须一致,我试着用不同的名字来代替,结果就悲剧了. --纠正一下,这个说法是错误的,我重启了一下Tomcat Sever,用不同的Javascript名字也可以正常运行了。 --Nov-6 2011
  2. dwr自动生成的script脚本在客户端是有先后顺序的,engine.js必须放在前面,自己生成的js文件要放到后面,否则也会报错。
  3. 最好是根据官方网站的例子来写,写法比较标准
  4. 对于客户端的javascript错误,最好用firefox+firebug插件来跟踪,这里我犯了几个错误,都是靠firebug发现的,比方说dwr.xml中的javascript class定义错误.\
  5. 一点点的耐性

该篇是对入门的提升,加上了对于对象的操作,现在就是需要输出Java代码中的对象数组。

对象类(Person类):

[java] view plain copy
 print?
  1. package com.test.ajax;  
  2.   
  3. public class Person {  
  4. private String name;  
  5. private String sex;  
  6. private int age;  
  7. //各自的setter和getter方法  
  8. public String getName() {  
  9.     return name;  
  10. }  
  11. public void setName(String name) {  
  12.     this.name = name;  
  13. }  
  14. public String getSex() {  
  15.     return sex;  
  16. }  
  17. public void setSex(String sex) {  
  18.     this.sex = sex;  
  19. }  
  20. public int getAge() {  
  21.     return age;  
  22. }  
  23. public void setAge(int age) {  
  24.     this.age = age;  
  25. }  
  26. //有参构造  
  27. public Person(String name, String sex, int age) {  
  28.     this.name = name;  
  29.     this.sex = sex;  
  30.     this.age = age;  
  31. }  
  32.   
  33. }  
相应的测试类:(testDwr)
[java] view plain copy
 print?
  1. package com.test.ajax;  
  2.   
  3. public class TestDwr {  
  4.      public Person[] getMyName()    
  5.         {          
  6.             System.out.println("进来啦");  
  7.             Person p[]=new Person[4];  
  8.             p[0]=new Person("陈二","女",22);  
  9.             p[1]=new Person("张三","男",22);  
  10.             p[2]=new Person("李四","男",22);  
  11.             p[3]=new Person("王五","女",22);  
  12.             return p;     
  13.         
  14.         }    
  15. }  
注意:如果此处就这样写会出现错误,他会不认识Person类,我们需要在dwr.xml里面让他认识。

所以在dwr.xml里面写上配置文件:

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>       
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">  
  3.   
  4. <dwr>  
  5.     <!-- allow段落里面定义的是DWR可以创建和转换的类 -->  
  6.     <allow>  
  7.     <!-- new是创造对象class的。  JavaScript是用来指定被创造出来对象的名字。scope是用来指定你这个bean在是生命范围内。 -->  
  8.     <!-- 将类TestDwr转化为JavaScript代码 -->  
  9.         <create creator="new" javascript="CASCO" scope="application">  
  10.             <param name="class" value="com.test.ajax.TestDwr" />  
  11.         </create>  
  12.       <convert match="com.test.ajax.Person" converter="bean">  
  13.               <param name="include" value="name,sex,age"/>  
  14.            </convert>  
  15.     </allow>  
  16. </dwr>    


然后在页面上你就可以获取相应的对象里面的值:

[javascript] view plain copy
 print?
  1. <script language="javascript">     
  2.     var mycall=function callBack(data){    
[javascript] view plain copy
 print?
  1.    <!--这里循环打印数据-->  
  2.     for(var i=0;i<data.length;i++){  
  3.      dwr.util.setValue("demo1",dwr.util.getValue("demo1")+data[i].name);   
  4.     }  
  5.           
  6.     }     
  7.     function showMyName(){   
  8.     alert(1);    
  9.         CASCO.getMyName(mycall);    
  10.     }    
  11.     function clearName(){    
  12.         demo1.value="";    
  13.     }    
  14. </script>    



如果我要在页面上输出表格形式:

就可以在JavaScript里面写上:

[html] view plain copy
 print?
  1. var mycall = function callBack(data) {  
  2.     if (data != null) {  
  3.         if (data.length > 0) {  
  4.             for ( var i = 0; i < data.length; i++) {  
  5.                 var tableObj = document.getElementById("mytable");  
  6.                 var newRowObj = tableObj.insertRow(tableObj.rows.length);  
  7.                 var newColName = newRowObj.insertCell(newRowObj.cells.length);  
  8.                 var newColSex = newRowObj.insertCell(newRowObj.cells.length);  
  9.                 var newColAge = newRowObj.insertCell(newRowObj.cells.length);  
  10.   
  11.                 newColName.innerHTML = data[i].name;  
  12.                 newColName.style = "text-align:center";  
  13.   
  14.                 newColSex.innerHTML = data[i].sex;  
  15.                 newColSex.style = "text-align:center";  
  16.                 newColAge.innerHTML = data[i].age;  
  17.                 newColAge.style = "text-align:center";  
  18.   
  19.             }  
  20.   
  21.         }  
  22.     }  
  23. }  
[html] view plain copy
 print?
  1. 页面上jsp:  
[html] view plain copy
 print?
  1. <table width="50%" id="mytable" border="1" bordercolor="whitesmoke">  
  2. <span style="white-space:pre">            </span><tr align="center">  
  3. <span style="white-space:pre">                </span><td>  
  4. <span style="white-space:pre">                    </span>姓名  
  5. <span style="white-space:pre">                </span></td>  
  6. <span style="white-space:pre">                </span><td>  
  7. <span style="white-space:pre">                    </span>性别  
  8. <span style="white-space:pre">                </span></td>  
  9. <span style="white-space:pre">                </span><td>  
  10. <span style="white-space:pre">                    </span>年龄  
  11. <span style="white-space:pre">                </span></td>  
  12. <span style="white-space:pre">            </span></tr>  
  13. <span style="white-space:pre">        </span></table>  


原创粉丝点击