AJax技术

ydb7459022的专栏(3)

字号+ 作者:H5之家 来源:H5之家 2017-01-27 09:12 我要评论( )

DWR真正的巧妙之处是,在用户配置了要向客户机公开的服务之后,它使用反射来生成JavaScript对象,以便Web页面能够使用这些对象来访问该服务。然后Web页面只需接合到生成的JavaScript对象,就像它们是直接使用服务一

  DWR真正的巧妙之处是,在用户配置了要向客户机公开的服务之后,它使用反射来生成JavaScript对象,以便Web页面能够使用这些对象来访问该服务。然后Web页面只需接合到生成的JavaScript对象,就像它们是直接使用服务一样;DWR无缝地处理所有有关Ajax和请求定位的琐碎细节。

 

  让我们仔细分析一下示例代码,弄清它是如何工作的。

 

应用程序细节:DWR分析

 

  关于应用程序,首先要注意的是,它是一个标准的Java应用程序,使用分层架构(Layered Architecture)设计模式。使用DWR通过JavaScript公开一些服务并不影响您的设计。

 

 

 

 下面是一个简单的Java服务,我们将使用DWR框架直接将其向JavaScript代码公开:

 

package com.tearesolutions.service;

 

public interface AjaxSampleSvc {

 Article castVote(int rank);

}

 这是一个被简化到几乎不可能的程度的例子,其中只有一篇文章可以投票。该服务由Spring管理,它使用的bean名是ajaxSampleSvc,它的持久性需求则依赖于ArticleDao。详情请参见applicationContext.xml。

 

 为了把该服务公开为JavaScript对象,需要配置DWR,添加dwr.xml文件到WEB-INF目录下:

 

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE dwr PUBLIC

 "-//GetAhead Limited//DTD Direct WebRemoting 0.4//EN"

 "">

 

<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>

 dwr.xml文件告诉DWR哪些服务是要直接向JavaScript代码公开的。注意,已经要求公开Spring bean ajaxSampleSvc。DWR将自动找到由应用程序设置的SpringApplicationContext。为此,必须使用标准的servlet过滤器ContextLoaderListener来初始化Spring ApplicationContext。

 

 DWR被设置为一个servlet,所以把它的定义添加到web.xml:

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD

 Web Application 2.3//EN" "">

 

<web-app>

 <display-name>AjaxExamples</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>

 做完这些之后,可以加载:7001/ajax-demo/dwr,看看哪些服务可用。结果如下:

 

 

 

图3. 可用的服务

 

  单击ajaxSampleSvc链接,查看有关如何在HTML页面内直接使用服务的示例实现。其中包含的两个JavaScript文件完成了大部分的功能:

<scripttype='text/javascript'

  src='/ajax-demo/dwr/interface/ajaxSampleSvc.js'></script>

<script type='text/javascript'

  src='/ajax-demo/dwr/engine.js'></script>

ajaxSampleSvc.js是动态生成的:

 

function ajaxSampleSvc() { }

 

ajaxSampleSvc.castVote =function(callback, p0)

{

 DWREngine._execute(callback, '/ajax-demo/dwr',

 'ajaxSampleSvc', 'castVote', p0);

}

 现在可以使用JavaScript对象ajaxSampleSvc替换所有的XmlHttpRequest代码,从而重构raw-ajax.html文件。可以在dwr-ajax.html文件中看到改动的结果;下面是新的JavaScript函数:

 

function castVote(rank) {

 ajaxSampleSvc.castVote(processResponse, rank);

}

function processResponse(data) {

 var voteText = "Thanks for Voting!"

   + "Current ranking: " + data.voteAverage

   + " out of 5"

   + "Number of votes placed: "

   + data.numberOfVotes + "";

 502 502'votes').innerHTML = voteText;      

}

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 专栏:Ajax学习

    专栏:Ajax学习

    2016-12-22 11:03

  • furway的专栏

    furway的专栏

    2016-07-15 16:01

  • xmphoenix的专栏

    xmphoenix的专栏

    2016-06-19 14:03

  • ruxing.li 的专栏

    ruxing.li 的专栏

    2016-04-11 17:06

网友点评
"