dwr基礎:原理,配置,使用,異常

DWR的原理:在安裝DWR時會在web.xml中配置一個servlet,這個servlet負責把前臺的JS參數封裝成JAVA,去調用你的JAVA類,然後將返回結果(JAVA類型)再翻譯成JS生成到你的JSP頁面上,給你的錯覺就是你用JS直接調用了JAVA方法
實際:JAVA類實現了js與java類之間的接口(DWR根據Java類來動態生成JavaScrip代碼,是不是有些像JSP是由servlet生成html頁面的方式)
DWR的作用:DWR是一個可以允許你去創建AJAX WEB站點的JAVA開源庫。它可以讓你在瀏覽器中的Javascript代碼調用Web服務器上的Java代碼,就像在Java代碼就在瀏覽器中一樣。還支持一個可選的commons-logging日記操作
DWR的安裝使用:
1、拷貝dwr.jar到項目的lib中
  2、配置web.xml,添加:
  <servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  <init-param>
  <param-name>debug</param-name>
  <param-value>true</param-value>
  </init-param>
  </servlet>
  <servlet-mapping>
  <servlet-name>dwr-invoker</servlet-name>
  <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
  3、新建dwr.xml,配置允許js調用的class
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE dwr PUBLIC
      "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
      "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
  <dwr>
  <allow>
  <create creator="new" javascript="Hello" scope="page">
  <param name="class" value="demo.Hello" />
  </create>
  </allow>
  </dwr>
  如果有自定義類型可以考慮添加下面的配置在<allow>中
  <convert converter="bean" match="x.y.Bean"/>
  現在你必須讓DWR知道通過XMLHttpRequest對象,什麼對象將會接收請求。這個任務由叫做dwr.xml的配置文件來完成。在配置文件中,定義了DWR允許你從網頁中調用的對象。從設計上講,DWR允許訪問所有公佈類的公共方法,但在我們的例子中,我們只允許訪問幾個方法。下面是我們示例的配置文件:
  <dwr>
  <allow>
  <convert converter="bean" match="com.yd.pojos.Userss"/>
  <create creator="new" javascript="userAction" class="com.yd.imp.UserCol"> <!--不建議class,應該使用param的方式-->
  <include method="getALlUser"/>
  </create>
  </allow>
  </dwr>
  上面的文件實現了我們例子中的兩個目標。首先,<convert>標記告訴DWR將com.yd.pojos.Userss對象的類型轉換爲聯合數組,因爲,出於安全的原因,DWR默認的不會轉換普通bean。第二,<create>標記讓DWR暴露出com.yd.imp.UserCol類給JavaScript調用;我們在頁面中使用JavaScript文件被javascript屬性定義。我們必須注意<include>標記,它指明瞭com.yd.imp.UserCol類的哪些方法可用。
  4、頁面添加:
  <script type="text/javascript" src="dwr/engine.js"></script>
  <script type="text/javascript" src="dwr/util.js"></script>
  <script type="text/javascript" src="dwr/interface/Hello.js"></script>
  說明:Hello.js 對應dwr.xml <create creator="new" javascript="Hello" scope="page">
  5、自行設計調用處理方法
  <script type="text/javascript">
  function callback(str)
  {
  alert(str);
  }
  function test()
  {
  Hello.sayHelloTo("zhangsan",callback);
  }
  </script>

其他擴展:
多dwr.xml文件的配置
可能有幾種情況,我們一一列舉。 一個servlet,多個dwr.xml配置文件;多個servlet,每個servlet對應一個或多個dwr.xml.
一個servlet,多個dwr.xml配置文件;

java代碼: <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-1</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>config-2</param-name>
<param-value>WEB-INF/dwr2.xml</param-value>
</init-param>
</servlet>

在這種配置下,param-name的值必須以config開頭。param-name可以有>=0個。如果沒有param-name,那麼將會讀取 WEB-INF/dwr.xml。如果有大於零個param-name,那麼WEB-INF/dwr.xml文件將不會被讀取。

多個servlet,每個servlet對應一個或多個dwr.xml

java代碼: <servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<!--用classes/dwr.xml-->
</servlet>
<servlet>
<servlet-name>dwr-invoker1</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker1</servlet-name>
<url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>

在這種情況下,我們可以根據J2EE security來控制權限,針對不同url,加不同的角色。

 

eclipse中工具自動提示的使用:
  所有文件都含有如下表頭。
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE dwr PUBLIC
      "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
      "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
  所做操作爲。1,找到表頭中的"http://www.getahead.ltd.uk/dwr/dwr20.dtd",
    2,在dwr.jar包中將對應的dwr20.dtd文件找到,並解壓到eclipse文件

eclipse\dwr\org\directwebremoting\dwr20.dtd下(僅作提示的話無所謂放在什麼地方,爲了以

後的使用方便,我暫時放到eclipse工具中)
    3,window-->preferences-->XML-->XML Catalog-->Add,出現:
        location:填寫絕對路徑:D:\Program

Files\eclipse\dwr\org\directwebremoting\dwr20.dtd
        Key type:選擇uri
        key:填寫http://www.getahead.ltd.uk/dwr/dwr20.dtd
,然後點擊ok。

問題1:
DWR Could not initialize class org.directwebremoting.servlet.PlainPollHandler 解決 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
Could not initialize class org.directwebremoting.servlet.PlainPollHandler

原因:在web.xml中配置了debug或其他日誌模式,但是沒導入相關包
缺少commons-logging.jar,加入到WEB-INF/lib中解決
問題2:
解決DWR異常 java.lang.SecurityException: No class by name:

有可能是引入的相應的JS文件,但是沒有在DWR.XML文件配置相應的類或是在create裏面加入class=''屬性,但是不是標準方式,因此報錯

即:
<dwr>
  <allow>
    <create creator="new" javascript="ProductAction">
      <param name="class" value="com.cooguo.appstore.server.action.ProductAction"/>
    </create>
  </allow>
 </dwr>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章