簡介:
DWR可以幫助開發(fā)人員完成應(yīng)用AJAX技術(shù)的web程序,它可以讓瀏覽器上的javascript方法調(diào)用運(yùn)行在web服務(wù)器上java方法。
DWR主要由兩部門組成。javascript與web服務(wù)器通信并更新web頁;運(yùn)行在web服務(wù)器的Servlet處理請求并把響應(yīng)發(fā)回瀏覽器。
DWR采用新穎的方法實(shí)現(xiàn)了AJAX(本來也沒有確切的定義),在java代碼基礎(chǔ)上動態(tài)的生成javascript代碼。web開發(fā)者可以直接調(diào)用這些javascript代碼,然而真正的代碼是運(yùn)行在web服務(wù)器上的java code。出與安全考慮,開發(fā)者必須配置哪些java class暴露給DWR.(dwr.xml)
DWR不認(rèn)為瀏覽器和web服務(wù)器之間協(xié)議重要,把系統(tǒng)界面放在首位。最大挑戰(zhàn)是java method call的同步特征與ajax異步特性之間的矛盾。在異步模型里,結(jié)果只有在方法結(jié)束后才有效。DWR解決了這個問題,把回調(diào)函數(shù)當(dāng)成參數(shù)傳給方法,處理完成后,自動調(diào)用回調(diào)方法。
配置:
- 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>false</param-value>
</init-param>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
- dwr.xml:<?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="spring" javascript="main_MenuCatalogDWR" scope="page">
<param name="beanName" value="/main/MenuCatalogDWR"/>
</create>
<create creator="spring" javascript="main_TreeDWR" scope="page">
<param name="beanName" value="/main/TreeDWR"/>
</create>
<create creator="spring" javascript="main_OperateFilterDWR" scope="page">
<param name="beanName" value="/main/OperateFilterDWR"/>
</create>
<create creator="spring" javascript="main_RightTreeDWR" scope="page">
<param name="beanName" value="/main/RightTreeDWR"/>
</create>
<convert converter="dom4j" match="org.directwebremoting.convert.DOM4JConverter">
</convert>
<convert converter="dom" match="org.directwebremoting.convert.DOMConverter">
</convert>
</allow>
</dwr>
3.jsp頁面設(shè)置:
//以下兩行是dwr所必需的
<script type='text/javascript' src="<c:url value='/dwr/engine.js'/>"></script>
<script type='text/javascript' src="<c:url value='/dwr/util.js'/>"></script>
<script type='text/javascript' src="<c:url value='/dwr/interface/main_MenuCatalogDWR.js'/>"></script>
說明:<script type='text/javascript' src="<c:url value='/dwr/engine.js'/>"></script>
<script type='text/javascript' src="<c:url value='/dwr/util.js'/>"></script> 是dwr所必需的
<script type='text/javascript' src="<c:url value='/dwr/interface/main_MenuCatalogDWR.js'/>"></script>主要作用是:
dwr/interface/這種請求到來,(如上面的<script type='text/javascript' src="<c:url value='/dwr/interface/main_MenuCatalogDWR.js'/>"></script>)DWR做一件偉大的事。把我們在WEB-INF/dwr.xml中的
<create creator="spring" javascript="main_MenuCatalogDWR" scope="page">
<param name="beanName" value="/main/MenuCatalogDWR"/>
</create>轉(zhuǎn)化為javascript函數(shù)。
4.beanName配置(本項(xiàng)目spring配置文件為action-servlet.xml)
<bean name="/main/MenuCatalogDWR" class="com.icsshs.webapp.main.MenuCatalogDWR" singleton="false">
<property name="hsRoleRightManager">
<ref bean="hsRoleRightManager"/>
</property>
</bean>
5.jsp頁面調(diào)用:
function menucatalog(){
main_MenuCatalogDWR.execute("",callbackok);
}
function callbackok(data){
var root0=data.documentElement;
if (root0.childNodes.length>0){
if (root0.childNodes(0).childNodes.length==0) return;
$("mainmenu").innerHTML=root0.childNodes(0).childNodes(0).text;
key=root0.childNodes(1).childNodes(0).text;
if (parent.frames.leftFrame.document.readyState == "complete"){
setmenuclick(key);
}else{
setTimeout("setmenuclick('"+key+"')",500);
}
}
}
說明:callbackok為回調(diào)函數(shù),data為dwr返回的結(jié)果集