Java堂  


如何使用DWR2.0的注解功能

归档在: DynamicLanguage, JavaPlateform, RIA — Jet @ 8:56 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/07/07/5648271.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

DWR2.0新增加了JDK5的注解(Annotation)功能,使用注解功能之后可以从很大程度上简化了原来的dwr.xml的配置,使用起来非常的方便。

一、配置DWR使用注解功能

如果让dwr使用注解功能需要在web.xml进行如下配置:

  1. <servlet>
  2.         <servlet-name>dwr-invoker</servlet-name>
  3.         <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  4.         <init-param>
  5.             <param-name>debug</param-name>
  6.             <param-value>true</param-value>
  7.         </init-param>
  8.         <!-- 将设定注解的域对象和业务实现类放在下面列表中,中间使用逗号间隔 -->
  9.         <init-param>
  10.             <param-name>classes</param-name>
  11.             <param-value>
  12.                 com.javatang.domain.Book,
  13.                 com.javatang.bank.Bank,
  14.                 com.javatang.dao.BookDao
  15.             </param-value>
  16.         </init-param>
  17.     </servlet>
  18.     <servlet-mapping>
  19.         <servlet-name>dwr-invoker</servlet-name>
  20.         <url-pattern>/scripts/ajax/*</url-pattern>
  21.     </servlet-mapping>

这样设置之后就可以在dwr中使用注解了,非常的方便。

二、DWR提供的注解类型
经常用到的注解主要有:@RemoteProxy、@RemoteMethod、@DataTransferObject和@RemoteProperty。

1. @RemoteProxy和@RemoteMethod
@RemoteMethod对应于原来dwr.xml文件中的create标签,用于创建DWR所提供的远程方法;而@RemoteMethod对应于create标签中的 <include method=”"/>,用来指定所要暴露的方法名称。我们举例来说明:

  1. @RemoteProxy(name="bankFunctions")
  2. public class  Bank {
  3.  
  4.     @RemoteMethod
  5.     public void buy() {
  6.         // ...
  7.     }
  8. }

从上面可以看出,@RemoteProxy表示这个类将用于远程方法,而使用@RemoteMethod指定所要暴露的方法,没有使用@RemoteMethod的方法将不会显示在客户端。
上面的注释使用dwr.xml表示如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <create creator="new" javascript="bankFunctions">
  7.             <include method="buy" />
  8.         </create>
  9.     </allow>
  10. </dwr>

如果使用Spring中的DAO活逻辑层则需要进行如下的设置:

  1. // BookDao
  2. @RemoteProxy(creator = SpringCreator.class,
  3.     creatorParams = @Param(name = "beanName", value = "bookDao"),
  4.     name="bookFunctions")
  5. public class  BookDao {
  6.  
  7.     @RemoteMethod
  8.     public void addBook(Book book) {
  9.         // ...
  10.     }
  11. }

通过指定@RemoteProxy中的creator类型为SpringCreator,然后在creatorParams指定对应的beanName名称。对应的dwr.xml文件如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <create creator="spring" javascript="bookFunctions">
  7.             <param name="beanName" value="bookDao" />
  8.             <include method="addBook" />
  9.         </create>
  10.     </allow>
  11. </dwr>

2. @DataTransferObject和@RemoteProperty
@DataTransferObject对应于原来dwr.xml文件中的convert标签,用于转换Java对象;@RemoteProperty则对应于convert标签中的 <param name=”include” value=”" />。

举例说明一下:

  1. @DataTransferObject
  2. public class Book {
  3.     @RemoteProperty
  4.     private int id;
  5.  
  6.     @RemoteProperty
  7.     private String name;
  8.  
  9.     public Book() {
  10.     }
  11.  
  12.     public int getId() {
  13.         return id;
  14.     }
  15.  
  16.     public void setId(int id) {
  17.         this.id = id;
  18.     }
  19.  
  20.     public String getName() {
  21.         return name;
  22.     }
  23.  
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27. }

@RemoteProperty可以放在JavaBean中的私有变量上面,也可以放在getXXX方法上面。另外如果想将JavaBean中所有的属性都暴露出来的话,不需要在任何属性上面添加@RemoteProperty注释就可以了。

上面的注释对应的dwr.xml文件如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <convert converter="bean"
  7.             match="com.javatang.domain.Book">
  8.             <param name="include" value="id, name" />
  9.         </convert>
  10.         <!-- 或者用下面的方式也可以
  11.         <convert converter="bean" match="com.javatang.domain.Book" />
  12.         -->
  13.     </allow>
  14. </dwr>

关于具体每个注释使用的方法已经所包含的参数可以参考Java Doc。使用DWR2.0的注解极大的简化了原来dwr.xml的配置,非常的方便。

参考资料:
DWR Annotations
[原创]DWR Annotations and Spring
DWR Annotations 使用 SpringCreator

提高页面相应速度之压缩优化js和css文件

归档在: DynamicLanguage — Jet @ 5:02 下午
Tags: , ,
原文出处: http://www.javatang.com/archives/2008/04/13/0212267.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Steve Souders在他的《High Performance Web Sites》一书中提出提高网页效率的14条准则,这些可以使用Yahoo! YSlow来进行一个比较形象的检测。

这里主要来说一下第一条准则:Make Fewer HTTP Requests,意思就是尽可能的减少HTTP请求。当时要达到这个目的有很多种方法,其中最重要的一点就是将CSS文件和Javascript文件分别进行压缩和合并,这样就在很大程度上减少了浏览器对服务器的HTTP请求此处,另外一旦被浏览器下载到本地可以对此进行缓存,从而提高了加载速度。

有关于这方面的工具最优秀且使用最为广泛的开源软件非YUI Compressor莫属了。但是YUICompressor只能使用命令行一个个对js或css文件进行压缩,现在我们就通过使用ant脚本来达到批量压缩合并多个文件的目的。

下面以压缩js文件为例进行说明。

首先做一个关于js文件编码规范的约定:所有的原始文件均为 .source.js,经过压缩处理后文件变为.js,将多个压缩后的文件合并后的文件名称为all-min.js。

接下来可以写下面的ant脚本:

  1. <!-- 对YUICompressor的引用 -->
  2. <property name="js.dir" value="${web.dir}/scripts" />
  3. <property name="js.release.name" value="all-min.js"/>
  4.  
  5. <!-- 删除之前压缩合并过的文件 -->
  6. <delete>
  7.     <fileset dir="${js.dir}" includes="${js.release.name}"/>
  8. </delete>
  9.        
  10. <!-- 执行 yuicompressor 压缩JS
  11.    -- parallel="false":对fileset中的每个文件都执行一次executable参数的命令
  12.   -- dest 执行目录
  13.    -->
  14. <apply executable="java" parallel="false" verbose="true" dest="${js.dir}">
  15.     <fileset dir="${js.dir}">
  16.         <include name="**/*.source.js"/>
  17.     </fileset>
  18.         <arg line="-jar"/>
  19.         <arg path="${yuicompressor}"/>
  20.     <!-- 设置待处理源文件及处理后输出文件的编码格式 -->
  21.     <arg line="--charset utf-8"/>
  22.     <srcfile/>
  23.     <arg line="-o"/>
  24.     <!-- 指定文件命名规则 -->
  25.     <mapper type="glob" from="*.source.js" to="*.js" />
  26.         <targetfile/>
  27. </apply>
  28.  
  29. <!-- 合并文件 -->
  30. <concat destfile="${js.dir}/${js.release.name}" fixlastline="true">
  31.     <fileset dir="${js.dir}">
  32.         <include name="**/*.js"/>
  33.         <exclude name="${js.release.name}"/>
  34.             <exclude name="**/*.source.js"/>
  35.             <exclude name="i18n/*.js"/>
  36.         </fileset>
  37. </concat>
  38.        
  39. <!-- 删除生成的临时文件 -->
  40. <delete>
  41.     <fileset dir="${js.dir}">
  42.         <include name="**/*.js"/>
  43.         <exclude name="${js.release.name}"/>
  44.             <exclude name="**/*.source.js"/>
  45.             <exclude name="i18n/*.js"/>
  46.         </fileset>
  47. </delete>

