让我们仔细分析一下示例代码,弄清它是如何工作的。 字串2
应用程序细节:DWR分析 字串8
关于应用程序,首先要注意的是,它是一个标准的Java应用程序,使用分层架构(Layered Architecture)设计模式。使用DWR通过JavaScript公开一些服务并不影响您的设计。
字串3
下面是一个简单的Java服务,我们将使用DWR框架直接将其向JavaScript代码公开: 字串6
package com.tearesolutions.service;public interface AjaxSampleSvc { Article castVote(int rank);} 字串4
这是一个被简化到几乎不可能的程度的例子,其中只有一篇文章可以投票。该服务由Spring管理,它使用的bean名是ajaxSampleSvc,它的持久性需求则依赖于ArticleDao。详情请参见applicationContext.xml。 字串8
为了把该服务公开为JavaScript对象,需要配置DWR,添加dwr.xml文件到WEB-INF目录下: 字串6
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 0.4//EN" "http://www.getahead.ltd.uk/dwr/dwr.dtd"><dwr> <allow> <create creator="spring" javascript="ajaxSampleSvc"> <param name="beanName" value="ajaxSampleSvc" /> </create> <convert converter="bean" match="com.tearesolutions.model.Article"/> <exclude method="toString"/> <exclude method="setArticleDao"/> </allow></dwr> 字串1 dwr.xml文件告诉DWR哪些服务是要直接向JavaScript代码公开的。注意,已经要求公开Spring bean ajaxSampleSvc。DWR将自动找到由应用程序设置的SpringApplicationContext。为此,必须使用标准的servlet过滤器ContextLoaderListener来初始化Spring ApplicationContext。
DWR被设置为一个servlet,所以把它的定义添加到web.xml: 字串3
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app> <display-name>Ajax Examples</display-name> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>ajax_sample</servlet-name> <servlet-class>com.tearesolutions.web.AjaxSampleServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>dwr-invoker</servlet-name> <display-name>DWR Servlet</display-name> <description>Direct Web Remoter Servlet</description> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ajax_sample</servlet-name> <url-pattern>/ajax_sample</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping></web-app>字串9
做完这些之后,可以加载
http://localhost:7001/ajax-demo/dwr,看看哪些服务可用。结果如下:
字串8
图3. 可用的服务
字串9
单击ajaxSampleSvc链接,查看有关如何在HTML页面内直接使用服务的示例实现。其中包含的两个JavaScript文件完成了大部分的功能:
字串7
<script type='text/javascript' src='/ajax-demo/dwr/interface/ajaxSampleSvc.js'></script><script type='text/javascript' src='/ajax-demo/dwr/engine.js'></script> 字串6 ajaxSampleSvc.js是动态生成的: 字串5
function ajaxSampleSvc() { }ajaxSampleSvc.castVote = function(callback, p0){ DWREngine._execute(callback, '/ajax-demo/dwr', 'ajaxSampleSvc', 'castVote', p0);} 字串7 现在可以使用JavaScript对象ajaxSampleSvc替换所有的XmlHttpRequest代码,从而重构raw-ajax.html文件。可以在dwr-ajax.html文件中看到改动的结果;下面是新的JavaScript函数:
function castVote(rank) { ajaxSampleSvc.castVote(processResponse, rank);}function processResponse(data) { var voteText = "

