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