参考资料:
Building Web Applications With Apache Ant
YUI Compression tool as Ant Task
用yuicompressor和Ant压缩Ext的CSS文件
用YSlow分析我们页面(完整版)

DWR文档之dwr.xml

归档在: JavaPlateform, RIA — Jet @ 9:30 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2007/03/11/3030123.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

原文出处: http://www.javatang.com/archives/2007/03/11/3030123.html
翻译: Jet Mah
声明: 请维持文章的完整性任意转载

dwr.xml 是用来配置DWR的文件。默认情况下需要将其同web.xml一起放在WEB-INF文件夹中。

DTD
这里有一个用于 dwr.xml的 DTD文档,另外还有一个用DTDDoc创建的参考文档

创建 dwr.xml 文件
dwr.xml 文件结构如下:

  1. <!DOCTYPE dwr PUBLIC 
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" 
  3.     "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> 
  4.  
  5. <dwr> 
  6.  
  7.   <!-- init is only needed if you are extending DWR --> 
  8.   <init> 
  9.     <creator id="..." class="..."/> 
  10.     <converter id="..." class="..."/> 
  11.   </init> 
  12.  
  13.   <!-- without allow, DWR isn't allowed to do anything --> 
  14.   <allow> 
  15.     <create creator="..." javascript="..."/> 
  16.     <convert converter="..." match="..."/> 
  17.   </allow> 
  18.  
  19.   <!-- you may need to tell DWR about method signatures --> 
  20.   <signatures> 
  21.     ...
  22.   </signatures> 
  23.  
  24. </dwr>

