DWR使用經驗

2008-02-28
目前在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" οnchange="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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章