浏览 1758 次
锁定老帖子 主题:DWR介绍
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-17
最后修改:2010-10-16
DWR的设计构思很是巧妙。 第一、把java类转化为javascript类由dwr自动完成,只需简单的配置。 第二、应用起来极其简单。开发者不要该服务器代码就可以集成。 第三、容易测试。和webwork一样,隐藏的http协议。 第四、及强扩展性。例如与spring集成,只需修改一点代码。 第五、性能。就我与jason,等简单比较,dwr性能可能是最好的。 第六、自动把java对象转化为javascript对象,并且及易扩展 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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |