




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
如何開(kāi)始用DWR
有兩種方法開(kāi)始DWR,簡(jiǎn)單的方式是下載WAR文件然后看看。但是這不能幫你知道如何輕松的把DWR整合到你的
web應(yīng)用中,所以還是推薦你按照下面的3個(gè)步弊做:
1.安裝DWR的Jar包
卜,載dwr.jar文件之把它放到你的webapp的WEBTNF/lib目錄卜。那里可能已經(jīng)有很多其他的jar文件了。
2.編輯配置文件
需要把下面的代碼加到WEB-INF/web.xml文件中。〈servlet)那部分需要和其他的〈servlet)在一起,
<servlet-mapping)部分也一樣,
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<disp1a)^-name>DWRServlet</display-name>
<servlet-class>uk.ltd.getahead.dwr.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-naine>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
在WEB-1NF目錄下的web.xml旁邊創(chuàng)建?個(gè)dwr.xml文件??梢詮淖詈?jiǎn)單的配置開(kāi)始:
<!DOCTYPEdwrPUBLIC
Z,-//GetAheadLimited//DTDDirectWebRemoting1.0〃EN〃
“http:〃www.gctahcad.ltd.uk/dwr/dwr10.dtd”>
<dwr>
<allow>
<createcreator—new”javascript=,,JDatc,>
<paramname="class”value="java.util.Date”/)
</create>
<createcreator="new"javascript="Demo”>
<paramname="class”valueiyour.java.Bean,7>
</create>
</allow>
</dwr>
DWR配置文件定義了那些DWR會(huì)創(chuàng)建提供遠(yuǎn)程調(diào)用的Javascript類(lèi)。在上面的例子中我們定義了兩個(gè)類(lèi)來(lái)提供遠(yuǎn)
程調(diào)用,并為其提供的Javascript類(lèi)的名字。
在上面我們使用了new創(chuàng)建器,它會(huì)調(diào)用沒(méi)有參數(shù)的構(gòu)造函數(shù)來(lái)創(chuàng)建實(shí)例,但是所有JavaBean必須有這一構(gòu)造
函數(shù)。還要注意DWR有一些限制:
小
不要出現(xiàn)Javascript保留關(guān)鍵字:和保留關(guān)鍵字同名的函數(shù)指定被排除。多數(shù)
Javascript的關(guān)鍵字和Java是相同的。所以你不可能有一個(gè)方法叫做"try。,但是
該死"delete。”對(duì)與Javascript有著特殊意義,而對(duì)Java則不是。
Javascript方法重載是不支持的,所以盡量不要再Java中使用。
3.訪(fǎng)問(wèn)下面的URL
http://IocaIhost:8080/[YOUR-WEBAPP]/dwr/
你可以看見(jiàn)?個(gè)頁(yè)面,里面有第二步中的類(lèi)。接著往里點(diǎn),你會(huì)看到所有可以調(diào)用的方法列發(fā)。這個(gè)頁(yè)面是動(dòng)態(tài)
生成用來(lái)測(cè)試的例子。
自己動(dòng)手試一下!
怎么在你的web應(yīng)用中使用
在文檔中有很多例子演示如何動(dòng)態(tài)更改頁(yè)面中的文字、更新列表、操作表單,還有直接更改table中的內(nèi)容。每
一個(gè)都有如何實(shí)現(xiàn)的介紹。
另一種方式是看剛才的頁(yè)面中提供的代碼:
到http://localhost:8080/\[vOUR-WEBAPP\]/dwr/頁(yè)面,點(diǎn)擊你的類(lèi)。查看源碼,找到執(zhí)行方法的那幾行,把
那些文字粘貼到你的HTML或JSE中。
要包括下面這些能產(chǎn)生神奇效果的Javascript文件的鋅接。
<script
src='/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRTPT].js*></script>
<scriptsrc=,/[YOUR-WEBAPP]/dwr/engine.js*></script>
你也可以把其中/[YOUR-WEBAPP:/替換成你的web頁(yè)面的相對(duì)路徑。
DWR根據(jù)dwr.xml生成和Java代碼類(lèi)似的Javascript代碼。
相對(duì)而言Java同步調(diào)用,創(chuàng)建與Java代碼匹配的Ajax遠(yuǎn)程調(diào)用接口的最大挑戰(zhàn)來(lái)至與實(shí)現(xiàn)Ajax的異步調(diào)用特
性。
DWR通過(guò)引入回調(diào)函數(shù)來(lái)解決這個(gè)問(wèn)題,當(dāng)結(jié)果被返回時(shí),DWR會(huì)調(diào)月這個(gè)函數(shù)。
有兩種推薦的方式來(lái)使用DWR實(shí)現(xiàn)遠(yuǎn)程方法調(diào)用。可以通過(guò)把回調(diào)函數(shù)放在參數(shù)列表里,也可以把I可調(diào)函數(shù)放到
元數(shù)據(jù)對(duì)象里。
當(dāng)然也可以把回調(diào)函數(shù)做為第一個(gè)參數(shù),但是不建議使用這種方法。因?yàn)檫@種方法在處理自動(dòng)處理http對(duì)象時(shí)(查
看"AllernativeMelhod")上會(huì)有問(wèn)題。這個(gè)方法主要是為向下兼容而存在的。
簡(jiǎn)單的回調(diào)函數(shù)
假設(shè)你有一個(gè)這樣的Java方法:
publicclassRemote{
publicStringgetData(intindex){...}
}
我們可以在Javascript中這樣使用:
<scripttype=〃texl/javascript”
src^^[WEBAPP]/dwr/interface/Remote.js,z></script>
<scripttype="text/javascript”
src=,/FWEBAPPl/dwr/engine.js,z></script>
???
functionhandleGetData(str){
alert(str);
)
Remote.getData(42,handleGetData);
42是Java方法getDataO的一個(gè)參數(shù)。
此外你也可以使用這種覆縮格式:
Remote.getData(42,function(str){alert(str);});
調(diào)用元數(shù)據(jù)對(duì)象(Meta-Data)
另外一種語(yǔ)法時(shí)使用"調(diào)用元數(shù)據(jù)對(duì)象”來(lái)指定【可調(diào)函數(shù)和其他的選項(xiàng)。上面的例子可以寫(xiě)成這樣:
Remote.getData(42,{
callback:function(str){alert(str);}
});
這種方法有很多優(yōu)點(diǎn):易于閱讀,更重要的指定額外的調(diào)用選項(xiàng)。
超時(shí)和錯(cuò)誤處理
在回調(diào)函數(shù)的元數(shù)據(jù)中你可以指定超時(shí)和錯(cuò)誤的處理方式。例如:
Remote.getData(42,{
calIback:function(str){alert(str);),
timeout:5000,
errorHandler:function(message){alert(''Oops:"+message);)
});
查找回調(diào)函數(shù)
有些情況下我們很難區(qū)分各種回調(diào)選項(xiàng)(記住,Javascript是不支持函數(shù)市載的)。例如:
Remote.method({timeout:3},{errorHandler:somefunc});
這兩個(gè)參數(shù)之一是bean的參數(shù),另一個(gè)是元數(shù)據(jù)對(duì)象,但是我們不能清楚的告訴DWR哪個(gè)是哪個(gè)。為了可以跨
瀏覽器,我們假定null==undefined。所以當(dāng)前的情況,規(guī)則是:
?如果第?個(gè)或最后?個(gè)是?個(gè)函數(shù),那么它就是回調(diào)函數(shù),沒(méi)有元數(shù)據(jù)對(duì)象,并且其他參數(shù)都是Java
的方法參數(shù)。
?另外,如果最后一個(gè)參數(shù)是一個(gè)對(duì)象,這個(gè)對(duì)象中有一個(gè)calIback成員,并且它是個(gè)函數(shù),那么這個(gè)
對(duì)象就是元數(shù)據(jù)對(duì)象,其他的都是Java方法參數(shù)。
?另外,如果第一個(gè)參數(shù)是null,我們就假設(shè)沒(méi)有回調(diào)函數(shù),并且其他的都是Java方法參數(shù)。盡管如
此,我們會(huì)檢杳最后一個(gè)參數(shù)是不是null,如果是就發(fā)出警告。
?最后如果最后一個(gè)參數(shù)是null,那么就沒(méi)有callback函裝。
?另外,發(fā)出錯(cuò)誤信號(hào)拈個(gè)糟糕的請(qǐng)求格式。
創(chuàng)造一個(gè)與Java對(duì)象匹配的Javascript對(duì)象
假設(shè)你有這樣的Java方法:
publicclassRemote(
publicvoidsetPerson(Personp){
this.person=p;
)
)
Person對(duì)象的結(jié)構(gòu)是這樣的:
publicPerson{
privateStringname;
privateintage;
privateDate[]appointments;
//gettersandsetters
)
那么你可以在Javascript中這樣寫(xiě):
varp={
name:^FredBloggs”,
age:42,
appointments:[newDate(),newDate(z,lJan2008〃)]
);
Remote.setPerson(p);
在Javascript沒(méi)有出現(xiàn)的字段,在Java中就不會(huì)被設(shè)置。
因?yàn)閟etter都是返回'void',我們就不相要使用callback函數(shù)了。如果你想要一個(gè)返同void的服務(wù)端方法的
完整版,你也可以加上callback函數(shù)。很明顯DWR不會(huì)向它傳遞任何參數(shù)。
TransformerFactoryConfigurationError
這個(gè)問(wèn)題的現(xiàn)象是在啟動(dòng)有DWR的譚eb應(yīng)用時(shí)出現(xiàn)如下slacktrace
rootcause
javax.xml.transform.TransformerFactoryConfigurationError:
Providerorg.apache,xalan.processor.TransformerFactorylmplnot
found
javax.xml.transform.TransformerFactory.newlnstance(Unknown
Source)
這個(gè)問(wèn)題和DWR沒(méi)有什么關(guān)系,那是因?yàn)門(mén)omcat沒(méi)有配置好。比較簡(jiǎn)單的解決辦法是下載Xalan替換掉
STOMCAT-IIOME/common/lib目錄下的xalan.jar文件。【州R2.0能更好的處理這個(gè)問(wèn)題,但是本質(zhì)的問(wèn)題還是因?yàn)?/p>
DWR的XML序列化需要有XSLT解析器的支持。
如果你用JDK5還是有這個(gè)問(wèn)題的話(huà),你可以增加以卜.VM參數(shù)來(lái)使Tomcat正常工作。
-Djavax.xml.transform.TransformerFactory=
com.sun.org.apache,xalan.internal,xsltc.trax.TransformerFactoryI
mpl
XML解析錯(cuò)誤
在剛開(kāi)始用DWR的時(shí)候經(jīng)常遇到的?個(gè)錯(cuò)誤就是XML解析錯(cuò)誤。其實(shí)這和DWR沒(méi)有■多大關(guān)系,主要是因?yàn)門(mén)omcat
里面自帶的Xerces的問(wèn)題,要不是該有的時(shí)候沒(méi)有,要不是不該有的時(shí)候有了。
?JDK1.3白身沒(méi)有XML解析器,所以你需要xcrccshupl.jar和xiiilyis.jar.
?JDK1.4.0和JDK1.4.1雖然有了XML解析器,但是有很多bug,所以你還是需要把xerceslmpl.jar
放至ljLomcat\conmon\endorsed目錄下。
?JDK1.4.2和JDK5后帶的XML解析器工作的很好,你就不需要再加其他的了。
另外要提的一點(diǎn)是,不同版本的Tomcal需要的XML解析器不一樣。所以要注意檢查它和JDK的版本兼
容性。
用BEAWeblogic的Classpath問(wèn)題
Weblogic8.1(有可能其他版本同樣)可能找不到DWR的類(lèi)。
這大多出現(xiàn)在dwr.jar放在AP4INF目錄卜.(APP」NF/lib)的情況。在這種情況卜DWR依然可以工作,例如debug
頁(yè)面可以看見(jiàn),但是DWR找不到你的類(lèi)。
解決辦法是把dwr.jar放到WEB-INF/lib目錄下。
沒(méi)有cookies的情況下用DWR
當(dāng)不能用cookies時(shí),servlet規(guī)范通過(guò)CRL重寫(xiě)來(lái)支持HttpSession?DWR2.x通過(guò)它生成的URL來(lái)支持這項(xiàng)功
能。但是DWRLx沒(méi)有這個(gè)功能。你可以通過(guò)以下辦法讓DWR1.x也支持cookies:
?從dwr.jar中提取engine.js,保存到你的文件系統(tǒng)中,就像jsp文件一樣.
?修改"DW'REngine.sendDala=Junction(batch)方法,加入一行:
statslnfo十=“;jsessionid="+<%="'"+session.getld()+“'%>
這樣就可以讓DWR1.X支持url重寫(xiě)了。DWR2+默認(rèn)支持。
傳遞額外的數(shù)據(jù)到callback函數(shù)
通常我們需要傳遞額外的數(shù)據(jù)到callback函數(shù),但是因?yàn)樗械幕卣{(diào)函數(shù)都只有?個(gè)參數(shù)(遠(yuǎn)程方法的返回結(jié)
果3這就需要一些小技巧了。
解決方案就是使用Javascript的閉包以特性。
例如,你的回調(diào)函數(shù)原本需要像這個(gè)樣子:
functioncalIbackFunc(dataEromServer,dataFromBrowser){
//用dataFromServer和dataFromBrowser做些事情
)
那么你可以像這個(gè)組織你的函數(shù):
vardataFromBrowser=…;
//定義一個(gè)閉包函數(shù)來(lái)存儲(chǔ)dataFromBrowser的引用,并調(diào)用
dataFromServer
varcallbackProxy=function(dataFromServer){
calIbackFunc(dataFromServer,dataFromBrowser);
};
varcal1MetaData={cal1back:cal1backProxy};
Remote,method(params,cal1MetaData);
(調(diào)用元數(shù)據(jù)在腳本介紹中有?解蟀)
換句話(huà)說(shuō),現(xiàn)在你作為callback函數(shù)傳遞過(guò)來(lái)的不是一個(gè)真正的callback,他只是一個(gè)做為代理的閉包,用來(lái)
傳遞客戶(hù)端的數(shù)據(jù)。
你可以用更簡(jiǎn)介的形式:
vardataFromBrowser二…;
Remote,method(params,{
calIback:function(dataFromServer){
callbackl;unc(dataEromServer,dataFromBrowser);
}
});
服務(wù)器性能優(yōu)化
CPU瓶頸:經(jīng)過(guò)嚴(yán)格的測(cè)試DWR的性能沒(méi)什么問(wèn)題。DWR上性能消耗同web服務(wù)器和網(wǎng)絡(luò)比起來(lái)可以忽略不計(jì)。如
果你真的需耍提升DWR的性能的話(huà),可以把log級(jí)別設(shè)置ERROR或FATAL,但是土要還是耍看你的編碼情況。
Network瓶頸:DWR沒(méi)有管理你的瀏覽器緩存的功能,所以它會(huì)不斷的重復(fù)讀取DWR的javascript文件。這里有
一個(gè)簡(jiǎn)單的解決辦法,把javascript文件復(fù)制到你的wcb-app中,這樣web服務(wù)器就可以更好的利用它了。你
也可以考慮把所有的javascript文件合并成一個(gè)文件,然后用DOJO的壓縮程序用處理一個(gè)來(lái)節(jié)省流量。
我們可以做一個(gè)補(bǔ)丁,讓DWR在web-app啟動(dòng)的時(shí)候用時(shí)間做為javascript文件的時(shí)間戳,但是這個(gè)并不十分
重要,因?yàn)樯厦娴难a(bǔ)丁太簡(jiǎn)單了而且可以壓縮合并Javascript文件。
WEB-INF/web.xml參考手冊(cè)
在web.xml中最簡(jiǎn)單的配置就是簡(jiǎn)單加入DWR的servlet,沒(méi)有這個(gè)配置DWR就不會(huì)起作用:
<servlet>
<servlet-name>dwr-invoker</servlet-naine>
<servlet-class>uk.Itd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
〈servlet-mapping〉
<servlet-name>dwr-invoker</servlet-nanie>
<url-pattern>/dwr/*</url-pattern>
〈/servlet-mapping)
此外還可以加入一些重要和有一用的參數(shù)。
Logging
DWR可以工作在JDK1.3h,而JDK1.3不支持java.util,logging,但是我們想強(qiáng)迫任何人使用commons-logging
或者log4j,所以當(dāng)沒(méi)有l(wèi)ogging類(lèi)的時(shí)候DWR就使用HttpServlet.log。方法。盡管如此,如果DWR發(fā)現(xiàn)了
commons-logging,就是使用它,
Commons-Logging
幾乎每一個(gè)人都在使用commons-logging我因?yàn)榇蠖鄶?shù)的servlet容器在使用它。所以如果你的web應(yīng)用中沒(méi)
有明顯的加入commonsTogging包,它也會(huì)默認(rèn)的配置好。
在這種情況下,logging是由java,util,loggin爐或者12gll產(chǎn)配置文件控制的。詳細(xì)配置查看文檔。
HttpServlet.log()
如果你用HttpServlet.log(),下面的配置控制logging:
<init-param>
<param-name>1ogLeveK/param-name>
<param-value>DEBUG</param-value>
</init-param>
可用的值有:FATAL,ERROR,WARN(默認(rèn)),INFO和DEBUG.
多個(gè)dwr.xml文件和J2EE安全
一般來(lái)說(shuō),你只需要一個(gè)dwr.xnl文件,并且放置在默認(rèn)的位置:WEB-INF/dwr.xmlo如果那樣的話(huà),你可以不
用了解下面的配置。
有三個(gè)原因使你希望指定不同位置的dwr.xml文件。
?你希望讓dwr.xml文件和它能訪(fǎng)問(wèn)到的資源在一起。在這種情況下你需要一個(gè)這樣的配置:
<param-value>WEB-I^F/classes/com/yourco/dwr/dwr.xml\/param-value>o
?你有大量的遠(yuǎn)程調(diào)用類(lèi),希望把他們分成多個(gè)文件。在這種情況下你需要重復(fù)卜面的配置幾次,每一個(gè)
中有不同的param-name,并且以'config'開(kāi)頭。DNR會(huì)依次把他們都讀進(jìn)來(lái)。
?DWR可以使用Servlet規(guī)范的J2EE的URL安全機(jī)制來(lái)給不同的用戶(hù)不同的訪(fǎng)問(wèn)權(quán)限。你只需要簡(jiǎn)單的
定義多個(gè)dwrservlet,并且制定不同的名字,url和訪(fǎng)問(wèn)嘆限。
如果你希望使用這一功能.那么語(yǔ)法是這樣的:
<init-param>
<param-name>config*****</param-name>
<param-value>WEB-lNF/dwr.xml</param-value>
<description>Whatconfigfiledoweuse?</description>
</init-param>
在這里config*****意思是paramname要以字符串config開(kāi)頭。這個(gè)參數(shù)可以根據(jù)需要使用多次,但是不能相
同。
?個(gè)使用J2EE的安全機(jī)制的例子:
<servlet>
<servlet-name>dwr-user-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRScrvlet</servlet-class>
<init-param>
<param-name>config-user</param-name>
<param-value>WEB-INF/dwr-user.xml</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>dwr-admin-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-valuc>WEB-INF/dwr-admin.xml</param-va1uc>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-admin-invoker</servlet-name>
<url-pattern>/dwradmin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-user-invoker</servlet-name>
<url-pattern>/dwruser/*</url-pattern>
</servlet-mapping>
<security-constraint>
<display-name>dwr-admin</display-name)
<web-resource-collection>
<wcb-resourcc-name>dwr-adniin-collection</web-resource-name>
<url-pattern>/dwradmin/*</url-pattern>
〈/web-resource-collection)
<auth-constraint>
<role-name>admin</ro1e_name>
Gauth-constraint〉
</security-constraint>
<security-constraint>
<display-name>dwr-user</display-name>
<web-resource-col1ection>
<web-resource-name>dwr-user-collection</web-resource-name>
<url-pattern>/dwruser/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
使用插件(Plug-in)
DWR里的很多部件都是可插入的,所以可以通過(guò)替換掉DWR的默認(rèn)實(shí)現(xiàn)類(lèi)來(lái)改變其功能。你可以在<init-Param>
中的paratn-name中指定你要替換的接口,并在param-value中指定自己的接口實(shí)現(xiàn)類(lèi)。
可插入點(diǎn)是:
?uk.ltd.getahead.dwr.AccessControl
?uk.ltd.getahead.dwr.Configuration
?uk.Itd.gctahcad.dwr.ConverterManagcr
?uk.ltd.getahead.dwr.CreatorManager
?uk.ltd.getahead.dwr.Processor
?uk.ltd.getahead.dwr.ExecutionContext
這些可插入點(diǎn)默認(rèn)的實(shí)現(xiàn)都在uk.ltd.getahead.dwr.impl中。
使用debug/test模式
你可以通過(guò)下面的參數(shù)讓DWR進(jìn)入debug/test模式:
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
在debug模式里,DWR會(huì)為每?個(gè)遠(yuǎn)程調(diào)用類(lèi)生成?個(gè)測(cè)試頁(yè)面。這對(duì)于檢查DWR是否工作和工作的怎么樣站很
有用的。這個(gè)模式還可以警告你一些存在的問(wèn)題:javascript保留字問(wèn)題,或者函數(shù)重我問(wèn)題。
盡管如此,這個(gè)模式不應(yīng)該使用在實(shí)際部署環(huán)境里面,因?yàn)樗梢詾楣粽咛峁┠愕姆?wù)的大量信息。如果你的
網(wǎng)站設(shè)計(jì)的好的話(huà),這些信息不會(huì)耕助攻擊者窺視你的網(wǎng)站內(nèi)容,但是還是不要給任何人一個(gè)找到你錯(cuò)誤的機(jī)會(huì)
好。
DWR就是照上面的樣子做的,沒(méi)有任何保證,所以你的網(wǎng)站的安全是沐的責(zé)任。請(qǐng)小心。
配置DWR-dwr.xml
dwr.xml是DWR的配置文件。默認(rèn)情況下,應(yīng)該把它放到WEBIW目錄(web.xml的目錄)下。
DTD
這里還有?個(gè)dwr.xml對(duì)應(yīng)的DTD文檔演以及?個(gè)用DTDDo產(chǎn)生成的參考手冊(cè)勤
創(chuàng)建dwr.xml文件
dwr.xml文件的結(jié)構(gòu)如下:
<!D0CTYPEdwrPUBLIC
/z-//GetAheadLirnited//DTDDirectWebRemoving1.0〃EN〃
“http:〃www.getahead.Itcl.uk/dwr/dwrlO.dtd〃>
<dwr>
<!-initisonlyneededifyouareextendingDWR->
<init>
<creatorclass="..."/>
<converterid="…"class=
</init>
<!-withoutallow,DWRisn,tallowedtodoanything—>
<allow>
<createcreator—].."javascript=,\..?,/>
<convertconverter=〃…"match=〃…7>
</allow>
<!-youmayneedtotellDWRaboutmethodsignatures->
<signatures>
</signatures>
</dwr>
術(shù)語(yǔ)
這里是一些必須理解的術(shù)語(yǔ)-參數(shù)會(huì)被converted,遠(yuǎn)程Bean會(huì)被created。所以如果你有一個(gè)叫A的beam
它有一個(gè)方法叫A.blah(B)那么你需要一個(gè)A的creator和一個(gè)B的converter<.
<allow>
?!佣温淅锩娑x的試DWR可以創(chuàng)建和轉(zhuǎn)換的關(guān)。
Creators
我們要調(diào)用的每個(gè)類(lèi)都需要一個(gè)<create...>定義。creator有幾種。比較通用的是new關(guān)鍵字和Spring.更多
的信息可以參見(jiàn)[Crealers]文科。
Converters
我們必須保證所有的參數(shù)都可以被轉(zhuǎn)換。JDK中的多數(shù)類(lèi)型已經(jīng)有轉(zhuǎn)換器了,但是你需要給DWR轉(zhuǎn)換你的代碼的
權(quán)利。一般來(lái)說(shuō)Javaliean的參數(shù)需要一個(gè)〈convert...>定義。
默認(rèn)情況下,如下類(lèi)型不需要定義就可以轉(zhuǎn)換:
?所有的原生類(lèi)型boolean,ini,double,等等
?原生類(lèi)型的對(duì)象類(lèi)型Boolean,Integer,等等
?java.lang.String
?java.util.Date和SQL中的Date
以上類(lèi)型組成的數(shù)組
以上類(lèi)型的集合類(lèi)型(Lists,Sets,Maps,Iterators,等)
從DOM,XOM,JDOM和D0M4J中的DOM對(duì)象(類(lèi)似Eleraeni和Document)
要了解如何轉(zhuǎn)換你的JavaBean或者其他類(lèi)型的參數(shù)請(qǐng)查看Conveners文檔。
<init>
可選的init部分用來(lái)聲明創(chuàng)造bean的類(lèi)和轉(zhuǎn)換bean的類(lèi)。多數(shù)情況下你不需要用到他們。如果你需要定義一
個(gè)新的Creator[JavaDoca]和Converter[JavaDoca],那么你就需要在這里定義他們。但是建議你現(xiàn)檢查
-?下DWR是不是已經(jīng)支持了。
在init部分里有了定義只是告訴DWR這些擴(kuò)展類(lèi)的存在,給出了如何使用的信息。這時(shí)他們還沒(méi)布?被使用。這
中方式很像Java中的import語(yǔ)句。多數(shù)類(lèi)需要在使用前兆import一下,但是只有import語(yǔ)句并不表明這個(gè)類(lèi)
已經(jīng)被使用了。每一個(gè)creator和converter都用id屬性,以便后面使用。
Signatures〉
DWR使用反射來(lái)找出在轉(zhuǎn)換時(shí)應(yīng)該用那種類(lèi)型。有時(shí)類(lèi)型信息并不明確,這時(shí)你可以在這里寫(xiě)下方法的簽名來(lái)明
確類(lèi)型。詳細(xì)信息查看Signatures部分。
多個(gè)dwr.xml文件
可以有多個(gè)dwr.xnd文件(詳細(xì)卜息見(jiàn)web.xml文檔)。每個(gè)文件中的定義會(huì)被加在一起。DWR用這個(gè)功能來(lái)加載
基礎(chǔ)配置文件。我們可以看看標(biāo)準(zhǔn)被配置文件來(lái)了解dwr.xml的內(nèi)容。
轉(zhuǎn)換器
轉(zhuǎn)換器在客戶(hù)端和服務(wù)器之間轉(zhuǎn)換數(shù)據(jù).
下面這些轉(zhuǎn)換器有單獨(dú)章9.介紹
?ArrayConverter
?BeanandObjectConverters
?ColleciionConverter
?EnumConverter
?DOMObjects
?Hibernate整合
ServleiObjects(HttpServletRequest,HttpSession,etc)
基礎(chǔ)的轉(zhuǎn)換器
原生類(lèi)型,String,像BigDecimal這樣的簡(jiǎn)單對(duì)象的轉(zhuǎn)換器已經(jīng)有了。你不需要在dwr.xml中〈allow〉部分的
<corwert》中定義。它們默認(rèn)支持。
默認(rèn)支持的類(lèi)型包括: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
Date轉(zhuǎn)換器
Date轉(zhuǎn)換器負(fù)責(zé)在Javascript的Date類(lèi)型與Java中的Date類(lèi)型(java.util.Date,java.sql.Date,
java.sql.Timesorjava.sql.Timestamp)之間進(jìn)行轉(zhuǎn)換。同基礎(chǔ)的轉(zhuǎn)換器一樣,DateConverter默認(rèn)是支持的。
如果你右一個(gè)Javascript的字符串(例如~U1Jan20lU"),你想把它轉(zhuǎn)換成Java的Date類(lèi)型力兩個(gè)辦法:化
javascript中用Date,parse0衛(wèi)它解析成Date類(lèi)型,然后用DWR的DateConverter傳遞給服務(wù)器;或者把它作
為字符串傳遞給Server,再用Java中的SimploDateFormat(或者類(lèi)似的)來(lái)解析。
同樣,如果你有個(gè)Java的Dale類(lèi)型并且希望在HTML使用它。你可以先用SimpleDateFormat把它轉(zhuǎn)換成字符串
再使用。也可以直接傳Date給Javascript,然后用Javascript格式化。第一?種方式簡(jiǎn)單一些,盡管浪費(fèi)了你的
轉(zhuǎn)換器,而且這樣做也會(huì)是瀏覽器上的顯示邏輯受到限制。其實(shí)后面的方法更好,也有一些工具可以幫你,例如:
TheJavascriptToolboxDateformatte].
WebDevelopersNotesonDateformatting'
其他對(duì)象
其實(shí)創(chuàng)建自己的轉(zhuǎn)換器也很簡(jiǎn)單。Converter接口的Javadoc包含了帝息。其實(shí)這種需要很少出現(xiàn)。在你寫(xiě)自己
的Converter之前先看看BeanConverter,它有可能就是你要的。
TheCreators-創(chuàng)造器
dwr.xml文件中的create元素的結(jié)構(gòu)如下:
<allow>
<createcreator="…"javascript="…’scope=>
<paramname="…"value="…"/>
<authmethod="…"role=〃…〃/>
<excludemethod="…"/>
<includcmethod=〃…”/>
</create>
</allow>
這里的多數(shù)元素都是可選的你真正必須知道的是指定一個(gè)creator和一個(gè)javascript名字。
creator屬性是必須的?它用來(lái)指定使用那種創(chuàng)造器。
默認(rèn)情況下DWRL1有8種創(chuàng)造器。它們是:
?new:用Java的new關(guān)鍵字創(chuàng)造對(duì)象。
?none:它不創(chuàng)建對(duì)象,看下面的原因。(vl.1+)
?scripted:通過(guò)BSF使用腳本語(yǔ)言創(chuàng)建對(duì)象,例如BcanShell或Groovy。
?spri,:通過(guò)Spring框架訪(fǎng)問(wèn)Bean。
?jsf:使用JSF的Bean。(vl.1+)
?struts:使用Struts的FormBcan。(vl.1+)
?pageflow:訪(fǎng)問(wèn)Beehive或Weblogic的PageFlow。(vl.1+)
如果你需要寫(xiě)自己的創(chuàng)造器,你必須在init部分注冊(cè)它.
javascript屬性用于指定瀏覽器中這個(gè)被創(chuàng)造出來(lái)的對(duì)象的名字。你不能使用Javascripl的關(guān)漫字。
scope屬性非常類(lèi)似servlel規(guī)范中的scope。它允許你指定這個(gè)bean在什么生命范圍。選項(xiàng)有"applicalion",
"session","request"和"page"。這些值對(duì)于Servlet和JSP開(kāi)發(fā)者來(lái)說(shuō)應(yīng)該相當(dāng)熟悉了。
scope屬性是可選的。默認(rèn)是"page”。如果要使用"session”需要cookies。當(dāng)前的DWR不支持IXR重寫(xiě)。
param元素被用來(lái)指定創(chuàng)造器的其他參數(shù),每種構(gòu)造器各有不同。例如,"new”創(chuàng)造器需要知道要?jiǎng)?chuàng)建的對(duì)象類(lèi)
型是什么。每一個(gè)創(chuàng)造器的參數(shù)在各自的文檔中能找到。清查看上面的鏈接。
include和exclude元素允許創(chuàng)造器來(lái)限制類(lèi)中方法的訪(fǎng)問(wèn)。一個(gè)創(chuàng)造器必須指定include列表或exclude列表
之一。如果是include列衣則暗示默認(rèn)的訪(fǎng)問(wèn)策略是"拒絕";如果是exclude列表則暗示默認(rèn)的訪(fǎng)問(wèn)策略是"允
許"。
例如要拒絕防范除了se”?從左〃以外的所白方法,你應(yīng)該把如下內(nèi)容添加到dwr.xml中。
<createcreator="new"javascript="Fred"〉
<paramname="class"value="com.example.Fred,7>
<includemethod=,,setWibble,7>
</create>
對(duì)于加入到create元素中的類(lèi)的所有方法都是默認(rèn)可見(jiàn)的。
auth元素允訃你指定?個(gè)"匕匕的角色作為將來(lái)的訪(fǎng)問(wèn)控制檢宣:
<createcreator="new"javascript="Fred"〉
<paramname="class“value=,,com.example.Fred,7>
<authmethod="setWibble"role=,,admin,,/>
</create>
'none,創(chuàng)造器
'none'創(chuàng)造器不創(chuàng)建任何對(duì)象-它會(huì)假設(shè)你不需要?jiǎng)?chuàng)建對(duì)象。這有可能是對(duì)的,有兩個(gè)原因。
你可能在使用的scope不是"page"(看上面),并在在前面已經(jīng)把這個(gè)對(duì)象創(chuàng)建到這個(gè)scope中了,這時(shí)你就不需
要再創(chuàng)建對(duì)象了。
還有一種情況是要調(diào)用的方法是靜態(tài)的,這時(shí)也不需要?jiǎng)?chuàng)建對(duì)象。DWR會(huì)在調(diào)用創(chuàng)建器之前先檢查一下這個(gè)方法
是不是睜?wèi)B(tài)的。
對(duì)于上訴兩種情況,你仍然需要class參數(shù),用來(lái)告訴DWR它是在操作的對(duì)象類(lèi)型是什么。
使用靜態(tài)方法
DWR會(huì)在調(diào)用創(chuàng)建器之前先檢查一下這個(gè)方法是不是靜態(tài)的,如果是那么創(chuàng)造器不會(huì)被調(diào)用。很顯然這個(gè)邏輯適
用于所有創(chuàng)造據(jù),盡管如此"nu:l”創(chuàng)造器是最容易配置的。
適用單例類(lèi)
對(duì)于單例類(lèi)的創(chuàng)建,最好適用BeanShell和BSF來(lái)實(shí)例化對(duì)象。詳細(xì)信息參見(jiàn):Scripted'創(chuàng)造器
其他創(chuàng)造器
我么偶爾也需要一些新的創(chuàng)造器,最常見(jiàn)的是一個(gè)1-jbCreator.討論新的創(chuàng)造器的好地方是在郵件到因R
DWR和HttpSessionBindingListeners
DWRl.x中存貯已經(jīng)創(chuàng)造的Bean的方法需要注意,它在每次請(qǐng)求時(shí)都會(huì)調(diào)用相同的setAttribute0方法。就是
說(shuō),如果一個(gè)Bean在dwr.xml中的聲明周期設(shè)置為session,再每次調(diào)用bean中的方法時(shí),DWR都會(huì)執(zhí)行一次
session.setAttribute(yourBean)。這看上去沒(méi)有什么危害,但姑如果你要使用servlet的事件機(jī)制的,就是
說(shuō)用了HttpSessionBindingListener接口,你就會(huì)發(fā)現(xiàn)valueBound和valueUnbound事件在每次調(diào)用時(shí)都會(huì)發(fā)
生,而不是你想像的在bean被創(chuàng)建時(shí)以及session過(guò)期時(shí)。
DWR2只在第一次創(chuàng)建對(duì)象時(shí)調(diào)用setAttribute0。
dwr.xml中的簽名(Signatures)
signatures段使IWR能確定集合中存放的數(shù)據(jù)類(lèi)型。例如下面的定義中我們無(wú)法知道list中存放的是什么類(lèi)型。
publicclassCheck
(
publicvoidsetLotteryResults(Listnos)
signatures段允許我們暗示DWR應(yīng)該用什么類(lèi)型去處理。格式對(duì)以了解JDK5的泛型的人來(lái)說(shuō)很容易理解。
〈signatures)
<![CDATA[
importjava.util.List;
importcom.example.Check;
Check.setLotteryResults(List<Integcr>nos);
]]>
</signatures>
DWR中又一個(gè)解析器專(zhuān)門(mén)來(lái)做這件事,所以即使你的環(huán)境時(shí)JDKL3“R也能正常工作。
解析規(guī)則基本上會(huì)和你預(yù)想規(guī)則的一樣(有兩個(gè)例外),所以java.lang下面的類(lèi)型會(huì)被默認(rèn)importo
第一個(gè)是DWR1.0中解析器的bug,某些環(huán)境下不能返回正確類(lèi)型。所以你也不用管它了。
第二個(gè)是這個(gè)解析相時(shí)"陽(yáng)光(sunnyday)”解析器。就是說(shuō)它非常寬檜,不想編譯器那樣嚴(yán)格的保證你一定正確。
所以有時(shí)它也會(huì)允許你丟失import:
<signatures>
<![CDATA[
importjava.util.List;
Check.setLotteryResults(List<lnteger>);
]]>
</signatures>
將來(lái)的DWR版本會(huì)使用一個(gè)更正式的解析器,這個(gè)編譯器會(huì)基于官方Java定義,所以你最好不要使用太多這個(gè)
不嚴(yán)格的東西。
signatures段只是用來(lái)確定泛理參數(shù)中的類(lèi)型參數(shù)。DWR會(huì)自己使用反射機(jī)制或者運(yùn)行時(shí)類(lèi)型確定類(lèi)型,或者假
設(shè)它是一個(gè)String類(lèi)型。所以:
不需要signatures-沒(méi)有泛型參數(shù):
publicvoidmethod(Stringp);
publicvoidmethod(String[]p);
需要signatures-DWR不能通過(guò)反射確定:
publicvoidmethod(List<Date>p);
publicvoidmethod(Map<String,WibbleBean>p);
不需要signatures-DWR能正確的猜出:
publicvoidmethod(List<String>p);
publicvoidmethod(Map<String,String>p);
不需要signatures-DWR可以通過(guò)運(yùn)行時(shí)類(lèi)型確定:
publicList<Date>method(Stringp);
沒(méi)有必要讓Javascript中的所有對(duì)象的key都是String類(lèi)型-你可以使用其他類(lèi)型作為key。但是他們?cè)谑褂?/p>
之前會(huì)被轉(zhuǎn)換成String類(lèi)型。DWR1.x用Javascript的特性把key轉(zhuǎn)換成String.DWR2.0可能會(huì)用toStringO
方法,在服務(wù)段進(jìn)行這一轉(zhuǎn)換。
engine,jsFunctions
engine.js對(duì)DWR非常重要,因?yàn)樗怯脕?lái)轉(zhuǎn)換來(lái)至動(dòng)態(tài)生成的接口的javascript函數(shù)調(diào)用的,所以只耍用到
DWR的地方就需要它。
Theengine.jsfile
每一個(gè)頁(yè)面都需要下面這些語(yǔ)句來(lái)引入主DWR引擎。
<scripttype='text/javascript'
src='/[YOl-R-WEB-APP]/dwr/engine.js'>
</script>
使用選項(xiàng)
下面這些選項(xiàng)可以通過(guò)DBEngine.setXO函數(shù)來(lái)設(shè)置全局屬性。例如:
DWREngine.setTimeout(1000);
或者在單次調(diào)用級(jí)別上(假設(shè)Remote被DWR暴露出來(lái)了):
Remote.singleMethod(params,{
cal1back:function(data){...},
timeout:2000
});
遠(yuǎn)程調(diào)用可以批量執(zhí)行來(lái)減少反應(yīng)時(shí)間,endBatch函數(shù)中可以設(shè)置選項(xiàng)。
DWREngine.beginBatch();
Rpmotp.mpthndInBatch1(params,cal1hackI);
Remote.methodInBatch2(params,callback2);
DWREngine.endBatch({
timeout:3000
});
可以混合這幾種方式,那樣的話(huà)單次調(diào)用或者批量:調(diào)用級(jí)別上的設(shè)置可以復(fù)寫(xiě)全局設(shè)置(就像你抬望的那樣)。當(dāng)
你在一個(gè)批量處理中多次設(shè)置了某個(gè)選項(xiàng),DBR會(huì)保留最后一個(gè)。所以如果Remote.singleMethodO例子在batch
里面,DWR會(huì)使用3000ms做為超時(shí)的時(shí)間。
callback和exceplionllandle】?兩個(gè)選項(xiàng)只能在單次調(diào)用中使用,不能用于批量調(diào)用。
preHook和poslHook選項(xiàng)兩個(gè)選項(xiàng)是可添加的,就是說(shuō)你可以為每一次調(diào)用添加多個(gè)hook。全局的prellook會(huì)
在批量調(diào)用和單次調(diào)用之前被調(diào)用。同樣全局的postHook會(huì)在單次調(diào)用和批量調(diào)用之后被調(diào)用。
如果以上敘述讓你感到混亂,不用擔(dān)心。DWR的的設(shè)計(jì)往往和你想象中的?樣,所以其實(shí)這些并不復(fù)雜。
選項(xiàng)索引
下面是可用選項(xiàng)列表。
OptionGlobalBatchCallSummary
async1.11.11.1設(shè)置是否為異步調(diào)用,不推薦同步調(diào)用
headers2.02.02.0在XHR調(diào)用中加入額外的頭信息
parameters2.02.02.0可以通過(guò)Meta-datarequest.getParameter()取得的元數(shù)據(jù)
httpMethod2.02.02.0選擇GET或者POST.1.x中叫'verb'
選擇是使用xhr;iframe或者script-tag來(lái)實(shí)現(xiàn)遠(yuǎn)程調(diào)用.1.x中叫
rocTvDe2.02.02.0
'method'
某個(gè)調(diào)用是否應(yīng)該設(shè)置為batch中的一部分或者直接的。這個(gè)選項(xiàng)和上
面都有些不同。
skipBatch1.0*2.1?-
*沒(méi)有setSkipBatch。方法,批量調(diào)用是通過(guò)beginBatch()和
endBatch。來(lái)控制的。
timeout1.01.11.1設(shè)定超時(shí)時(shí)長(zhǎng),單位ms
處理器(Handler)
OptionGlobalBatchCallSummary
當(dāng)出了什么問(wèn)題時(shí)的動(dòng)作。1.x中還包括服務(wù)端的異常。從2.0
errorHandler1.01.11.1
開(kāi)好i服務(wù)端異常通過(guò)'exceptionHandler'處理
當(dāng)因?yàn)闉g覽器的bug引起問(wèn)題時(shí)的動(dòng)作,所以默認(rèn)這個(gè)設(shè)匿為
warninqHandler1.02.02.0
null(關(guān)閉)
textHtmIHandler2.02.02.0當(dāng)?shù)玫讲徽5膖ext/html頁(yè)面時(shí)的動(dòng)作(通常表示超時(shí))
調(diào)用處理器(CallHandler)(注冊(cè)到單獨(dú)調(diào)用上的,而不是
batch中的所有調(diào)用)
OptionGlobalBatchCallSummary
調(diào)用成功以后的要執(zhí)行的回調(diào)函數(shù),應(yīng)該只有一個(gè)參數(shù):遠(yuǎn)程調(diào)
callback--1.0
用得到的數(shù)據(jù)
exceptionHandler--2.0遠(yuǎn)程調(diào)用失敗的動(dòng)作,一般是服務(wù)端異常或者數(shù)據(jù)轉(zhuǎn)換問(wèn)題。
Hooks(一個(gè)batch中可以注冊(cè)多個(gè)hook)
OptionGlobalBatchCallSummary
DreHook1.01.11.1遠(yuǎn)程調(diào)用前執(zhí)行的函數(shù)
DostHook1.01.11.1遠(yuǎn)程調(diào)用后執(zhí)行的函數(shù)
全局選項(xiàng)(在單次調(diào)用或者批量調(diào)用中不可用)
OptionGlobalBatchCallSummary
ordered1.0--DWR是否支持順序調(diào)用
pollType2.0--選擇xhr或者iframe的反轉(zhuǎn)Ajax
reverseAjax2.0--是否查找inbound調(diào)用
廢棄的選項(xiàng)
OptionGlobalBatchCallSummary
verb1.01.11.12.0廢棄。使用'httpMethod'代替
method1.01.11.12.0廢棄。使用'rpcType'代替
將來(lái)的
OptionGlobalBatchCallSummary
onBackButton2.1?2.1?-用戶(hù)按了back按鈕后的動(dòng)作
onForwardButton2.1?2.1?-用戶(hù)按了forward按鈕的動(dòng)作
保證的責(zé)任
DWR的目的是讓你確切的知道所有調(diào)用的動(dòng)作。知道/瀏覽器存在的bug,這是可以做到了。
如果你設(shè)置了calIback,exceptionHandler,errorHandIer,warningHandler和textHtmlllandler.DWR就應(yīng)
該總是為每一個(gè)請(qǐng)求提供響應(yīng)。
CallBatching
你可以使用batch來(lái)批量的執(zhí)行遠(yuǎn)程調(diào)用。這樣可以減少與服務(wù)器的交互次數(shù),所以可以提交反應(yīng)速度。
一個(gè)batch以DWREngine.begi{'Batch()開(kāi)始,并以DWREngine.endB3tchO結(jié)束。當(dāng)DBEngine.endBatch()被
調(diào)用,我們就結(jié)束了遠(yuǎn)程調(diào)用的分組,這樣DWR就在一次與服務(wù)器的交互中執(zhí)行它們。
DWR會(huì)小心的處理保證所有的同調(diào)函數(shù)都會(huì)被調(diào)用,所以你可以明顯的打開(kāi)和關(guān)閉批處理。只要?jiǎng)e忘了調(diào)用
endBatch(),否則所有的遠(yuǎn)程調(diào)用永遠(yuǎn)的處丁列隊(duì)中。
警告
很明顯,把一些遠(yuǎn)程調(diào)用放在一起執(zhí)行也會(huì)產(chǎn)生一些影響。例如不能在batch里面執(zhí)行同步調(diào)用。
所有的元數(shù)據(jù)選項(xiàng),例如hooks,timeouts和errorHandlers都在batch級(jí)別的,而不是單次調(diào)用級(jí)別上的。所
以如果一個(gè)batch中有兩個(gè)調(diào)用設(shè)置了不同的超時(shí),除了最后一個(gè)其他的都被忽略。
順序調(diào)用
因?yàn)锳jax一般是異步調(diào)用,所以遠(yuǎn)程調(diào)用不會(huì)按照發(fā)送的順序返回。DBEngine.setOrdered(boolean)允許結(jié)
果嚴(yán)格按照發(fā)送的順序返向。DVR在舊的請(qǐng)求安全返網(wǎng)以后才去發(fā)送新的請(qǐng)求。
我們一定輻要保證請(qǐng)求按照發(fā)送的順序返回嗎?(默認(rèn)為false)
警告:把這個(gè)設(shè)置為仃uc會(huì)減慢你的應(yīng)用程序,如果一個(gè)消息丟失,瀏覽器就會(huì)沒(méi)有響應(yīng)。很多時(shí)候即使用
異步調(diào)用也有更好的解決辦法,所以在用這一功能之前先好好考慮一下。
處理錯(cuò)誤和警告
當(dāng)因?yàn)橐恍┰蛘{(diào)用失敗,DWR就會(huì)調(diào)用錯(cuò)誤和警告handler(根據(jù)錯(cuò)誤的激烈程度),并傳遞錯(cuò)誤消息。
你可以用這種方法來(lái)在alert窗口或狀態(tài)來(lái)中顯示錯(cuò)誤信息。
你可以使用DWREngine.〃力〃〃,來(lái)改變錯(cuò)誤處理方式,同樣通過(guò)
DWREngine.setH'
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人買(mǎi)地合同標(biāo)準(zhǔn)文本
- OEM合同木門(mén)代工合同標(biāo)準(zhǔn)文本
- 設(shè)定財(cái)務(wù)目標(biāo)的S原則計(jì)劃
- 年度項(xiàng)目管理的要點(diǎn)計(jì)劃
- 個(gè)人勞動(dòng)施工合同標(biāo)準(zhǔn)文本
- 疾病預(yù)防科工作總結(jié)與未來(lái)計(jì)劃
- 2025【標(biāo)準(zhǔn)合同】中英文租賃合同范本
- 住建部合同標(biāo)準(zhǔn)文本福建
- cdc對(duì)狂犬病十日觀察法的解讀
- 班級(jí)多元文化教育的實(shí)踐探索計(jì)劃
- 佛山市社會(huì)保險(xiǎn)歷年費(fèi)基費(fèi)率一覽表
- 汽車(chē)電氣設(shè)備構(gòu)造與維修-第2版-配套課件
- 第4章無(wú)人機(jī)-氣象
- 書(shū)香浸潤(rùn)心靈 閱讀伴我成長(zhǎng)讀書(shū)伴我成長(zhǎng)主題班會(huì)課件
- 完工工程量確認(rèn)單
- 崗位價(jià)值評(píng)估表
- 學(xué)校食堂招標(biāo)書(shū)學(xué)校食堂招標(biāo)書(shū)
- 遵義會(huì)議與遵義會(huì)議精神簡(jiǎn)化版教學(xué)課件
- 安全隱患排查情況登記表(學(xué)生宿舍)
- 經(jīng)陰道無(wú)張力尿道中段吊帶術(shù)術(shù)
- 《病毒》優(yōu)質(zhì)課一等獎(jiǎng)?wù)n件
評(píng)論
0/150
提交評(píng)論