DWR介绍

本文介绍了DWR框架的应用场景,如验证码校验、权限管理等。详细解析了DWR的特性,包括其简单集成、高性能及扩展性优势。并通过具体实例展示了如何在网页中使用DWR实现异步调用及省市联动的下拉菜单功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前在PRM和集团门户系统中已经很多地方都应用了。 比如在集团门户校验验证码,大客户和集团客户是否具有查看和修改统一权限,还有集团产品唯一性校验等等。

DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本DWR0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好浏览器支持,还支持一个可选的commons-logging日记操作.

DWR的设计构思很是巧妙。
第一、把java类转化为javascript类由dwr自动完成,只需简单的配置。
第二、应用起来极其简单。开发者不要该服务器代码就可以集成。
第三、容易测试。和webwork一样,隐藏的http协议。
第四、及强扩展性。例如与spring集成,只需修改一点代码。
第五、性能。就我与jason,等简单比较,dwr性能可能是最好的。
第六、自动把java对象转化为javascript对象,并且及易扩展

注:附件是DWR中文文档


dwr一般都是异步调用,然后在回调函数里面设置相关的参数方法。可是我们有的时候往往需要调用JS函数的时候得到返回值,那么DWR中怎样设置成同步调用模式呢?下面的例子可以给你很好的注解。例子:

function getValidCode(){
          //优化取值方式,2007-11-29
	    var _data = "";
	    //设置成同步
	    DWREngine.setAsync(false);
	    //对返回参数进行赋值
	    sessionUtil.getCurrVaildCode(function(data){_data = data;});
	    //重新设置为异步方式
	    DWREngine.setAsync(true);
            //返回值
	    return _data;	   
}


DWR 下拉选择框实例下面以一个省市联动的例子来说明。
1.首先需要JAVA类中实现取数据的方法。下面在ItemsBean.java类实现了两个方法,一个是取省列表的,一个取市列表的。返回值都是MAP。

/**
	 * 得到省份列表
	 * @param request
	 * @return
	 */
	public Map provList(HttpServletRequest request) {
		Map reply = new LinkedHashMap();
                //取省份列表
		String[][] provStr = SelectControl.getSelectOption(
				SelectControl.CODE_PROVINCE, 0, request);
		if (provStr != null && provStr.length > 0) {
			for (int i = 0; i < provStr.length; i++) {
				if (i == 0) {
					strProvId = provStr[i][1];
				}
				reply.put(provStr[i][1], provStr[i][0]);
			}
		}
		return reply;
	}

	/**
	 * 得到城市列表
	 * @param provId
	 * @param request
	 * @return
	 */
	public Map cityList(String provId, HttpServletRequest request) {
		Map reply = new LinkedHashMap();
		if (provId == null || provId.equals("") || provId.equals("0")) {
			if(strProvId == null) getDefaultPorvId();
			provId = strProvId;
		}
                //这里根据省份ID取城市列表
		String[][] provStr = SelectControl.getSelectOption(
				SelectControl.CODE_CITY, provId, request);
		if (provStr != null && provStr.length > 0) {
			for (int i = 0; i < provStr.length; i++) {
				reply.put(provStr[i][1], provStr[i][0]);
			}
		}

		return reply;
	}

2.然后在DWR配置文件中配置如下:

   <create creator="new" javascript="ItemsBean"> 
      <param name="class" value="com.asiainfo.gp.bean.ItemsBean"/> 
    </create> 

3.在JSP页面首先引入:

   <script src="/webroot/dwr/interface/ItemsBean.js"></script>
  <script src="/webroot/dwr/engine.js"></script> 
  <script src="/webroot/dwr/util.js"></script> 

页面的JS代码:

       //得到省份列表的function
        function getProvList() 
	{ 
	       ItemsBean.provList(createProvList); //调用JAVA类中的provList方法
	} 
       //回调函数
	function createProvList(data) 
	{ 
	    DWRUtil.removeAllOptions("provid"); //清除原来的数据
	    DWRUtil.addOptions("provid", data); //省份下拉框中填入省份数据
	    if(defaultProvid != null && defaultProvid != "" && defaultProvid != "0")
	    DWRUtil.setValue('provid', defaultProvid);//设置默认的省份值
	} 
	//得到城市列表的funtion
	function getCityList() 
	{ 
	       var provid = DWRUtil.getValue("provid");
	       if(provid == null || provid == "")
	       provid = defaultProvid;//取选中的省份ID
	       ItemsBean.cityList(provid, createCityList); //根据省份ID取城市列表
	} 
       //回调函数
	function createCityList(data) 
	{ 
	    DWRUtil.removeAllOptions("cityid"); //清除下拉框中原有的城市数据
	    DWRUtil.addOptions("cityid", data); //城市下拉框中天数城市数据
	} 

页面的下拉框写法:

 <tr>
	<td  class="info_title">
	公司所在省份
	</td>
        <td class="info_message">
       <select name="provCode" id="provid" onchange="javascript:update2();"></select>  
	</td>
	<td  class="info_title">
    	公司所在地市
    	</td>
    	<td  class="info_message">
    	  <select name="cityId" id="cityid"></select> 
    	</td>
				
</tr>

 


现象: DWR 在TOMCAT5.5.20上可以正常运行,而在TOMCAT5.0.30上提示以下错误: DefaultConfiguration.info(51) | Creator 'pageflow' not loaded due to ClassNotFoundException. This is only an problem if you wanted to use it. Cause: Beehive/Weblogic Creator not available.

处理方法: 1) put the xalan.jar in the endorsed folder for tomcat 2) use the following jvm args: -Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

 


ransformerFactoryConfigurationError 这个问题的现象是在启动有DWR的Web应用时出现如下stack trace:

root cause
javax.xml.transform.TransformerFactoryConfigurationError:
  Provider org.apache.xalan.processor.TransformerFactoryImpl not found
       javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
这个问题和DWR没有什么关系,那是因为Tomcat没有配置好。比较简单的解决办法是下载Xalan替换掉$TOMCAT-HOME/common/lib目录下的xalan.jar文件。DWR2.0能更好的处理这个问题,但是本质的问题还是因为DWR的XML序列化需要有XSLT解析器的支持。

如果你用JDK5还是有这个问题的话,你可以增加以下VM参数来使Tomcat正常工作。

-Djavax.xml.transform.TransformerFactory=
   com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值