【軟件工程】DWR入門(mén)教程_第1頁(yè)
【軟件工程】DWR入門(mén)教程_第2頁(yè)
【軟件工程】DWR入門(mén)教程_第3頁(yè)
【軟件工程】DWR入門(mén)教程_第4頁(yè)
【軟件工程】DWR入門(mén)教程_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論