英文原文:http://bram.jteam.nl/?p=2
你想再用几个月尝试一下Ajax, HttpXmlRequest, DWR?你的Web App正使用的是Spring的框架?恩,你来对地方了。
本文给出了DWR+Spring的介绍。不过,你必须具备Javascript和使用Spring的基本知识。
DWR
DWR使通过Ajax调用你的业务层模块变得简单。它让你使用Ajax,却不用理会那些繁琐的诸如兼容浏览器之类的麻烦。
虽然DWR自己也提供了一些对于Spring的支持,但是却无法做到无缝整合。例如,它需要你在Web.xml中配置一个独立的Servlet,却无法让它访问Web App Context中的Beans。
让我们开始吧
首先,我们来配置一个Spring MVC Controller,称之DWRServlet,用它取代上面所说的那个独立的Servlet。还好,Spring已经提供了一个现成的,叫ServletWrappingController。将下列代码加到你的dispacher app context,DWR就会成为一个标准的Spring Controller。<bean id="dwrController" class= "org.springframework.web.servlet.mvc.ServletWrappingController">注意,开发过程中将初始化参数Debug置True,它将提供有用的Beans列表。更重要的是,注意我们是怎样将初始化参数值传递给DWR的。
<property name="servletClass">
<value>uk.ltd.getahead.dwr.DWRServlet</value>
</property>
<property name="initParameters">
<props>
<prop key="debug">true</prop>
</props>
</property>
</bean>
添加一条Url Mapping以确保所有的请求都首先交由这个DWRServlet处理。注意,这个Mapping应该处于最后,以确保能处理到所有的请求。<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/**/*.html">defaultController</prop>
<prop key="/**/*">dwrController</prop>
</props>
</property>
</bean>
另外,还要确定所有的后缀请求(包括没有后缀)都交给Spring的dispatcher处理了。所以,除了Mapping JSP和HTML以外,还要像下例一样Mapping所有的后缀。下例假设已经定义了名为“main”的Spring DispacherServlet。<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
配置DWR
虽然可以通过初始参数改变,但DWRServlet假设配置文件为/WEB-INF/dwr.xml。下面是一个示例配置文件,文件中使用了假设在App Context中已经存在的一个id为productManager的Bean。<?xml version="1.0" encoding="ISO-8859-1"?>注意,现在默认情况下包含了一个Spring creator。这个Creator将处于App Context中的productManager Bean暴露(指在JS中可以调用)了出来。可以用此法创建一个新的Bean,或者找到一个已经存在的Bean。
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<convert
converter="bean"
match="your.package.*"/>
<create
creator="spring"
javascript="productManager">
<param name="beanName" value="productManager"/>
</create>
</allow>
</dwr>
在<allow>中,首先需要定义一个Convertor以将标准的JavaBeans转换为Javascript的对象。虽然DWR提供了此类支持,但是默认情况下没有开启。DWR默认只开启了对于基本类型以及一些Collection的Convertor。注意,你所开启的包,它必须包含你想要convert的类。
最后,你为每一个想要通过DWR暴露出来的Bean写一个<create>。本例中,我们暴露了一个id为productManager的bean。
访问你的Bean
该做的都差不多了,让我们试试看访问这个Product Manager。假设这个Bean有一个getAllProducts()的方法,并以List方式组织所有已知的Product(JavaBean)将它作为返回。首先需要在我们的页面中包括两个Javascript文件。<script type='text/javascript' src='/dwrPath/interface/productManager.js’></script>上面的dwrPath就是之前提到的已经被映射了的dwrcontroller。现在,唯一要做的就是调用Product Manager的方法了。假设我们需要一个按钮来触发获取信息的过程,并用span来取得所有的返回值。
<script type=’text/javascript’ src=’/dwrPath/engine.js’></script><input type="button" onclick="productManager.getAllProducts(productCallback);" value="Get all products"/>注意嵌套的属性如price.currency和price.value。仅当Product和Price位于Bean Convertor所指定的路径(本例为your.package)下的时候,才能被正确解析。
<script type="text/javascript">
var productCallback = function(products) {
var text = 'Products: <br><ul>';
for(i = 0; i < products.length; i++) {
text += '<li>';
text += products[i].name;
text += ' (';
price= products[i].price;
text += price.currency;
text += ' ';
text += price.value;
text += ')';
text += '</li>';
}
document.getElementById('productlist').innerHTML = text;
}
</script>
<span id="productlist">
调试
DWR 提供了内置的调试功能。由于在初始参数中将debug置为true,我们可以使用这些内置的调试功能。使用浏览器访问/dwrPath,你会发现一个列表,列出了所有通过DWR暴露的Beans。通过他们的链接,还可以得到每个Bean暴露的方法列表。它还提供了调用这些方法调试例子,以方便使用和调试。
工具
DWR还提供了些工具类方法和处理错误的手段。更多信息参见这里。
祝好运
我希望这个简单的教程让你了解了如何集成Spring和DWR,并让你更容易的创建一个基于Ajax技术的Web App。 我现在还在看一些如何使用Spring+DWR进行实时的表单校验等。所以,经常逛逛本Blog以保持你跟上进度了哦!
谢谢您老人家的文章,找到新目标了.
多指教-
msn:shiguang_li@hotmail.com
crzaywood —— 2006年09月24日 @12:56 am
不爽。一个最基本的demo至少包含CRUD吧!!!!
而你少了3个
xx —— 2008年05月22日 @12:00 pm
不爽。一个最基本的demo至少包含CRUD吧!!!!
而你少了3个
xx —— 2008年05月22日 @12:02 pm
不爽。一个最基本的demo至少包含CRUD吧!!!!
而你少了3个
xx —— 2008年05月22日 @12:02 pm