?
?
?
?
java bean
public class VoAreaLevel implements java.io.Serializable { // Fields private Long wlevel; private String wname; // Constructors /** default constructor */ public VoAreaLevel() { } public Long getWlevel() { return this.wlevel; } public void setWlevel(Long wlevel) { this.wlevel = wlevel; } public String getWname() { return this.wname; } public void setWname(String wname) { this.wname = wname; } }?
dwr配置 映射java bean对象?? 配置好的文件 必须要加载在web.xml
<!-- 配置dwr服务类 --> <bean id="UserAjaxHelper" class="com.per.service.DwrService"> <!-- 定义调用的js文件名称 --> <dwr:remote javascript="UserAjaxHelper"> <!-- 配置bean对象 --> <dwr:convert type="bean" class="com.per.web.ajaxvo.VoAreaLevel"> </dwr:convert> </dwr:remote> </bean>
?
dwr标记说明
?<allow>标签中包括可以暴露给javascript访问的东西。 <create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。 creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例, 其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。 javascript=" testClass "属性指定javascript代码访问对象时使用的名称。 <param>标签指定要公开给javascript的java类名。 <include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。 <exclude>标签指定要防止被访问的方法。 标签负责公开用于Web远程的类和类的方法,<convertor>标签则负责这些方法的参数和返回类型。convert元 素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。DWR自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括 Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型。DWR也能把JavaBean转换成JavaScript 表示,但是出于安全性的原因,要求显式的配置,<convertor>标签就是完成此功能的。converter="bean"属性指定转换 的方式采用JavaBean命名规范,match=""com.dwr.TestBean"属性指定要转换的javabean名称,<param& gt;标签指定要转换的JavaBean属性。?
?
dwr调用dao业务类 查询数据 返回List集合 必须要是封装已经映射的bean对象 js才能访问
?
public List<VoAreaLevel> getAreaLevelSelect() { try { List<VoAreaLevel> getlistAreaLevel = new ArrayList<VoAreaLevel>(); //这里就是查询返回数据 假装list是查询的数据 进行迭代 Iterator<PbAreaLevel> it = list.iterator(); while (it.hasNext()) { PbAreaLevel pt = (PbAreaLevel) it.next(); VoAreaLevel vo = new VoAreaLevel(); vo.setWlevel(pt.getWlevel()); vo.setWname(pt.getWname()); //list集合必须封装的是映射的java bean对象 getlistAreaLevel.add(vo); } return getlistAreaLevel; } catch (SystemRunException e) { e.printStackTrace(); return null; } }?
在页面调用 javascript中调用
?
其中UserAjaxHelper.js是dwr根据配置文件自动生成的,engine.js和util.js是dwr自带的脚本文件。
<script type="text/javascript" src="dwr/util.js"></script> <script type="text/javascript" src="dwr/engine.js"></script> <script type="text/javascript" src="dwr/interface/UserAjaxHelper.js"></script> <script type="text/javascript" > //获取区域级别两级下拉 编辑所定义的 dwr组合 function getAreaLevelSelect(){ UserAjaxHelper.getAreaLevelSelect(AreaLevelSelect); } //回调函数 dwr响应的结果 var AreaLevelSelect = function (data) { try{ //每次删除下拉框所有值 DWRUtil.removeAllOptions("areaid"); //wlevel是select的value wname是显示可选择的 //for(var i=0;<i<data.length;i++){ var bean=data[i]; 相当于data.wlevel,data.wname 获取属性方式} 添加在select id为areaid的下拉框中 value是wlevel , name是wname DWRUtil.addOptions("areaid",data,"wlevel","wname"); }catch(e){alert("系统出现错误");return false;} } </script> <body onload="getAreaLevelSelect()"> <select name="areaid" id="areaid" > </select> </body>?
?
date实际上是一个object数组,即数组的每个元素均为object
?
由以上可以发现,对于java方法的返回值 为List(Set)的情况,DWR将其转化为Object数组,传递个javascript;对于java方法的返回值为Map的情况,DWR将其转化 为一个Object,其中Object的属性为原Map的key值,属性值为原Map相应的value值。
?DWR根据dwr.xml生成和Java代码类似的Javascript代码。
相对而言Java同步调用,创建与Java代码匹配的Ajax远程调用接口的最大挑战来至与实现Ajax的异步调用特性。
DWR通过引入回调函数来解决这个问题,当结果被返回时,DWR会调用这个函数。
有两种推荐的方式来使用DWR实现远程方法调用。可以通过把回调函数放在参数列表里,也可以把回调函数放到元数据对象里。
当然也可以把回调函数做为第一个参数,但是不建议使用这种方法。因为这种方法在处理 自动处理http对象 时(查看"Alternative Method")上会有问题。这个方法主要是为向下兼容而存在的。