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>