認識DWR


Direct Web Remoting 

DWR的官網:http://directwebremoting.org/dwr/index.html

什么是DWR?  DWR是一個Java庫,使服務器上的Java和JavaScript的瀏覽器進行交互和相互調用盡可能簡單。

  DWR 是一個可以允許你去創建 AJAX WEB 站點的 JAVA 開源庫。它可以讓你在瀏覽器中的 Javascript 代碼調用 Web 服務器上的 Java 代碼,就像在 Java 代碼就在瀏覽器中一樣。

DWR 包含 2 個主要部分:

  •一個運行在服務器端的 Java Servlet,它處理請求並且向瀏覽器發回響應。

  •運行在瀏覽器端的 JavaScript,它發送請求而且還能動態更新網頁。

DWR 工作原理:

  是通過動態把 Java 類生成為 Javascript。它的代碼就像 Ajax 魔法一樣,你感覺調用就像發生在瀏覽器端,但是實際上代碼調用發生在服務器端,DWR 負責數據的傳遞和轉換。這種從 Java 到JavaScript的遠程調用功能的方式使DWR用起來有種非常像RMI或者SOAP的常規RPC機制,而且DWR的優點在於不需要任何的網頁瀏覽器插件就能運行在網頁上。

  Java 從根本上講是同步機制,然而 AJAX 卻是異步的。所以你調用遠程方法時,當數據已經從網絡上返回的時候,你要提供有反調 (callback) 功能的 DWR。

 

 

 

 

  DWR 動態在 JavaScript 里生成一個 AjaxService 類,去匹配服務氣端的代碼。eventHandler 去調用它,然后 DWR 處理所有的遠程細節,包括倒置 (converting) 所有的參數以及返回 Javascript 和 Java 之的值。在示例中,先在 eventHandler 方法里調用 AjaxService 的 getOptions() 方法,然后通過反調 (callback)方法 populateList(data) 得到返回的數據,其中 data 就是 String[]{"1", "2", "3"},最后再使用 DWR utility 把data 加入到下拉列表。

=======================================================

web.xml配置
1.主要配置
  要加入到你的 web.xml 最少的代碼就是簡單地去申明 DWR servlet,沒有它 DWR 就不起作用。
  有些額外的 servlet 參數,在有些地方很重要。

  尤其 debug 參數。這個擴展 DWR 的標准結構是使用<init-params>。
  

 1 <servlet>
 2       <servlet-name>dwr-invoker</servlet-name>
 3       <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
 4       <init-param>
 5           <param-name>debug</param-name>
 6           <param-value>true</param-value>
 7       </init-param>
 8  </servlet>
 9  <servlet-mapping>
10       <servlet-name>dwr-invoker</servlet-name>
11       <url-pattern>/dwr/*</url-pattern>
12  </servlet-mapping>

  在 DWR2.x 之后,DwrServlets 是類 org.directwebremoting.servlet.DwrServlet ,盡管uk.ltd.getahead.dwr.DWRServlet 仍然可以用。在 DWR 1.x 你不得不使用后者。

  另外,啟動服務時,如果報如下錯。 

java.lang.IllegalArgumentException: DefaultContainer can't find a classes

  是 DWR2.0 加入了 JDK5 的注釋(annotations).DwrServlet 初始化的時候會去檢查注釋的類,找不到就抱錯了。如果你不用 annotations 也可以忽略掉這個錯誤。不過看起來總是不爽。解決方案如下:

  

 1 <servlet>
 2     <servlet-name>dwr-invoker</servlet-name>
 3     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
 4     <init-param>
 5 
 6         <param-name>debug</param-name>
 7         <param-value>true</param-value>
 8     </init-param>
 9     <init-param>
10         <param-name>classes</param-name>
11         <param-value>java.lang.Object</param-value>
12     </init-param>
13 </servlet>                

===================================================

日志配置

  如果你正在使用 HttpServlet.log(), 以下的代碼用來控制 DWR 日志

  

1 <init-param>
2     <param-name>logLevel</param-name>
3     <param-value>DEBUG</param-value>
4 </init-param>

===================================================

多個 dwr.xml 配置和 J2EE 角色定義

  一般來說只需要一個 dwr.xml 文件,並且會被設為默認位置 WEB-INF/dwr.xml。所以你不需要配置。有 3 個原因說明你為何需要指定不同位置的 dwr.xml 文件:

  •你想保持 dwr.xml 的文件請參照下面的例子 

<param-value>WEB-INF/classes/com/yourco/dwr/dwr.xml</param-value>

  •你可以有很多的遠程方法類並且希望指定文件。在這個例子里將指定不同文件開始配置,不同的 param-name 將重復多次 DWR 將輪流讀取它們。

   •DWR 能夠使 J2EE URL 具有給與不同用戶組不同權限的安全機制。通過起不同名字,URL 和權限。

就像如下例子去使用 

1 <init-param>
2     <param-name>config*****</param-name>
3     <param-value>WEB-INF/dwr.xml</param-value>
4     <description>What config file do we use?</description>
5 </init-param>

用一個字符串”config” 作為開始,設置 param-name,每個 param-name 必須不同。

 1 <servlet>
 2     <servlet-name>dwr-user-invoker</servlet-name>
 3     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
 4     <init-param>
 5         <param-name>config-user</param-name>
 6         <param-value>WEB-INF/dwr-user.xml</param-value>
 7     </init-param>
 8 </servlet>
 9 <servlet>
10     <servlet-name>dwr-admin-invoker</servlet-name>
11     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
12     <init-param>
13         <param-name>config-admin</param-name>
14         <param-value>WEB-INF/dwr-admin.xml</param-value>
15     </init-param>
16 </servlet>
17 <servlet-mapping>
18     <servlet-name>dwr-admin-invoker</servlet-name>
19     <url-pattern>/dwradmin/*</url-pattern>
20 </servlet-mapping>
21 <servlet-mapping>
22     <servlet-name>dwr-user-invoker</servlet-name>
23     <url-pattern>/dwruser/*</url-pattern>
24 </servlet-mapping>
25 <security-constraint>
26     <display-name>dwr-admin</display-name>
27     <web-resource-collection>
28         <web-resource-name>dwr-admin-collection</web-resource-name>
29         <url-pattern>/dwradmin/*</url-pattern>
30     </web-resource-collection>
31     <auth-constraint>
32         <role-name>admin</role-name>
33     </auth-constraint>
34 </security-constraint>
35 <security-constraint>
36     <display-name>dwr-user</display-name>
37     <web-resource-collection>
38         <web-resource-name>dwr-user-collection</web-resource-name>
39         <url-pattern>/dwruser/*</url-pattern>
40     </web-resource-collection>
41     <auth-constraint>
42         <role-name>user</role-name>
43     </auth-constraint>
44 </security-constraint>

====================================================

插件配置

  大多數 DWR 的功能是可以作為插件的,所以就通過替換默認的類可以改變 DWR 的功能。你可以通過包含<init-param>去覆蓋默認的實現。舉個例子:

  

1 <init-param>
2     <param-name>
3         org.directwebremoting.extend.ServerLoadMonitor
4     </param-name>
5     <param-value>com.example.MyCustomServerLoadMonitor</param-value>
6 </init-param>    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM