日期:2014-05-16  浏览次数:20686 次

DWR的注释(annotations)使用及反向调用(Reverse Ajax)

先说说注释语法,省掉dwr.xml。(自从用了java 5 之后,现在越看一堆堆的配置文件越烦,越来越喜欢注释方式来的直接简单了)??

首先下载最新的稳定版本的dwr.jar文件放到你的工程中。(还有需要其它的吗?不需要了,dwr就是这么简单)
然后在web.xml中添加如下一段

 <!-- DWRServlet -->   
 <servlet>   
  <servlet-name>dwr-invoker</servlet-name>   
  <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>   
  <init-param>   
<!-- 默认为false,调试用,可以访问http://地址:端口/上下文/dwr 来进行测试 -->   
   <param-name>debug</param-name>   
   <param-value>true</param-value>   
  </init-param>   
<!--这就是传说中的DWR反转调用的开关了,默认也是false -->   
  <init-param>   
   <param-name>activeReverseAjaxEnabled</param-name>   
   <param-value>true</param-value>   
  </init-param>   
<!--日志级别不多说了-->   
  <init-param>   
   <param-name>logLevel</param-name>   
   <param-value>WARN</param-value>   
  </init-param>   
<!--这块注意了,关键来了,把使用DWR注释的类都要加在这里,2.0的DWR好像还不支持包扫描,希望以后能提供这个功能,3.0我还没注意有没有这个功能,现在还没出正式版-->   
  <init-param>   
   <param-name>classes</param-name>   
   <param-value>   
                org.relax.service.SectionManager,    
    org.relax.service..entity.Section    
            </param-value>   
  </init-param>   
 </servlet>   
<!--这块不用多说了吧,如果看不懂,哪凉快哪呆着去吧-->   
 <servlet-mapping>   
  <servlet-name>dwr-invoker</servlet-name>   
  <url-pattern>/dwr/*</url-pattern>   
 </servlet-mapping>   

?

在这里再说明一下有的文章用的是uk.ltd.getahead.dwr.DWRServlet,其实他只是继承了一下org.directwebremoting.servlet.DwrServlet自己什么也没做,所以这两个类用哪个都行(这么做应该是为了兼容以前的版本,猜的,1.0我没用过)。
下面看具体的类吧。

@Service    
@RemoteProxy(creator = SpringCreator.class, name = "sectionManager", creatorParams = @Param(name = "beanName", value = "sectionManager"))    
public class SectionManager extends DefaultEntityManager<Section, Integer> {    
   
 @Autowired    
 OriginCollectDataManager originCollectDataManager;    
   
 @RemoteMethod    
 public Section get(Integer id) {    
  return super.get(id);    
 }    
   
 @RemoteMethod    
 public List<Section> getAll() {    
  return super.getAll();    
 }    
   
}    

?

我的测试环境里还用到了spring和hibernate,所以里面还掺杂了一些spring的注释标记,当然如果你没用也无所谓。
这里主要解释一下DWR的几个Annotations
@RemoteProxy标在类上的就是使类可以运程访问
@RemoteProxy(creator = SpringCreator.class, name = "sectionManager", creatorParams = @Param(name = "beanName", value = "sectionManager")),
上面因为使用了spring所以写的是springCreator.class, 其它还有BeanCreator, Ejb3Creator, JsfCreator, NewCreator, NullCreator, PageFlowCreator, ScriptedCreator, SingletonCreator, SpringCreator, StrutsCreator。看自己的具体需求。最常用的就是newCreator了吧。
@RemoteMethod标在方法上,不用多说可以使方法能远程访问
@DataTransferObject标在类上,注明需要转换的VO类了
@RemoteProperty标在类的属性上,标明哪些可以访问(我试了试不标,好像全都可以访问了)
常用的就这么多了,其它几个不太常用,如果用到的时候再研究吧。
还有什么要做的吗?好像就这么多了。DWR就是简单。如果标好了可以试试访问上下文路径加上/dwr来访问试试了。好像好用了哎。

看上去方法好像挺多,其实真正能访问用的只有用@RemoteMethod标注过的。
测试已经好用了下面就是加到页面了。那不就更简单了吗。按着上图收到JSP文件中。然后像调用普通javascript对象一样就可以了。咱不是做普及的,今天主要讲注释的用法。这部分就到这吧。

下面说反向调用了,这个还是挺复杂的,首先解释几个概念。

dwr的逆向ajax其实主要包括两种模式:主动模式和被动模式。其中主动模式包括Polling和Comet两种,被动模式只有Piggyback这一种。

??? 所谓的Piggyback指的是如果后台有什么内容需要推送到前台(即调用页面的js方法),是要等到那个页面进行下一次ajax请求的时候,将需要推送的内容附加在该次请求之后,传回到页面。

??? polling指的是由浏览器定时向服务端发送ajax请求,询问后台是否有什么内容需要推送,有的话就会由服务端返回推送内容。这种方式和我们直接在页面通过定时器发送ajax请求,然后查询后台是否有变化内容的实现是类似的。只不过用了dwr之后这部分工作由框架帮我们完成了。

??? comet模式指的的当服务端建立和浏览器的连接,将页