DWR的学习文档(Hello World,类型转换,Spring,Annotation)

来源:百度文库 编辑:神马文学网 时间:2024/04/30 01:55:47
 
 DWR的学习文档(Hello World,类型转换,Spring,Annotation) Email:javafish@sunxin.org
DWR是作为远程调用的ajax框架,将服务端的java类,方法和浏览器的javascript的类,方法对应起来。现在官方最新的版本是DWR2.0,可以在http://getahead.ltd.uk/dwr/download下载到。
我们真对DWR2.0做一些例子讲解一下它的特性:
Hello World:
新建一个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.   
  2.   
  3.   
  4.       
  5.       
  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.   
  2.   
  3.     
  4.     HelloWorld.html  
  5.       
  6.       
  7.       
  8.       
  9.       
  10.   
  11.     
  12.      
  13.     
  14.       
  15.     
  
  •       
  •     
  •   

  • 在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.   
    2.   
    3.     
    4.     UserInfo.html  
    5.       
    6.       
    7.       
    8.       
    9.       
    10.   
    11.     
    12.      
    13.     
    14.     请输入你的名字:   
    15.       
    16.       
    17.       
    18.     
      
  •       
  •     
  •   

  • 新建userInfo.js
    代码
    1. function load()   
    2. {   
    3.     var jbutton = $("jbutton");   
    4.     jbutton.onclick=function(event)   
    5.     {   
    6.         bOnClick();   
    7.     };   
    8.     var sbutton = $("sbutton");   
    9.     sbutton.onclick=function(event)   
    10.     {   
    11.         sOnClick();   
    12.     };   
    13. }   
    14. function bOnClick()   
    15. {   
    16.     jsuser.getUser($("name").value,callback);   
    17. }   
    18. function callback(msg)   
    19. {   
    20.     var user = msg;   
    21.     DWRUtil.setValue(‘result‘,"欢迎你!"+user.welcome+"   姓名:"+user.username+",年龄:"+user.age+",住址:"+user.address+user.books[0].author);   
    22. }   
    23.   
    24. function sOnClick()   
    25. {   
    26.     jsuser.getBook(callbackBooks);   
    27. }   
    28. function callbackBooks(msg)   
    29. {   
    30.     alert(msg);   
    31.     DWRUtil.setValue(‘result‘,msg);   
    32. }  

    运行服务器输入http://localhost:8080/DWRStudy/UserInfo.html,可看到运行结果
    这个例子需要解释的就是dwr.xml了
    在这里用到了两个java类,User、Book,方法呢就是User.getUser和User.getBook,而Book类呢由于我们没有在javascript中调用,所以就不用配置Book的create了。
    大家可能会奇怪为什么会多出来两个

    呢,是因为在调用getBook和getUser的时候会返回给javascript有关User和Book的对象或数据,这里的用做一下转换,否则javascript将不会得到有效的数据。
    下面讨论一下DWR的安全性,由于我们将javaBean整体都对外暴露了,所以说会有非常多的安全问题,真对这些DWR也作了一些的措施就是上面例子中dwr.xml的配置:



    这样配置的话就只暴露了User类的两个方法getUser,getBook。就相对安全多了,相反还有的配置它们是类似的。对于安全我们也可以用DWR的过滤器来实现,这里我用过滤器实现的是一个日志记录。过滤器类只需要实现AjaxFilter接口就可以了,不过注意的是这个过滤器不是HttpServelt的过滤器而是DWR自己内部实现的(有兴趣可以查看一下源代码)。
    真对DWR的安全性上来说,官方也不敢保证,官方只是说自己可以看一下源代码因地施宜。
    不过DWR可以和acegi集成,让acegi来管理安全问题。由于acegi我还没有完全搞定关于DWR和acegi的集成,先放一放日后补充。
    下面对DWR.xml的配置具体补充一下:
    首先是里面有是配置在初始化的时候需要创建和转化的类。
    然后是里面有这个地方就是正式的配置了,creator里有param,filter,include,exclude,auth,除了auth我们都接触过了,而auth是集成J2EE的安全认证用的,这个可能和acegi的集成有关吧(?)。呢,它的converter有很多
    Array Converter
    Bean and Object Converters
    Collection Converter
    Enum Converter
    DOM Objects
    这些都是转换的时候配置的
    还有就是的配置了,申明一些不java用反射不可得到的参数类型。
    我在上面例子上用的getBook来本来想用signatures实现List的转换可是没有成功(不用配置就可以)
    主要是真对jdk1.4以下的,我本机用的是jdk6,所以屡试不爽最后在官方DWR2的特性中看到如果你用的是DWR2和JDK5以上的话就不用配置了DWR会自动转换。
    下面讲一下DWR与Spring的集成:
    还是上面那个例子用Spring搞定大部分和上面一样
    新建类User(包换了)
    代码
    1. package org.li.dwr.spring;   
    2.   
    3. import java.util.List;   
    4.   
    5. import org.li.dwr.Book;   
    6.   
    7. public class User   
    8. {   
    9.     private String welcome;   
    10.     private String username;   
    11.     private String address;   
    12.     private List books;   
    13.     private int age;   
    14.     public String getAddress()   
    15.     {   
    16.         return address;   
    17.     }   
    18.     public void setAddress(String address)   
    19.     {   
    20.         this.address = address;   
    21.     }   
    22.     public int getAge()   
    23.     {   
    24.         return age;   
    25.     }   
    26.     public void setAge(int age)   
    27.     {   
    28.         this.age = age;   
    29.     }   
    30.     public String getUsername()   
    31.     {   
    32.         return username;   
    33.     }   
    34.     public void setUsername(String username)   
    35.     {   
    36.         this.username = username;   
    37.     }   
    38.     public String getWelcome()   
    39.     {   
    40.         return welcome;   
    41.     }   
    42.     public void setWelcome(String welcome)   
    43.     {   
    44.         this.welcome = welcome;   
    45.     }   
    46.     public List getBooks()   
    47.     {   
    48.         return books;   
    49.     }   
    50.     public void setBooks(List books)   
    51.     {   
    52.         this.books = books;   
    53.     }   
    54.     public User getUser(String welcome)   
    55.     {   
    56.         this.welcome=welcome;   
    57.         return this;   
    58.     }   
    59. }  

    Book还是以前那个
    在src下新建application.xml文件(spring的配置文件)
    代码
    1.   
    2.   
    3.   
    4.   
    5.       
    6.           
    7.             javafish  
    8.           
    9.           
    10.             21  
    11.           
    12.           
    13.             北京市海淀区  
    14.           
    15.       
    16.   

    在dwr.xml加入:
    代码
    1.   
    2.               
    3.               
    4.               
    5.           

    新建springUserInfo.html
    代码
    1.   
    2.   
    3.     
    4.     UserInfo.html  
    5.       
    6.       
    7.       
    8.       
    9.       
    10.   
    11.     
    12.      
    13.     
    14.     请输入你的名字:   
    15.       
    16.       
    17.     
      
  •       
  •     
  •   

  • 新建springUserInfo.js
    代码
    1. function load()   
    2. {   
    3.     var jbutton = $("jbutton");   
    4.     jbutton.onclick=function(event)   
    5.     {   
    6.         bOnClick();   
    7.     };   
    8.     var sbutton = $("sbutton");   
    9.     sbutton.onclick=function(event)   
    10.     {   
    11.         sOnClick();   
    12.     };   
    13. }   
    14. function bOnClick()   
    15. {   
    16.     springUser.getUser($("name").value,callback);   
    17. }   
    18. function callback(msg)   
    19. {   
    20.     var user = msg;   
    21.     DWRUtil.setValue(‘result‘,"欢迎你!"+user.welcome+"   姓名:"+user.username+",年龄:"+user.age+",住址:"+user.address);   
    22. }  

    在web.xml中加入

    contextConfigLocation
    /WEB-INF/classes/applicationContext.xml



    org.springframework.web.context.ContextLoaderListener


    运行服务器输入http://localhost:8080/DWRStudy/springUserInfo.html,可以看到运行结果
    主要的区别是dwr.xml的配置,需要在creator=spring,然后里面的的name用beanName,值是spring的配置文件里的bean的id。Name=location是指定spring的配置文件的路径(如果不指定DWR可以根据web.xml自动找到spring的主配置文件)。
    DWR的Annotation配置
    还是上面spring那个例子的功能再来一遍(new 的配置太简单),这样的话项目中的dwr.xml对于这个例子就没有作用了
    新建User类(包名换了)
    代码
    1. package org.li.dwr.spring.annotation;   
    2.   
    3. import java.util.List;   
    4.   
    5. import org.directwebremoting.annotations.Convert;   
    6. import org.directwebremoting.annotations.Create;   
    7. import org.directwebremoting.annotations.Param;   
    8. import org.directwebremoting.annotations.RemoteMethod;   
    9. import org.directwebremoting.annotations.RemoteProperty;   
    10. import org.directwebremoting.convert.BeanConverter;   
    11. import org.directwebremoting.spring.SpringCreator;   
    12. import org.li.dwr.Book;   
    13.   
    14. @Create(creator=SpringCreator.class,name="anspringuser",creatorParams={@Param(name="beanName",value="anuser"),@Param(name="location",value="applicationContext.xml")})   
    15. @Convert(converter=BeanConverter.class)   
    16. public class User   
    17. {   
    18.     private String welcome;   
    19.     private String username;   
    20.     @RemoteProperty  
    21.     private String address;   
    22.     private List books;   
    23.     private int age;   
    24.     public String getAddress()   
    25.     {   
    26.         return address;   
    27.     }   
    28.     public void setAddress(String address)   
    29.     {   
    30.         this.address = address;   
    31.     }   
    32.     public int getAge()   
    33.     {   
    34.         return age;   
    35.     }   
    36.     public void setAge(int age)   
    37.     {   
    38.         this.age = age;   
    39.     }   
    40.     public String getUsername()   
    41.     {   
    42.         return username;   
    43.     }   
    44.     public void setUsername(String username)   
    45.     {   
    46.         this.username = username;   
    47.     }   
    48.     public String getWelcome()   
    49.     {   
    50.         return welcome;   
    51.     }   
    52.     public void setWelcome(String welcome)   
    53.     {   
    54.         this.welcome = welcome;   
    55.     }   
    56.     public List getBooks()   
    57.     {   
    58.         return books;   
    59.     }   
    60.     public void setBooks(List books)   
    61.     {   
    62.         this.books = books;   
    63.     }   
    64.     @RemoteMethod  
    65.     public User getUser(String welcome)   
    66.     {   
    67.         this.welcome=welcome;   
    68.         return this;   
    69.     }   
    70. }   

    新建过滤器类DWRAnLog
    代码
    1. package org.li.dwr.log.annotation;   
    2.   
    3. import java.lang.reflect.Method;   
    4.   
    5. import org.directwebremoting.AjaxFilter;   
    6. import org.directwebremoting.AjaxFilterChain;   
    7. import org.directwebremoting.annotations.Filter;   
    8. import org.directwebremoting.filter.SpringTransactionAjaxFilter;   
    9. @Filter(type=SpringTransactionAjaxFilter.class)   
    10. public class DWRAnLog implements AjaxFilter   
    11. {   
    12.   
    13.     public Object doFilter(Object obj, Method method, Object[] params, AjaxFilterChain chain) throws Exception   
    14.     {   
    15.         System.out.println("annotation过滤器Log输出:..对象:"+obj.getClass().getName()+"方法:"+method.getName());   
    16.         return chain.doFilter(obj, method, params);   
    17.     }   
    18.   
    19. }  

    在spring的applicationContext.xml里加入
    代码
    1.   
    2.           
    3.             javafish  
    4.           
    5.           
    6.             21  
    7.           
    8.           
    9.             北京市海淀区  
    10.           
    11.       

    新建AnSpringUserInfoHtml.html
    代码
    1.   
    2.   
    3.     
    4.     UserInfo.html  
    5.       
    6.       
    7.       
    8.       
    9.       
    10.   
    11.     
    12.      
    13.     
    14.     请输入你的名字:   
    15.       
    16.       
    17.     
      
  •       
  •     
  •   

  • 新建anspringuserInfo.js
    代码
    1. function load()   
    2. {   
    3.     var jbutton = $("jbutton");   
    4.     jbutton.onclick=function(event)   
    5.     {   
    6.         bOnClick();   
    7.     };   
    8. }   
    9. function bOnClick()   
    10. {   
    11.     alert("haha");   
    12.     anspringuser.getUser($("name").value,callback);   
    13. }   
    14. function callback(msg)   
    15. {   
    16.     var user = msg;   
    17.     DWRUtil.setValue(‘result‘,"欢迎你!"+user.welcome+"   姓名:"+user.username+",年龄:"+user.age+",住址:"+user.address);   
    18. }  

    在web.xml中
    的DWR的servlet的初始化参数里加入
    代码
    1.   
    2.        classes  
    3.          
    4.             org.li.dwr.log.annotation.DWRAnLog,org.li.dwr.spring.annotation.User   
    5.          
    6.       

    运行服务器输入http://localhost:8080/DWRStudy/AnSpringUserInfo.html,成功了
    用Annotation的配置和dwr.xml的意思基本一样,这里就不多做介绍了。
    Util.js的函数库
    $()和prototype.js一样相当于document.getElementById
    (Set)getValue()(设置)得到元素的值一般是(设置)得到元素的innerHTML。
    getText()得到元素的文本值
    (set)getValues()(设置)得到元素下的元素,以array为对象载体。
    这里都是一些最常用的函数,具体可以看一下util.js文件。

     

    DWRStudy.rar  描述:  源代码
    下载  文件名:  DWRStudy.rar  文件大小:  23 KB  下载过的:  文件被下载或查看 40 次