术语
一些术语是值得去理解的 - 参数会被 转换(converted),但是远程的beans会被创建(created)。因此如果bean A有一个方法 A.blah(B),那么需要一个A的创建器(creator) 和 B 的转换器(converter)

(1) <allow>
allow部分定义的是DWR可以创建和转换的类。

(2) Creators
每个被调用的类都需要一个 <create …> 来定义。有几种类型的creator,最常用的是“new”关键字和Spring框架。更多的信息请参考 Creator 文档。

(3) Converters
所有的参考都需要被转换。你有权限转换JDK所提供的多数类型,但是需要给DWR权限来转换你自己的代码。也就是说JavaBean参数需要一个 <convert …> 来定义。

默认情况下下述类型可以直接被转换:

  • 所有的基本类型,比如boolean、int、double等等
  • 基本类型的对象类如Boolean、Integer等
  • java.lang.String
  • java.util.Date 和 SQL 表达式
  • 上述类型的数组
  • 上述类型的集合类 (Lists、Sets、Maps、Iterators等)
  • 从DOM、XOM、JDOM和DOM4J创建的DOM对象(像Element和Document)

具体怎样转换你自己的JavaBeans和其他参数请参考Converter 文档。

(4) <init>
init部分是可选的,用来声明用来创建和转换beans的类。大多数情况下你用不到它。如果你想定义一个新的Creator [JavaDoc] 和 Converter [JavaDoc] 的话,需要在此声明。不过务必检查你所使用的DWR是否以及支持上述功能了。

init部分只是告诉DWR存在这个类,并且给出了这个类的一些基本的运行信息。但这些类并没有开始使用,这点有点类似Java中的import语句。大多数类在使用前必须被导入,但是声明导入并不意味着类开始被使用。每个 creator 和 converter 都有一个id属性,这样方便后面调用。

(5) <signatures>
DWR 使用映射来确定哪些类型需要被转换。有的时候这些类型信息不明确,这时你可以在此写下方法的签名来指明其类型。更多细节请参考signatures 部分。

多个 dwr.xml 文件

可以有一个以上的 dwr.xml 文件 (更多细节可参考 web.xml 文档 )。每个文件中的节点会被整合在一起。这个功能可以使DWR来加载基础配置文件来运行每个文件。

我们可以通过查看标准的配置文件对 dwr.xml 进行一个良好的认识。

英文出处:
http://getahead.org/dwr/server/dwrxml
DWR文档翻译文档列表:
http://www.javatang.com/dwr-chinese-documents/

Netbeans上的DWR插件

归档在: JavaPlateform, RIA — Jet @ 9:38 下午
Tags: , ,
原文出处: http://www.javatang.com/archives/2007/03/08/3846115.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

一个名为Chuck的人发布了Netbeans上的DWR插件,主要有以下功能:

1. 将一个JavaEE项目添加为支持DWR;
2. 多视图下编辑dwr.xml文件,目前提供了三种视图:创建、转换和XML文本;
3. 从NetBeans的Palette面板上直接拖拽DWR对象到JSP页面中。

DWR NetBeans plugin

具体可点击这里

如果有一个这样的Eclipse的插件就太好了,抽时间做一个出来,呵呵…

DWR官方更换新域名

归档在: JavaPlateform, RIA — Jet @ 10:00 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2007/03/06/0048111.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

dwr-logo.png
今天在Joe Walker的博客看到DWR的官方网站的域名已经由原来的getahead.ltd.uk更改为现在的getahead.org了,所以DWR的地址更新为 http://getahead.org/dwr。

