<param
DWR 學習筆記
DWR 學習筆記
內容目錄
1.簡介
2.環境搭建與配置
3.DWR配置文件
4.Servlet參數傳遞
5.與公司框架結合的問題
6.配置選項
7.DWRUtil
1. 簡介
DWR 是Direct Web Remoting 的簡稱.可以通過腳本直接調用java方法.
和其他代理框架相比,DWR後臺嚴格限制必須以java爲後臺.
有相當完善的文檔支持
2. 環境搭建與配置
1. 從 http://getahead.ltd.uk/dwr/ 下載dwr.jar
2. web.xml 文件中 DWR Servlet的配置
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
uk.ltd.getahead.dwr.DWRServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
DWRServlet 的 debug參數的選項:
1.true : 可以通過我們就可以http://server:port/webapp/dwr/ 查看,當前有哪些類可以供javascript調用
2.false :部屬到實際應用時記得要設置爲false
3. 編寫後臺的java類
package com.rbi.stady;
public class DwrTestServiceImpl {
public String getMessage(String name){
return "Hello "+name;
}
}
4. DWR配置文件
默認文件: WEB-INF/下的dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="dwrTest">
<param name="class" value="com.rbi.stady.DwrTestServiceImpl" />
</create>
</allow>
</dwr>
5. HTML添加DWR的js和自動生成的後臺代碼
1.<script type="text/javascript"
src="<%=request.getContextPath()%>/dwr/engine.js"></script>
2.<scripttype="text/javascript" src="<%=request.getContextPath()%>/dwr/interface/dwrTest.js"></script>
6. js的調用
dwrTest.getMessage(‘Jack’,getDataFun)
function getDataFun(data){
…………
}
3. DWR配置文件
1. 類的配置:
1.遠程調用類的配置
<create creator="new" javascript="dwrTest" scope="request">
<param name="class" value="com.rbi.stady.DwrTestServiceImpl" />
<include method="checkUser" />
<!--<exclude method="..."/>-->
</create>
<create>標籤:
creator (必須項)值範圍:new,spring,scripted
1.1x 版本後新增 none, jsf,struts,pageflow
scope (可選項)值範圍 : "application", "session"(*1), "request" 和"page"。默認page
<param>標籤:
<create>標籤爲”new”時值爲“class” value值爲類路徑
“spring”時值爲“beanName” value值爲bean的配置名稱
<include>和<exclude>標籤:method=”方法名”
有此標籤或二者選其一
無: 所有方法都可訪問
<include>:此列表的方法可訪問,不在其內的不可訪問
<exclude>:此列表的方法不可訪問,不在其內的可訪問
安全上比較好的設計是使用" include "而不是" exclude"。
2.Bean的配置
<convert
converter="bean"
match="example.Fred"/>
<param
<param
name="include"
value="property1, property2"/>
<!--<param
name="exclude"
value="property1, property2"/> -->
</convert>
<param>標籤設定限制屬性同方法只不過用逗號隔開.
如果要允許轉換一個包或者子包下面的所有類,可以這樣寫:
<convert converter="bean" match="your.full.package.*"/>
顯而易見,這樣寫是允許轉換所有的JavaBean:
<convert converter="bean" match="*"/>
2. 返回的變量:
1. 基本的類型:
boolean, byte, short, int, long, float, double, char, java.lang.Boolean, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Character, java.math.BigInteger, java.math.BigDecimal 和 java.lang.String
2. 日期類型:與javascript裏的Date對應.包括: java.util.Date, java.sql.Date, java.sql.Times or java.sql.Timestamp
3. 自定義的Bean
<convert converter="bean" match="com.rbi.entity.User"/>
4. List,Set類型.
返回客戶端爲數組.若返回的爲對象數組,該對象必須在配置文件中有定義Bean
5. Map 類型.
返回的類型如同對象
如: 服務器 返回的Map內容如下:Map map = new HashMap();
map.put(“no1”,user1);map.put(“no2”,user2);
客戶端js對取得的data取內容裏的值:
var data1 = data[‘no1’]; var data2 = data.no2;
6. 返回void類型時回調函數無參數
3. 傳入參數:
1. 基本類與日期型自定義Bean同上.
2. List,Set類型
Bean的屬性還是,遠程調用類的方法都要通過<signatures>標籤,有其他的參數要有逗號隔開
<signatures>
<![CDATA[
import java.util.List;
import com.rbi.stady.DwrTestServiceImpl;
import com.rbi.entity.User;
import com.rbi.entity.Address;
DwrTestServiceImpl
.getUsersNames(List<User>);
User.setAddresses(List<Address>);
]]>
</signatures>
4. Servlet參數傳遞
做web應用的時候,常常要取得用戶身份,或者取得一些Servlet上下文變量和應用環境等. 我們通常獲取ServletContext,request, response等來取得這些值。DWR提供了兩個辦法解決這些問題
1、使用DWR的一個靜態的API,不推薦。
2. DWR會自動注入這些servlet變量,這些變量只包括以下的五個:
HttpServletRequest
HttpServletResponse
HttpSession
ServletContext
ServletConfig
5. 與公司框架結合的問題
1. Spring 與 struts 集成的方式
方法1
1.1. 通過struts 配置文件的 plug-in 初始化spring實例
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property
property="contextConfigLocation" value="/../application-….xml " />
</plug-in>
1.2. 兩種方式配置action
(a). action 繼承 org.springframework.web.struts.DispatchActionSupport
配置文件採用struts的配置方式.通過getWebApplicationContext()方法取得 WebApplicationContext 再通過WebApplicationContext方法
getBean(“beanName”);
(b)action繼承
org.springframework.web.struts.ActionSupport
配置文件採用spring的配置方式.
<bean name=”/actionName.do”
class=” package.className”>
<property name=”propertyName”>
<ref bean=”springBeanName”/>
</property>
</bean>
方法2
2.1 通過web.xml初始化spring實例
<servlet>
<servlet-name>context</servlet-name>
<servlet-class> org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
或
<listener>
<listener-class>
org.springframework.web.context
.ContextLoaderListener
</listener-class>
</listener>
配置context-param
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/…/application-….xml,
</param-value>
</context-param>
2.2 action 繼承
org.springframework.web.struts.DispatchActionSupport
2. 公司項目採用的方式: 方法1à 1.1+1.2(a)
問題 : 通過 plug-in 標籤的方式,在其他監聽器,過濾器的訪問成問題
dwr 配置spring Bean無法生成
解決辦法:採取 方法 2.1+1.2(a)
6. engine.js
1.超時的處理(設置的單位爲豪秒):
a.全局的設置: DWREngine.setTimeout(1000);默認爲0,爲0時就是超時不處理
b.單個遠程調用的設置:
remoteClass
. Method (參數,{callback:jsfun,timeout:100000})
2.錯誤的處理:
a. 全局的設置:DWREngine.setErrorHandler(jsfun);
b. remoteClass
.method(參數, {
callback: jsfun,
errorHandler:function(errorString, exception) { ... }
});
3.批量的處理:
一次性提交到服務器
DWREngine.beginBatch();
remoteClass1.method (參數, jsfun);
remoteClass2.method (參數, jsfun);
DWREngine.endBatch();
4. 異步調用:
DWREngine.setOrdered(boolean)默認爲false;
嚴格按照發送的順序返回。DWR在舊的請求安全返回以後纔去發送新的請求。把這個設置爲true會減慢你的應用程序,如果一個消息丟失,瀏覽器就會沒有響應。
5. 請求前處理
DWREngine.setPreHook(jsfun)
在DWR調用之前設置執行一個函數(但是這個函數無參數)例如讓按鈕不可用.
6. 請求後處理
DWREngine.setPostHook(jsfun) 在DWR調用之後要執行的函數.如按鈕可用.
7. DWRUtil
8. 備註
1. DWR和HttpSessionBindingListeners
DWR1.x中存貯已經創造的Bean的方法需要注意,它在每次請求時都會調用相同的 setAttribute()方法。就是說,如果一個Bean在dwr.xml中的聲明週期設置爲session,再每次調用bean中的方法時,DWR都會執行一次 session.setAttribute(yourBean)。這看上去沒有什麼危害,但是如果你要使用servlet的事件機制的,就是說用了HttpSessionBindingListener接口,你就會發現valueBound和valueUnbound事件在每次調用時都會發生,而不是你想像的在bean被創建時以及session過期時。
DWR2 只在第一次創建對象時調用 setAttribute()。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.