我的DWR学习总结

 

 
 
  1. DWR的简介,我在此就不多介绍了!下面主要介绍一下我对DWR的一些应用总结。 
  2.  
  3. 1.  下载一个dwr.jar 或者dwr2.jar , 然后拷贝到WEB-INF/lib文件夹下!! 
  4.  
  5. 2.  在web.xml中添加下面的一个DwrServlet配置 
  6.  
  7.     <!-- DWRServlet→来之与dwr.jar --> 
  8.     <servlet> 
  9.         <servlet-name>dwr-invoker</servlet-name> 
  10.   <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class
  11.         <init-param> 
  12.             <param-name>debug</param-name> 
  13.             <param-value>true</param-value> 
  14.         </init-param> 
  15.          <init-param>      
  16.             <param-name>crossDomainSessionSecurity</param-name>      
  17.             <param-value>false</param-value>      
  18.         </init-param> 
  19.     </servlet> 
  20.      
  21.     <servlet-mapping> 
  22.         <servlet-name>dwr-invoker</servlet-name> 
  23.         <url-pattern>/dwr/*</url-pattern> 
  24. </servlet-mapping> 
  25.  
  26. 3.  在web.xml同目录下,建立一个dwr.xml文件,其中的配置如下,具体说明,你可以自己查看相关的文档或者博客。 
  27.  
  28. <?xml version="1.0" encoding="UTF-8"?> 
  29.  <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">  
  30.  <dwr>     
  31. <allow> 
  32.     <create creator="new" javascript="Hello"> 
  33.         <param name="class" value="com.hanchao.test.Hello"/> 
  34.     </create> 
  35.      
  36.     <create creator="new" javascript="TestOne"> 
  37.         <param name="class" value="com.hanchao.test.TestOne"/> 
  38.     </create> 
  39.      
  40.     <create creator="new" javascript="TestTwo"> 
  41.         <param name="class" value="com.hanchao.test.TestTwo"/> 
  42.         <include method="method2"/> 
  43.     </create> 
  44.      
  45.     <create creator="new" javascript="TestThree"> 
  46.         <param name="class" value="com.hanchao.test.TestThree"/> 
  47.         <include method="method3"/> 
  48.     </create> 
  49.      
  50.     <create creator="new" javascript="TestFour"> 
  51.         <param name="class" value="com.hanchao.test.TestFour"/> 
  52.         <include method="method4"/> 
  53.         <include method="method41"/> 
  54.     </create> 
  55. <!—注意当有多个方法时,我们可以用多个include!!-- >  
  56.  
  57.     <create creator="new" javascript="TestFive"> 
  58.         <param name="class" value="com.hanchao.test.TestFive"/> 
  59.         <include method="method5"/> 
  60.         <!-- 说明:把method5和method51放在一个include里面,貌似是不可取的啊!! --> 
  61.         <include method="method51"/> 
  62.     </create> 
  63.      
  64.     <create creator="new" javascript="TestSix"> 
  65.         <param name="class" value="com.hanchao.test.TestSix"/> 
  66.         <include method="method6"/> 
  67.     </create> 
  68.      
  69.     <convert converter="bean" match="com.hanchao.entity.User"> 
  70.         <param name="include" value="username,password"/> 
  71.     </convert> 
  72.      
  73. </allow>    
  74.  </dwr> 
  75.  
  76. 4.  我们以一个例子来解释一下。 
  77. 首先,写一个java类,和以前没有区别! 
  78.  
  79. /** 
  80.  * 测试DWR 
  81.  * @author hanlw 
  82.  * 2012-02-09 
  83.  */ 
  84. public class Hello { 
  85.  
  86.     public String hello(String name) { 
  87.          
  88.         return "哈罗  "+name + ",你是第一个DWR demo!"
  89.     } 
  90.      
  91.  
  92. 其次,将该类配置在dwr.xml中,见上面! 
  93. 再次,在jsp中调用该类,以及相应的方法! 
  94. <head> 
  95.     <title>DWR-Practice第一个示例</title> 
  96.     <script type="text/javascript" src="dwr/interface/Hello.js"></script> 
  97.     <script type="text/javascript" src="dwr/engine.js"></script> 
  98.     <script type="text/javascript" src="dwr/util.js"></script> 
  99.     <script type="text/javascript" src="script/jquery1.5.js"></script> 
  100.     <script type="text/javascript"
  101.          
  102.         //以下是用DWR做的一个例子 
  103.         function hello() { 
  104.             var user = $("#user").val(); 
  105.             /*Hello对象调用com.hanchao.test.Hello类中的hello方法 
  106.               user表示传进去该方法的参数; 
  107.                
  108.               当hello()方法返回结果时,会呼叫callback函数! 
  109.                
  110.             */ 
  111.             Hello.hello(user,callback); 
  112.         } 
  113.          
  114.         //回调函数把类Hello.hello()方法的返回值赋值给id="result"的一个div 
  115.         function callback(msg) { 
  116.             DWRUtil.setValue('result',msg); 
  117.              
  118.             //貌似用下面这种方法给div赋值时是走不通的!! 
  119.             //$("#result").val(msg); 
  120.         } 
  121.     </script> 
  122.   </head> 
  123.    
  124.   <body> 
  125.     This is practice of DWR.<br/><br/> 
  126.     <a href="dwr.jspx?_m=success">→</a><br/> 
  127.     <hr/> 
  128.     DWR的第一个例子:<br/> 
  129.     <input id="user" type="text"/> 
  130.     <input type="button" value="哈罗" οnclick="hello()"/> 
  131.      
  132. <div id="result"></div> 
  133. </body> 
  134.  
  135. 这样你点击“哈罗”按钮时,就是可以使用DWR进行无刷新的AJAX了! 
  136.  
  137. ------------------------------------------------------------------------------------------------------- 
  138.  
  139. 此处我就不多说了!具体的例子我会上传到下载中,你可以下载下来,部署到你的myeclipse中, 
  140. 然后具体的去研究。下面我只说一些常用的方法!! 
  141.  
  142.  
  143. 1.  当你想一进入某个JSP页面就调用某个DWR: 
  144. (1.)  用 window.onload = function() { 
  145.             Option.getOptions(populate); 
  146.  
  147. (2.) 对下拉框的操作:返回的是一个数组或者集合时! 
  148. function populate(list) { 
  149.             DWRUtil.removeAllOptions("opts"); 
  150.             DWRUtil.addOptions("opts",list); 
  151.         } 
  152.      
  153. (3.)一个下拉框联动的例子: 
  154. /** 
  155.  * 下拉框联动的DWR例子 
  156.  * @author hanlw 
  157.  * 2012-02-09 
  158.  */ 
  159. public class Bikes { 
  160.  
  161.     private Map<String, String[]> bikes; 
  162.      
  163.     public Bikes() { 
  164.         bikes = new HashMap<String,String[]>(); 
  165.         bikes.put("2000"new String[]{"2000 T1","2000 T2","2000 T3"}); 
  166.         bikes.put("2001"new String[]{"2001 A1","2001 A2"}); 
  167.         bikes.put("2002"new String[]{"2002 BW1","2002 BM2"}); 
  168.         bikes.put("2003"new String[]{"2003 DB1","2003 DB2"}); 
  169.     } 
  170.      
  171.     public String[] getYear() { 
  172.         //声明一个数组,大小和bikes相同 
  173.         String[] keys = new String[bikes.size()]; 
  174.         int i = 0; 
  175.          
  176.         for(String key : bikes.keySet()) { 
  177.             keys[i++] = key; 
  178.         } 
  179.         return keys; 
  180.     } 
  181.      
  182.     public String[] getBikes(String year) { 
  183.         return bikes.get(year); 
  184.     } 
  185.  
  186. *************************************************************** 
  187.  
  188. <html> 
  189.   <head> 
  190.     <title>DWR-下拉框联动的例子</title> 
  191.     <script type="text/javascript" src="dwr/interface/Bikes.js"></script> 
  192.     <script type="text/javascript" src="dwr/engine.js"></script> 
  193.     <script type="text/javascript" src="dwr/util.js"></script> 
  194.     <script type="text/javascript"
  195.          
  196.         function refreshYearList() { 
  197.             Bikes.getYear(populateYearList); 
  198.         } 
  199. /*   
  200. 注意:此处可以换成window.onload = function(){ 
  201.     Bikes.getYear(populateYearList); 
  202. }; 
  203.    */       
  204.  
  205.         function populateYearList(list) { 
  206.             DWRUtil.removeAllOptions("years"); 
  207.             DWRUtil.addOptions("years",list); 
  208.             refreshBikeList(); 
  209.         } 
  210.          
  211.         function refreshBikeList() { 
  212.             var year = $("years").value; 
  213.             Bikes.getBikes(year,populateBikeList); 
  214.         } 
  215.          
  216.         function populateBikeList(list) { 
  217.             DWRUtil.removeAllOptions("bikes"); 
  218.             DWRUtil.addOptions("bikes",list) 
  219.         } 
  220.          
  221.     </script> 
  222.   </head> 
  223.    
  224.   <body οnlοad="refreshYearList()"
  225.     年份:<select id="years" οnchange="refreshBikeList()"></select><br/><br/> 
  226.     型号:<select id="bikes"></select> 
  227.          
  228.   </body> 
  229. </html> 
  230.  
  231. ************************************************************************* 
  232.  
  233. (4.) 户的保存 
  234.         //用户的保存 
  235.         function save() { 
  236.         //下面的红字是关键哦!! 
  237.             var userMap = {}; 
  238.             userMap.username = $("#name").val(); 
  239.             userMap.password = $("#pwd").val(); 
  240.             UserTest.save(userMap,populateSave); 
  241.         } 
  242.         //保存用户时的回调函数 
  243.         function populateSave(data) { 
  244.             if(data) { 
  245.                 alert("保存成功!"); 
  246.             } else { 
  247.                 alert("用户名已经存在!"); 
  248.                 $("#name").val(""); 
  249.                 $("#pwd").val(""); 
  250.             } 
  251.         } 
  252.      
  253.  
  254. ****************************************** 
  255. -------------------------------------------- 
  256.  
  257. 1.  调用有返回值的java方法 
  258.    
  259.         //调用有返回值的java方法 
  260.         window.onload = function() { 
  261.             TestOne.method1(callback); 
  262.         } 
  263.         //处理返回值的回调函数 
  264.         function callback(data) { 
  265.             DWRUtil.setValue('content',data); 
  266.         } 
  267.  
  268. 2.  调用含有参数的java方法 
  269.  
  270. //以下是一个DWR的例子 
  271.         function hell() { 
  272.             var value = document.getElementById("one").value; 
  273.             //alert(value); 
  274.             Hello.hello(value,callback); 
  275.         } 
  276.         //回调函数,处理从java类返回的值 
  277.         function callback(msg) { 
  278.             DWRUtil.setValue('content',msg); 
  279.         } 
  280.  
  281. 3.调用返回javabean的方法 
  282.  
  283.         function myMethod() { 
  284.             //当点击按钮时,我们要调用DWR 
  285.             TestTwo.method2(callback);                       
  286.         } 
  287.         //处理返回值的回调函数 
  288.         function callback(data) { 
  289.              
  290.             //关于回调函数返回值处理方法,好像还有一种方法。 
  291.             //下面的红字是关键!! 
  292.             var name = data.username; 
  293.             var pwd = data.password; 
  294.              
  295.             DWRUtil.setValue('content1',name); 
  296.             DWRUtil.setValue('content2',pwd); 
  297.         } 
  298.  
  299. 3.  调用含有javebean参数的方法 
  300.  
  301.         //调用含有javabean参数的java方法 
  302.         function clickme() {     
  303.     //下面的红色部分是重点哦 
  304.     var user ; 
  305.             user = {username:"aa",password:"bb"}; 
  306.             TestThree.method3(user,callback); 
  307.         } 
  308.          
  309.         //处理回调函数的返回值 
  310.         function callback(data) { 
  311.             DWRUtil.setValue('content',data); 
  312.         } 
  313.   
  314. 4.  调用返回list/set集合的方法 
  315.  
  316.         //调用返回list,set,map集合的java方法 
  317.         function clickme() { 
  318.             TestFour.method4(callback); 
  319.         } 
  320.         //处理回调函数的返回值 
  321.         function callback(data) { 
  322.              
  323.             for(var i = 0; i < data.length;i++) { 
  324.              
  325.             //下面的红色字体是关键哦 
  326.                 var name = data[i].username; 
  327.                 var pwd = data[i].password; 
  328.                  
  329.                 DWRUtil.setValue("content",name); 
  330.                 DWRUtil.setValue("content1",pwd); 
  331.             } 
  332.  } 
  333.  
  334. 5.  调用含有list/set参数的集合的方法 
  335.  
  336.         //调用含有list,set集合作为参数的集合的方法 
  337.         function clickme() { 
  338.         //下面的红色字体多注意哦 
  339.             var data; 
  340.             data = [ 
  341.                 { 
  342.                     username:"aa"
  343.                     password:"bb" 
  344.                 }, 
  345.                 { 
  346.                     username:"cc"
  347.                     password:"dd" 
  348.                 }, 
  349.                 { 
  350.                     username:"ee"
  351.                     password:"ff" 
  352.                 } 
  353.             ];           
  354.             TestFive.method5(data,callback); 
  355.         } 
  356.         //处理返回值的回调函数 
  357.         function callback(da) { 
  358.             DWRUtil.setValue('content',da); 
  359.         } 
  360.  
  361. 6.  调用参数为map集合的方法(这个注意下,因为我的demo,效果不是我想要的!!) 
  362.  
  363. //当参数为map集合时 
  364.         function ok() { 
  365.             var data; 
  366.             data = { 
  367.                 "key1":{ 
  368.                     username:"nam1"
  369.                     password:"pwd1" 
  370.                 }, 
  371.                 "key2":{ 
  372.                     username:"nam2"
  373.                     password:"pwd2" 
  374.                 } 
  375.             }; 
  376.              
  377.             TestFive.method51(data,callback1); 
  378.         } 
  379.         //处理返回值的回调函数 
  380.         function callback1(da) { 
  381.             DWRUtil.setValue('content',da); 
  382.         } 
  383.  
  384. 7.  当返回值为map集合时 
  385.  
  386.         //调用返回值为map的集合的 java方法   
  387.         function clickme() { 
  388.             TestSix.method6(callback); 
  389.         } 
  390.         //处理返回值的回调函数 
  391.         function callback(data) { 
  392.             //注意下面的红色字体 
  393.         for(var property in data) { 
  394.                 var bean = data[property]; 
  395.  
  396.                 alert(bean.username); 
  397.                 alert(bean.password); 
  398.             } 
  399.         } 
  400.  
  401. ********************************************************************** 
  402. ---------------------------------------------------------------------- 
  403.  
  404. 下面是Util.js中的一些方法: 
  405.  
  406. 1.  DWRUtil.getValue(“param”) 
  407.  
  408. 注意:该函数只能用于有value属性的元素。 
  409. Param 只能是id或者name的属性值! 
  410. 但是有时候name的属性值貌似取不到值!我也不知道为什么! 
  411.  
  412.         //3.getValue()的学习 
  413.         function three() { 
  414.             //来通过getValue()方法拿值试试哈 
  415.             var value = DWRUtil.getValue("myvalue"); 
  416.             Hello.hello(value,callback3); 
  417.         } 
  418.         function callback3(data) { 
  419.             DWRUtil.setValue("content2",data); 
  420.         } 
  421.  
  422. 2.  DWRUtil.getValues();(提示:这个方法,我没有试验成功!!) 
  423.  
  424. 功能:获得一组指定元素的value值;  
  425. 参数:id或name构成的数组对象 
  426.  
  427.         //4.getValues()的学习 
  428.         function four() { 
  429.             Hello.hello("tom",callback4); 
  430.         } 
  431.         function callback4(data) { 
  432.            var arr = DWRUtil.getValues({"name1":null,"name2":null});  
  433.             alert(arr.length); 
  434.             for(var i=0; i<arr.length;i++) { 
  435.                 alert(arr[i]); 
  436.             } 
  437.         } 
  438.  
  439. 3.  DWRUitl.setValues() 方法的应用。 
  440.  
  441.         功能:设置一组指定元素的值  
  442.         参数: id或name构成的数组对象 
  443.  
  444.         function five() { 
  445.             Hello.hello("tom",callback5); 
  446.         } 
  447.         function callback5(data) { 
  448.         //注意下面的语句 
  449.             DWRUtil.setValues({"name1":"setValue","name2":"setValues"}); 
  450.  } 
  451.  
  452. 4.DWRUtil.getText()方法的应用 
  453.  
  454. 功能:获得select元素的文本值  
  455.         参数: id或name属性值 
  456. 实际应用中:用id属性取到值了!而用name属性没有取到值! 
  457.         //6.getText()的学习 
  458.         function six() { 
  459.             Hello.hello("jerry",callback6); 
  460.         } 
  461.         function callback6(data) { 
  462.             var value1 = DWRUtil.getText("mySelect"); 
  463.             //注意一下:getValue()取到的是value的值哦!你懂的哦!! 
  464.             var value2 = DWRUtil.getValue("mySelect"); 
  465.              
  466.             alert(value1+"---------"+value2); 
  467.         } 
  468.  
  469. 4.  addRows()方法的应用 
  470.  
  471. //下面是html内容 
  472.     <input type="button" value="触发" οnclick="seven()"/> 
  473.     <table bgcolor="#fe8400" cellspacing="1" width="70%" style="margin-left:auto;margin-right:auto"
  474.         <thead> 
  475.             <tr bgcolor="#fffff"
  476.                 <th>用户名</th> 
  477.                 <th>密码</th> 
  478.             </tr> 
  479.         </thead> 
  480.         <tbody id="myTable" bgcolor="#ffffff" style="text-align:center"></tbody> 
  481. </table> 
  482.  
  483. //下面是我们JS代码 
  484.         //7.addRows()的用法 
  485.         function seven() { 
  486.             Hello.hello("jerry",callback7); 
  487.         } 
  488.         function callback7(data) { 
  489.      
  490.         //下面的代码请注意下! 
  491.             var items = [{"name":"王二","password":"123456"}]; 
  492.              
  493.             DWRUtil.addRows("myTable",items,[ 
  494.                 function(item) {return item.name}, 
  495.                 function(item) {return item.password} 
  496.             ]); 
  497.  
  498. 5.  addRows()方法应用二: 
  499.  
  500. //下面是我们的html代码 
  501.     <input type="button" value="触发" οnclick="eight()"/> 
  502.     <table bgcolor="#000000" cellspacing="1" width="70%" style="margin-left:auto;margin-right:auto"
  503.         <thead> 
  504.             <tr bgcolor="#fffff"
  505.                 <th>用户名</th> 
  506.                 <th>密码</th> 
  507.                 <th>操作</th> 
  508.                 <th>操作二</th> 
  509.                 <th>操作三</th> 
  510.             </tr> 
  511.         </thead> 
  512.         <tbody id="myTable2" bgcolor="#ffffff" style="text-align:center"></tbody> 
  513. </table> 
  514.  
  515. //下面是我们的JS代码 
  516. //8.addRows()方法使用二(从数据库里查出来的!) 
  517.         function eight() { 
  518.             TestFour.method4(callback8); 
  519.         } 
  520.         function callback8(data) { 
  521.              
  522.             /* 
  523.                 首先,可以肯定的是下面这个方法可以添加表格的行成功! 
  524.              
  525.             DWRUtil.addRows("myTable",data,[ 
  526.                 //注意:下面两行中的data也可以换成其他的,比如,你写成item,或者xx,等都可以出来效果! 
  527.                 function(data) {return data.username}, 
  528.                 function(data) {return data.password} 
  529.             ]); 
  530.             */ 
  531.              
  532.             /* 
  533.                 下面我们换种方法!分开写。(注意下!!) 
  534.             */ 
  535.             var cellfuncs = [ 
  536.             //把两个数据写在一列中!! 
  537.                 function(data) {return (data.username+"   "+data.password)}, 
  538.                 function(data) {return data.password}, 
  539.             //下面的一段代码是添加一个删除按钮!注意 
  540.                 function(data) { 
  541.                     //注意,此处的id应该是数据库中id 
  542.                     var id = data.username; 
  543.                     //创建一个input标签 
  544.                     var delButton = document.createElement("input"); 
  545.                     //给input标签添加属性 
  546.                     delButton.setAttribute("type","button"); 
  547.                     delButton.setAttribute("onclick","delUser("+id+")"); 
  548.                     delButton.setAttribute("class","delete"); 
  549.                     delButton.setAttribute("value","删除"); 
  550.                     return delButton; 
  551.                 }, 
  552.                 //在此再加一个超链吧!! 
  553.                 function(data) { 
  554.                     var idd = data.username; 
  555.                      
  556.                     var editButton = document.createElement("a"); 
  557.                     editButton.setAttribute("href","javascript:void(0)"); 
  558.                      
  559.                     /*************重要****************/ 
  560.                     //创建一个包含静态文本的节点 
  561.                     var text = document.createTextNode("编辑"); 
  562.                     //将静态文本的节点加入到a标签中 
  563.                     editButton.appendChild(text); 
  564.                     /**************重要*******************/ 
  565.                      
  566.                     editButton.setAttribute("value","edit"); 
  567.                     editButton.setAttribute("id",idd); 
  568.                      
  569.                     return editButton; 
  570.                 }, 
  571.                  
  572.                 //再加一个按钮吧--2012-02-15 
  573.                 function(data) { 
  574.                     var idd = data.username; 
  575.                     var watchButton = document.createElement("input"); 
  576.                     watchButton.setAttribute("type","button"); 
  577.                     watchButton.setAttribute("onclick",'watchUser('+idd+')'); 
  578.                     watchButton.setAttribute("id","watch"); 
  579.                     watchButton.setAttribute("value","查看"); 
  580.                      
  581.                     return watchButton; 
  582.                 }                
  583.             ]; 
  584.             /* 
  585.                 下面我们要把内容添加到表格中去了!! 
  586.             */ 
  587.             DWRUtil.addRows("myTable2",data,cellfuncs);
  1.         } 


具体的例子你可以去下载!名字为:dwr-han.rar

祝您学习愉快!!


本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/780696,如需转载请自行联系原作者


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值