Joe在他的博客中写道更换的原因是因为Yahoo一直认为.ltd.uk不够正式,至少不如.co.uk正式,想不到英国的二级域名更多,比cn的还黑啊,呵呵。

这样以来本站中的DWR文档中指向原文档的链接也需要更新,尽管现在老的域名也可以访问。

DWR文档之 技巧和要点

归档在: JavaPlateform, RIA — Jet @ 9:05 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2006/11/21/055584.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

原文出处: http://www.javatang.com/archives/2006/11/21/055584.html
翻译: Jet Mah
声明: 请维持文章的完整性任意转载

使用DWR的技巧和要点

这里列出了在使用DWR时候的一些技巧和要点,希望对你有所帮助。请对你有过帮助的地方添加评论…

创建一个 “Google Suggest” 组件
我一直不主张自己写 suggest 组件。虽然实现一下基本的功能比较简单,但是完全实现快捷键(keyboard navigation)功能就非常困难了。下面是一些包含 suggest 组件的库:

Script.aculo.us 包含了一个 Autocompleter.Local 函数,该函数可以与DWR融为一体。使用’Local’版本并远程协同DWR工作比使用’Remote’ 版本容易的多,因为后者还需要知道服务端怎样工作。更多有所帮助的信息请参考这封在 dwr-users 邮件列表的信 ,或者Rubens的这篇博文

来自 Rimu Hosting 的 Alternatively Peter 实现了一个独立的并且dwr兼容的版本,这里是他发表的文章

增强的文件上传
Pierre Losson 书写了一种将 DWR 和 Commons-FileUpload 结合在一起的方法,很值得一读。完整的源代码和 war 演示程序都可以下载。

改进 loading message
存在于 DWR 1.0 的 useLoadingMessage() 函数有一些缺陷(比如你不能自定义显示的文字信息,还有在调用它的时候必须非常小心)。你可以使用剪切和粘贴一个该函数的新版本来修复这些缺陷(译注:这里作者的意思是你可以在DWR所提供的 useLoadingMessage() 函数的基础上进行修改)。 useLoadingMessage() 文档 提供了更详细的资料。

