dwr示例 Spring.docx
《dwr示例 Spring.docx》由会员分享,可在线阅读,更多相关《dwr示例 Spring.docx(23页珍藏版)》请在冰豆网上搜索。
dwr示例Spring
Email:
javafish@sunxin.org
DWR是作为远程调用的ajax框架,将服务端的java类,方法和浏览器的javascript的类,方法对应起来。
现在官方最新的版本是DWR2.0,可以在http:
//getahead.ltd.uk/dwr/download下载到。
我们真对DWR2.0做一些例子讲解一下它的特性:
HelloWorld:
新建一个web项目DWRStudy,在项目中构建路径中加入dwr.jar,
新建类Hello如下:
代码
1.package org.li.dwr;
2.
3.package org.li.dwr;
4.
5.import java.util.Date;
6.
7.public class Hello
8.{
9. public String getHelloWorld()
10. {
11. return "现在的时间为:
"+new Date();
12. }
13.}
在WEB-INF目录下新建dwr.xml文件:
代码
1.
xml version="1.0" encoding="UTF-8"?
>
2.
DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http:
//www.getahead.ltd.uk/dwr/dwr20.dtd">
3.
4.
5.
-- javascript的对象是jshello,create="new"是DWR自己创建类 -->
6.
7.
8.
9.
10.
在WebRoot目录里新建hello.js
代码
1.function load()//载入的时候调用
2.{
3. var jbutton = document.getElementById("jbutton");
4. jbutton.onclick=function(event)//注册按钮点击事件
5. {
6. jbClick();
7. };
8.}
9.function jbClick()//按钮点击事件
10.{
11. jshello.getHelloWorld(callback);//没有参数传递,只传递回调函数就行
12.}
13.function callback(msg)//回调函数
14.{
15. DWRUtil.setValue('jdiv',msg);
16.}
在WebRoot目录里新建HelloWorld.html
代码
1.
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2.
3.
4.
HelloWorld.html 5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
在web.xml中加入一个dwr的servlet:
代码
1.
2. dwr-invoker
3.
4. org.directwebremoting.servlet.DwrServlet
5.
6.
7. debug
8. true
9.
10. 1
11.
12.
13.
14. dwr-invoker
15. /dwr/*
16.
在运行一下服务器在浏览器里输入http:
//localhost:
8080/DWRStudy/HelloWorld.html,然后点一下按钮下面就会显示服务端的系统时间了,而浏览器页面并没有被刷新。
下面解释一下:
1.新建的Hello类中有一个getHelloWorld方法这个方法就是作为远程调用的服务端方法,这个Hello类也就是远程调用的类。
方法的返回值为服务端当前的时间
2.dwr.xml是DWR用来配置服务端类和浏览器端javascript类之间的映射。
可以下载dtd看一下,在里类配置映射类如:
javascript="jshello"是在浏览器端的javascript的映射的类名,(不要用javascript里的关键字)creator="new"是表示这个类是dwr自己创建的,如果creator="new"那么就必须有下面的,creator还可为spring(与spring集成的时候),script(与apache的一个框架BSF集成的时候用),后来又加入了struts,jsf,ejb3.现在是个HelloWorld让大家体验一下,具体后面会细讲。
最后的scope=”application”是说这个pojo类的范围,和jsp是一样的。
3.创建hello.js和HelloWorld.html都是看自己是怎么发挥了,注意的是在HelloWorld.html中导入js文件的时候注意顺序和路径命名规律,自己发挥的这个hello.js一定放在后面,因为要调用其它js文件中的函数。
由于在HelloWorld.html里写入了所以在html加载的时候会调用hello.js里的load方法(注意这几个js文件里的函数最好不要重名)在load里面做的事情就是注册一下id为jbutton的按钮的点击事件。
当我们点击id为jbutton的按钮的时候就开始用与服务器端的类相对应的javascript类了(jshello),直接调用jshello类的getHelloWorld方法,可以向函数传递参数,不过要在最后加一个回调函数。
而我们的服务端的类没有参数就直接传回调函数了。
在回调函数的形参msg是服务端Hello类中getHelloWorld方法返回值。
在回调函数里面调用了DWR的工具类DWRUtil类的setValue方法设置id为jdiv的值。
另外我们把doucment.getElementById(“jbutton”);换与$(“jbutton”)也可以得到同样的效果,这就有点像prototype了。
4.在web.xml里加入DWRServlet的配置一是为了远程调用,二是自动生成了
文件。
上个HelloWorld例子只是返回了一个字符串,当然我们显示字符串很容易,可是如果返回一个对象怎么办呢?
,DWR为我们将java类和javascript的DOM对象,不过这得需要我们在dwr.xml里配置。
再看一个综合的例子:
新建类User
代码
1.package org.li.dwr;
2.
3.import java.io.FileInputStream;
4.import java.io.FileNotFoundException;
5.import java.io.IOException;
6.import java.util.ArrayList;
7.import java.util.List;
8.import java.util.Properties;
9.
10.public class User
11.{
12. private String welcome;
13. private String username;
14. private String address;
15. private List books;
16. private int age;
17. public String getAddress()
18. {
19. return address;
20. }
21. public void setAddress(String address)
22. {
23. this.address = address;
24. }
25. public int getAge()
26. {
27. return age;
28. }
29. public void setAge(int age)
30. {
31. this.age = age;
32. }
33. public String getUsername()
34. {
35. return username;
36. }
37. public void setUsername(String username)
38. {
39. this.username = username;
40. }
41. public String getWelcome()
42. {
43. return welcome;
44. }
45. public void setWelcome(String welcome)
46. {
47. this.welcome = welcome;
48. }
49. public List getBooks()
50. {
51. return books;
52. }
53. public void setBooks(List books)
54. {
55. this.books = books;
56. }
57. public List getBook()
58. {
59. this.books = new ArrayList();
60. Book javaBook = new Book();
61. Book vcBook = new Book();
62. javaBook.setAuthor("孙鑫");
63. vcBook.setAuthor("孙鑫");
64. javaBook.setName("java Web开发详解");
65. vcBook.setName("vc++深入详解");
66. this.books.add(javaBook);
67. this.books.add(vcBook);
68. return this.books;
69. }
70. public User getUser(String welcome)
71. {
72. this.welcome=welcome;
73. try
74. {
75. FileInputStream fis = new FileInputStream("D:
\\workspace\\DWRStudy\\src\\user.properties");
76. Properties pp = new Properties();
77. pp.load(fis);
78. this.username=pp.getProperty("username");
79. this.age=Integer.valueOf(pp.getProperty("age"));
80. this.address=pp.getProperty("address");
81. fis.close();
82. }
83. catch (FileNotFoundException e)
84. {
85. // TODO Auto-generated catch block
86. e.printStackTrace();
87. }
88. catch (IOException e)
89. {
90. // TODO Auto-generated catch block
91. e.printStackTrace();
92. }
93. return this;
94. }
95.}
新建Book类:
代码
1.package org.li.dwr;
2.
3.public class Book
4.{
5. private String name;
6. private String author;
7. public String getAuthor()
8. {
9. return author;
10. }
11. public void setAuthor(String author)
12. {
13. this.author = author;
14. }
15. public String getName()
16. {
17. return name;
18. }
19. public void setName(String name)
20. {
21. this.name = name;
22. }
23.}
新建DWRLog类
代码
1.package org.li.dwr.log;
2.
3.import java.lang.reflect.Method;
4.
5.import org.directwebremoting.AjaxFilterChain;
6.
7.public class DWRLog implements org.directwebremoting.AjaxFilter
8.{
9.
10. public Object doFilter(Object obj, Method method, Object[] params, AjaxFilterChain chain) throws Exception
11. {
12. System.out.println("过滤器Log输出:
..对象:
"+obj.getClass().getName()+"方法:
"+method.getName());
13. return chain.doFilter(obj, method,params);
14. }
15.
16.}
新建D:
\\workspace\\DWRStudy\\src\\user.properties
username=javafish
age=21
address=北京市海淀区
然后在dwr.xml里加入
代码
1.
2.
3.
-- 过滤允许调用的方法 -->
4.
5.
6.
-- 配置自己的过滤器 -->
7.
8.
9.
-- 需要转换的类 -->
10.
11.
新建UserInfo.html
代码
1.
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2.
3.
4.
UserInfo.html 5.
6.
7.
8.
9.
10.
11.
12.
13.
14. 请输入你的名字:
15. <