使用调试/测试页面
当程序出现问题的时候,另外一个非常有用的助手就是调试/测试页面(地址是 http://localhost:8080/[YOUR-WEBAPP]/dwr )。这个页面的一些基本用法已经包含在了 开始使用 DWR 这篇文章之中,但是记住程序何时中断的显得更有意义,这是因为通常这些页面提供了将要出现错误的信息。

访问 HttpServletRequest
你可以 访问 HttpServletRequest 并映射对象。

向回调函数传递参数
通常我们需要把额外的信息传递给回调函数,但是所有的回调函数只有一个参数(远程方法中的返回值),它应该更灵活。 这里专门有一整页专注于这个问题,可以帮助你解决这个问题

调整服务器性能
CPU 瓶颈:一些 公正认真的性能大师们 认为 DWR 基本没有什么性能方面的问题。DWR所使用的时间跟服务器和网络比起来微不足道。如果你真的想提升性能的话,可以讲日志的级别设置位ERROR或FATAL,当然最主要的还要取决于你的代码。

网络瓶颈: DWR不能管理浏览器的缓存,所以浏览器会不断地重复读取 DWR javascript 脚本。有一个比较简单的解决方法,将这些 javascript 文件复制到 web-app 目录,这样服务器可以更好的来处理它们。你还可以将所有的 javascript 文件合并到一个文件中,然后使用 DOJO compressor 压缩来减小文件的体积。

我们将发布一个补丁使得 DWR 在 web 程序启动的时候可以使用时间来标记 Javascript 文件,但是这些并不是最好的解决方法,因为上面所说的方法非常简单并且可以很大程度上压缩合并 Javascript 文件。

英文出处:
http://getahead.org/dwr/hints
DWR文档翻译文档列表:
http://www.javatang.com/dwr-chinese-documents/

DWR文档之 网络上的资料

归档在: JavaPlateform, RIA — Jet @ 11:42 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2006/10/24/424782.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

原文出处: http://www.javatang.com/archives/2006/10/24/424782.html
翻译: Jet Mah
声明: 请维持文章的完整性任意转载

网络上关于 DWR 的教程和文章

DWR 的各种教程开始出现在网络上。欢迎你对除此之外的其他教程或者任何包含下面文章的书刊进行评论。

连接 DWR 和其他技术
有很多是关于将 DWR 应用到其他技术的文章:

  • Mats Henricson 写的文章是关于 将DWR 应用到 Appfuse
  • Jorge Martín Cuervo 记录了他使用 DWR 的亲身经历 ,还有 JMeter.
  • Helge Tesgaard 基于 DWR 使用 Commons FileUpload 和 Acegi 创建了一个 Ajax 上传进度条.
  • Sujit Pal 写的使用 DWR 和 Velocity
  • Pinaki Poddar 为 BEA dev2dev 写了两篇关于 DWR 和 EJB3 的文章:第一部分第二部分
  • DWR 和 Confluence ,作者:Dan Hardiker.DWR 教程
    这一部分是一组介绍 DWR 的文章,大部分都是从 1.x 版本开始的。

    Sun: Hands-On DWR Labs

    来自于 Sun 的 Sang Shin from Sun 创建了一组 Hands on Labs 用来讨论各种 Ajax 技术。这里是 DWR 部分

    摘录:此文档从头教给你怎样快速使用 DWR 开发基于 Ajax 的 Web 程序。

    Java.net: DWR 聊天室演示程序

    由 DWR 的开发者 - Joe Walker 所创建。

    摘录: 文章演示了使用 DWR 创建一个多用户的网络聊天室。它说明将客户端浏览器中的 JavaScript 和服务端的 Java 连在一起是如果的容易。它的目标是在客户端和服务端都使用大概 100 行代码来创建这个完整的系统……

    IBM DeveloperWorks: 结合 Direct Web Remoting 使用 Ajax

    再也没有比这个更简单的连载文章了,作者是 Phil McCarthy
    (译注:中文版本的地址为:http://www-128.ibm.com/developerworks/cn/java/j-ajax3/

    摘录: Philip McCarthy 介绍了如何使用Direct Web Remoting(DWR)直接把 JavaBean 的方法公开给 JavaScript 代码并自动进行 Ajax 的繁重工作。… 虽然 DWR 不是 Java 平台中唯一的 Ajax-RPC 工具,但是它是其中一个特别成熟的工具,并且提供了一大堆有用的函数。

    BEA dev2dev: Ajax简介

    关于 Ajax 和 DWR 的简介,作者 David Teare
    (译注:中文版本的地址为:http://dev2dev.bea.com.cn/techdoc/2005110103.html

    摘录:DWR 真正的简洁在于,一旦你设置了公开于客户端的服务端代码,它将映射到被网页调用的 JavaScript 对象,这些对象也可以直接访问服务端。网页可以直接使用被映射的 JavaScript 对象,就好像直接使用服务端的代码一样;DWR 无缝地解决了实现这些功能的细节……

    JavaWorld: DWR 使开发 Ajax 如此简单
    一篇介绍 DWR 的文章,作者是 Cloves Carneiro Jr.

    摘录:文章介绍了使用开源项目 DWR(Direct Web Romoting)实现 AJAX(Asynchronous JavaScript and XML)来改善 Web 应用程序的优势。作者逐步操作来演示了 DWR 怎样简单而快速的实现 AJAX。(1,600 字;2005年6月20日)

    英文出处:
    http://getahead.org/dwr/elsewhere
    DWR文档翻译文档列表:
    http://www.javatang.com/dwr-chinese-documents/

  • DWR文档之范例

    归档在: JavaPlateform, RIA — Jet @ 10:15 下午
    Tags: ,
    原文出处: http://www.javatang.com/archives/2006/10/23/153481.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    原文出处: http://www.javatang.com/archives/2006/10/23/153481.html
    翻译: Jet Mah
    声明: 请维持文章的完整性任意转载

    范例

    官方站点上有 7 个指南或范例,他们主要用来理解 DWR 怎样工作而不是延伸 Ajax。

    在尝试自己创建这些例子之前,最好先理解 开始使用 DWR 部分。

  • 站点实例
  • 动态更新文本
  • 动态表单编辑
  • 表格编辑
  • 动态地址簿
  • 动态下拉列表
  • 动态验证
  • 简易聊天室
  • 操作 XML
  • 例子源代码英文出处:
    http://getahead.org/dwr/examples
    DWR文档翻译文档列表:
    http://www.javatang.com/dwr-chinese-documents/
  • 最流行的 Ajax/Java 框架

    归档在: JavaPlateform, RIA — Jet @ 9:23 上午
    Tags: ,
    原文出处: http://www.javatang.com/archives/2006/10/20/230978.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    最流行的 Ajax/Java 框架

    Filed under: DWR — Jet @ 9:23 am

    Ajaxian.com 上评出的2006最流行的 Ajax/Java 框架