《Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程》Java安全、Web編程、J2EE概述課件_第1頁(yè)
《Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程》Java安全、Web編程、J2EE概述課件_第2頁(yè)
《Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程》Java安全、Web編程、J2EE概述課件_第3頁(yè)
《Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程》Java安全、Web編程、J2EE概述課件_第4頁(yè)
《Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程》Java安全、Web編程、J2EE概述課件_第5頁(yè)
已閱讀5頁(yè),還剩148頁(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)介

1、Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程 重慶大學(xué)計(jì)算機(jī)學(xué)院教學(xué)課件第1頁(yè),共153頁(yè)。第16章 Java安全技術(shù) 第2頁(yè),共153頁(yè)。主要內(nèi)容16.1 安全基本知識(shí) 16.2 Java的安全模型 16.3 Java的密碼學(xué)結(jié)構(gòu) 第3頁(yè),共153頁(yè)。16.1 安全基本知識(shí)攻擊,保護(hù) 密碼學(xué) ,機(jī)密性 ,認(rèn)證 ,證書(shū)完整性 ,認(rèn)可性 審計(jì)和日志 ,安全策略和訪(fǎng)問(wèn)控制第4頁(yè),共153頁(yè)。主要內(nèi)容16.1 安全基本知識(shí) 16.2 Java的安全模型 16.3 Java的密碼學(xué)結(jié)構(gòu) 第5頁(yè),共153頁(yè)。16.2 Java的安全模型安全模型的演化 Java2 安全模型Java2的安全劃分 應(yīng)用程序安全性小程序安全性

2、J2SDK安全工具 Java小程序的安全部署 第6頁(yè),共153頁(yè)。最初安全模型為沙箱模型 JVMValuable Resources (files,etc)SandBoxRemote CodeLocal code為從開(kāi)放的網(wǎng)絡(luò)中獲取的非信任代碼的提供了一個(gè)受限制的運(yùn)行環(huán)境。沙箱模型的實(shí)質(zhì)是本地代碼對(duì)重要的系統(tǒng)資源(如文件系統(tǒng))有全部的訪(fǎng)問(wèn)權(quán)限,而下載的遠(yuǎn)程代碼(例如Applet)則不被信任并且僅能訪(fǎng)問(wèn)沙箱里提供的有限資源 第7頁(yè),共153頁(yè)。 JDK 1.1安全模型 JVMValuable Resources (files,etc)SandBoxRemote CodeLocal code使用數(shù)

3、字簽名服務(wù),可以用與 Java 編寫(xiě)的本地程序類(lèi)似的方式對(duì)待可信的 Applet 第8頁(yè),共153頁(yè)。JDK1.2中的新安全體系結(jié)構(gòu)JVMValuable resources(files,etc)PDPDSandboxSecurity policyClass loaderLocal or remote code ProtectionDomain是在策略數(shù)據(jù)庫(kù)中指定的,授予 CodeSource 的 Permission 的聚合體。通過(guò) ClassLoader 裝入到 JVM 的每個(gè)類(lèi)文件被分配給一個(gè)ProtectionDomain。 第9頁(yè),共153頁(yè)。Java2 安全模型 Bootstrap

4、Class filesSystemClass filesUserClass filesBytecode VerifierBootstrapClassLoaderSystemClassLoaderClassLoaderSecurityManagerProtection DomainsAccessControllerOperating System , HardwareCodeSource(URL,Certificates)Permissionskeystore第10頁(yè),共153頁(yè)。Java2 安全模型Java 安全主要建立在 Java 運(yùn)行時(shí)環(huán)境的三個(gè)方面:ByteCode Verifier(字

5、節(jié)碼驗(yàn)證器)、Security Manager(安全管理器)以及 ClassLoader(類(lèi)裝入器)。代碼驗(yàn)證(Bytecode Verifier)確保所下載的代碼被恰當(dāng)?shù)馗袷交?,字?jié)碼(“Java 虛擬機(jī)”指令)沒(méi)有違反語(yǔ)言或虛擬機(jī)的安全限制(如,無(wú)非法數(shù)據(jù)轉(zhuǎn)換),沒(méi)有執(zhí)行指針尋址,內(nèi)部堆棧不能溢出或下溢,以及字節(jié)碼指令將擁有正確的類(lèi)型參數(shù)。 第11頁(yè),共153頁(yè)。安全管理器(SecurityManager) SecurityManager 在嘗試執(zhí)行文件 I/O 和網(wǎng)絡(luò) I/O、創(chuàng)建新的 ClassLoader、操作線(xiàn)程或線(xiàn)程組、啟動(dòng)底層平臺(tái)(操作系統(tǒng))上的進(jìn)程、終止“Java 虛擬機(jī)”、

6、將非 Java 庫(kù)(本機(jī)代碼)裝入到 JVM、完成某種類(lèi)型的系統(tǒng)操作以及將某種類(lèi)型的類(lèi)裝入到 JVM 中時(shí)激發(fā)運(yùn)行時(shí)訪(fǎng)問(wèn)控制機(jī)制。例如,Java Applet 沙箱嚴(yán)格地將所下載的 Applet 約束到被認(rèn)為是比較安全的有限的運(yùn)行環(huán)境中。 第12頁(yè),共153頁(yè)。權(quán)限(Permission) 一個(gè)權(quán)限允許代碼執(zhí)行的一個(gè)特定的操作,權(quán)限可以是特別具體的,也可以是一般化的。 一個(gè)權(quán)限由三個(gè)部分組成:類(lèi)型,名稱(chēng)和操作。類(lèi)型是必須的,它是實(shí)現(xiàn)了Permission接口的特定的類(lèi) permission java.security.AllPermission;permission java.lang.Run

7、timePermission stopThread;permission java.io.FilePermission /tmp/foo, read;第13頁(yè),共153頁(yè)。代碼源(Code Sources) 代碼源包含類(lèi)的從哪里裝載的位置信息和對(duì)類(lèi)簽名信息。一般情況下,這個(gè)位置被表示成一個(gè)URL。如果代碼被簽名,那么代碼源里面包含了關(guān)于簽名者的信息。類(lèi)可以基于代碼源被賦予一定的權(quán)限。保護(hù)域(Protection Domains)是賦予代碼源的權(quán)限的集合??梢酝ㄟ^(guò)策略文件定義。 第14頁(yè),共153頁(yè)。策略文件(Policy files) 策略文件是一個(gè)控制沙箱的管理元素。一個(gè)策略文件可以包含一個(gè)

8、或者多個(gè)條目來(lái)定義一個(gè)保護(hù)域。每個(gè)條目是賦予代碼源的權(quán)限聲明。一般有兩個(gè)策略文件,一個(gè)全局策略文件,一個(gè)用戶(hù)相關(guān)策略文件。全局策略文件影響Java虛擬機(jī)種的所有的實(shí)例。策略文件是一個(gè)文本文件,可以直接進(jìn)行編輯。也可以用Java提供的編輯工具policyTool進(jìn)行編輯。第15頁(yè),共153頁(yè)。密鑰庫(kù)(Keystores) 通過(guò)代碼簽名可以賦予代碼更多的執(zhí)行自由度。如果你確信正在執(zhí)行的代碼來(lái)自一個(gè)可信的組織,你可以允許它訪(fǎng)問(wèn)本地磁盤(pán)文件,或者使用打印機(jī)等。被簽名的代碼依賴(lài)于公鑰證書(shū),證書(shū)被保存在密鑰庫(kù)中。開(kāi)發(fā)者可以使用密鑰庫(kù)中的證書(shū)對(duì)代碼進(jìn)行簽名;一般用戶(hù)或者系統(tǒng)管理員可以在執(zhí)行已簽名的代碼時(shí)參考

9、密鑰庫(kù)發(fā)現(xiàn)是誰(shuí)的簽名。第16頁(yè),共153頁(yè)。訪(fǎng)問(wèn)控制器(AccessController) 訪(fǎng)問(wèn)關(guān)鍵系統(tǒng)資源時(shí),是否允許或者拒絕,具體結(jié)果決定于策略文件的配置。把一段代碼標(biāo)記為具有一定的特權(quán),影響后續(xù)的訪(fǎng)問(wèn)判斷。獲取當(dāng)前調(diào)用上下文的一個(gè)快照,來(lái)自不同上下文的訪(fǎng)問(wèn)控制判斷可以參照被保存的上下文。做特殊安全檢查第17頁(yè),共153頁(yè)。Java2的策略配置文件SecurityManager security = System.getSecurityManager();if (security != null) security. checkPermission (Permission perm );如

10、果這個(gè)請(qǐng)求被允許,checkPermission不返回任何值;如果被拒絕,拋出異常SecurityException。 grant signedBy signer_names, codeBase URL permission permission_class_name target_name, action,signedBy signer_names;第18頁(yè),共153頁(yè)。應(yīng)用程序安全性 在不使用SecurityManager的情況下使用SecurityManager的情況修改策略配置文件第19頁(yè),共153頁(yè)。小應(yīng)用程序安全性通過(guò)程序說(shuō)明在命令行中用AppletViewer執(zhí)行Appletvi

11、ewer writeFile.html第20頁(yè),共153頁(yè)。J2SDK安全工具 keytool 管理密鑰庫(kù)和證書(shū) jarsigner 產(chǎn)生和驗(yàn)證Java簽名 policytool 圖形化的方式管理策略文件。第21頁(yè),共153頁(yè)。Keytool1)創(chuàng)建公/私鑰對(duì);2)發(fā)出證書(shū)請(qǐng)求到認(rèn)證權(quán)威(CA)3)從認(rèn)證權(quán)威導(dǎo)入證書(shū)回復(fù)4)指明屬于其他組織的公鑰是受信任的。Keytool目前能夠處理符合X.509標(biāo)準(zhǔn)的證書(shū)。JSSE( Java Secure Socket Extension,JSSE ) 1.0.2以后的版本可以支持pkcs12。第22頁(yè),共153頁(yè)。Keytool參數(shù) 參數(shù)描述-genke

12、y產(chǎn)生一個(gè)密鑰對(duì) (一個(gè)公鑰關(guān)聯(lián)一個(gè)私鑰)-import讀取一個(gè)證書(shū)或者證書(shū)鏈,并存儲(chǔ)到密鑰庫(kù)中,同時(shí)用一個(gè)別名進(jìn)行標(biāo)識(shí)。-certreq用pkcs10產(chǎn)生一個(gè)證書(shū)簽發(fā)請(qǐng)求。-export導(dǎo)出一個(gè)和某個(gè)別名相關(guān)聯(lián)的證書(shū)-list打印整個(gè)密鑰庫(kù)中的內(nèi)容,或者打印與某個(gè)別名相關(guān)聯(lián)的證書(shū)。-storepasswd修改或指定密鑰庫(kù)的密碼-keypasswd修改或者指定某一個(gè)密鑰對(duì)的訪(fǎng)問(wèn)密碼-delete刪除密鑰庫(kù)中的條目。第23頁(yè),共153頁(yè)。KeyTool應(yīng)用D:keytool -genkey -alias javafan -keyalg rsa -validity 750輸入keystore密碼:

13、 keystore您的名字與姓氏是什么? Unknown: JavaFan您的組織單位名稱(chēng)是什么? Unknown: Computer Science您的組織名稱(chēng)是什么? Unknown: Chongqing University您所在的城市或區(qū)域名稱(chēng)是什么? Unknown: Chongqing您所在的州或省份名稱(chēng)是什么? Unknown: Chongqing該單位的兩字母國(guó)家代碼是什么 Unknown: CNCN=JavaFan, OU=Computer Science, O=Chongqing University, L=Chongqing , ST=Chongqing, C=CN 正確

14、嗎? 否: 是輸入的主密碼 (如果和 keystore 密碼相同,按回車(chē)): 第24頁(yè),共153頁(yè)。用keytool顯示證書(shū)的內(nèi)容 D: keytool -v -printcert -file javafan.cerOwner: CN=JavaFan, OU=Computer Science, O=Chongqing University, L=Chongqing ,ST=Chongqing, C=CN發(fā)照者: CN=JavaFan, OU=Computer Science, O=Chongqing University, L=Chongqing , ST=Chongqing, C=CN序號(hào):

15、 43030437有效期間: Wed Aug 17 17:32:39 CST 2005 至: Thu Sep 06 17:32:39 CST 2007認(rèn)證指紋: MD5: CB:AE:97:24:A9:93:4B:34:E2:3B:95:95:70:E7:70:D5 SHA1: E3:32:0C:68:24:34:CB:6E:02:BF:ED:E6:D8:C0:29:AE:66:5C:20:DD第25頁(yè),共153頁(yè)。jarsignerJarsigner用于給打包后的Java程序簽名,或者驗(yàn)證簽名。Jarsigner可以在簽名或者驗(yàn)證簽名時(shí),訪(fǎng)問(wèn)由keytool創(chuàng)建的密鑰庫(kù)。 選項(xiàng)描述-stor

16、epass訪(fǎng)問(wèn)密鑰庫(kù)時(shí),指定口令-keypass指定私鑰的保護(hù)口令-signedjar指定需要被簽名的jar文件-verifyjar文件的簽名驗(yàn)證-verbose控制是否輸出簽名或者驗(yàn)證過(guò)程的詳細(xì)信息-certs與-verify、verbose一起使用,輸出包括每個(gè)簽名證書(shū)的信息第26頁(yè),共153頁(yè)。policytool Java運(yùn)行時(shí)環(huán)境的安全配置文件java.home/lib/security/java.security(java.home指安裝Java運(yùn)行時(shí)環(huán)境的目錄)中包括兩個(gè)策略文件:java.home/lib/security/java.policy 和 user.home/.ja

17、va.policy(user.home指用戶(hù)主目錄)。PolicyTool缺省修改第二個(gè)文件。 第27頁(yè),共153頁(yè)。Java小程序的安全部署 SimpleScannerApplet程序檢查某個(gè)主機(jī)上的TCP端口是否開(kāi)放,比如用于WWW服務(wù)的80端口,用于SMTP服務(wù)的25端口等。第28頁(yè),共153頁(yè)。程序運(yùn)行界面第29頁(yè),共153頁(yè)。制作和部署安全小程序步驟編制小程序SimpleScannerApplet 編寫(xiě)Html文件scanner.html 把程序打包成Jar文件獲取并安裝一個(gè)支持RSA的簽名證書(shū)。 用該證書(shū)對(duì)Jar文件進(jìn)行簽名用sun的Html Convert轉(zhuǎn)換scanner.ht

18、ml部署轉(zhuǎn)換后的html文件和已經(jīng)簽名的jar文件見(jiàn)程序 第30頁(yè),共153頁(yè)。主要內(nèi)容16.1 安全基本知識(shí) 16.2 Java的安全模型 16.3 Java的密碼學(xué)結(jié)構(gòu) 第31頁(yè),共153頁(yè)。16.3 Java的密碼學(xué)結(jié)構(gòu)16.3.1基本概念16.3.2核心類(lèi)16.3.3消息摘要16.3.4數(shù)字簽名16.3.5數(shù)據(jù)加密/解密第32頁(yè),共153頁(yè)。16.3.1基本概念Java 密碼學(xué)結(jié)構(gòu)設(shè)計(jì)遵循兩個(gè)原則: (1) 算法的獨(dú)立性和可靠性;(2) 實(shí)現(xiàn)的獨(dú)立性和相互作用性。Java 2 中主要的密碼學(xué)服務(wù)有以下幾種:數(shù)字簽名、消息摘要、加密/解密密鑰工廠(chǎng)密鑰庫(kù)創(chuàng)建與密鑰管理算法參數(shù)產(chǎn)生、管理證書(shū)

19、工廠(chǎng)第33頁(yè),共153頁(yè)。JDK5.0提供的密碼學(xué)服務(wù)可以通過(guò)修改java.home/lib/security/java.security文件安裝密碼學(xué)服務(wù)提供者。缺省情況下,Java運(yùn)行時(shí)環(huán)境已經(jīng)安裝了下面的提供者:vider.1=vider.Sunvider.2=sun.security.rsa.SunRsaSignvider.3=ernal.ssl.Providervider.4=vider.SunJCEvider.5=sun.security.jgss.SunProvidervider.6=com.sun.security.sasl.Provider見(jiàn)程序第34頁(yè),共153頁(yè)。測(cè)試程序

20、import java.security.Provider;import java.security.Security;public class GetProviderInfo public static void main(String args) Provider plist = Security.getProviders();for (int i = 0; i plist.length; i+) System.out.println( + (i + 1) + -Provider name:+ plisti.getName();System.out.println(Provider inf

21、o: + plisti.getInfo();第35頁(yè),共153頁(yè)。16.3.2核心類(lèi)Security , Provider MessageDigest類(lèi) Signature類(lèi) Key ,KeyFactory , KeyPair ,KeyPairGenerator SecureRandom 第36頁(yè),共153頁(yè)。16.3.3消息摘要使用MD5算法產(chǎn)生消息摘要也可以使用SHA1算法MessageDigest支持MD5和SHA消息摘要算法。調(diào)用getInstance()方法選擇一個(gè)合適的算法;調(diào)用update()方法準(zhǔn)備數(shù)據(jù)輸入緩沖區(qū);digest()方法產(chǎn)生消息摘要;摘要的長(zhǎng)度取決于所選擇的算法。

22、使用 MD5產(chǎn)生128位的摘要,使用SHA產(chǎn)生160位的摘要。 第37頁(yè),共153頁(yè)。16.3.4數(shù)字簽名Signature類(lèi)支持?jǐn)?shù)字簽名,getInstance( )方法選擇數(shù)字簽名的算法。通過(guò)指定參數(shù)SHA1withDSA,可以在DSA數(shù)字簽名算法中使用SHA-1產(chǎn)生消息摘要。如果使用RSA數(shù)字簽名算法,可以用MD5或者SHA-1產(chǎn)生消息摘要,可以由參數(shù)MD2withRSA, MD5withRSA, SHA1withRSA確定使用的算法。見(jiàn)程序第38頁(yè),共153頁(yè)。16.3.5數(shù)據(jù)加密/解密1. 對(duì)稱(chēng)密鑰對(duì)稱(chēng)加密使用相同的密鑰執(zhí)行加密和解密操作。目前,安全度最高,使用最廣泛地就是AES加密

23、標(biāo)準(zhǔn)。對(duì)稱(chēng)加密的基本過(guò)程是:根據(jù)指定算法生成密鑰產(chǎn)生器對(duì)象;產(chǎn)生密鑰生成加密引擎對(duì)象向加密引擎初始化需要加密的數(shù)據(jù)執(zhí)行加密操作對(duì)稱(chēng)解密密的基本過(guò)程是:獲取密鑰生成解密引擎對(duì)象向解密引擎初始化需要解密的數(shù)據(jù)執(zhí)行解密操作見(jiàn)程序第39頁(yè),共153頁(yè)。非對(duì)稱(chēng)密鑰 非對(duì)稱(chēng)密鑰體系就是加密和解密用不同的密鑰,稱(chēng)為密鑰對(duì),一個(gè)叫公鑰,一個(gè)叫私鑰。公鑰是公開(kāi)的,任何人都可以訪(fǎng)問(wèn),私鑰是保密的,只有密鑰的持有能使用。最典型和使用最普遍的就是RSA算法。一般用接收者的公鑰加密數(shù)據(jù),只有接收者用自己的私鑰才可以解密。主要設(shè)計(jì)到的類(lèi)有:KeyPairGenerator和Cipher.KeyPairGenerator負(fù)

24、責(zé)產(chǎn)生密鑰對(duì),Cipher作為執(zhí)行引擎,具體執(zhí)行加密和解密操作。第40頁(yè),共153頁(yè)。非對(duì)稱(chēng)加密解密過(guò)程一般加密處理過(guò)程是:使用RSA算法產(chǎn)生密鑰對(duì)用公鑰初始加密引擎Cipher向Cipher傳送數(shù)據(jù)。執(zhí)行加密操作。解密過(guò)程是:用私鑰初始解密引擎Cipher向Cipher傳送已加密的數(shù)據(jù)。執(zhí)行解密操作。見(jiàn)程序第41頁(yè),共153頁(yè)。第17章 Web服務(wù)器端編程第42頁(yè),共153頁(yè)。第17章 Web服務(wù)器端編程17.1 Java Web服務(wù)器介紹17.2 Servlet介紹17.3 JSP介紹17.4 Struts介紹 第43頁(yè),共153頁(yè)。17.1 Java Web服務(wù)器介紹 在進(jìn)行實(shí)際大型Ja

25、va Web項(xiàng)目實(shí)施的時(shí)候,我們可以采用商業(yè)型的應(yīng)用服務(wù)器,應(yīng)用服務(wù)器可以處理復(fù)雜的商業(yè)邏輯,常應(yīng)用于WEB多層結(jié)構(gòu)的開(kāi)發(fā)。例如IBM的 WebSphere服務(wù)器,BEA 的WebLogic服務(wù)器。這兩種服務(wù)器功能齊全而強(qiáng)大,支持所有的Java 服務(wù)容器標(biāo)準(zhǔn),適用于大型的商業(yè)Java Web應(yīng)用的發(fā)布。但是這兩種服務(wù)器都是商業(yè)服務(wù)器,價(jià)格昂貴,對(duì)系統(tǒng)資源要求極高。特別是Websphere 配置更復(fù)雜。JBoss公司的開(kāi)源免費(fèi)軟件Jboss應(yīng)用服務(wù)器同樣功能齊全而強(qiáng)大,也支持所有的Java 服務(wù)容器標(biāo)準(zhǔn)。而且JBoss具有良好的性?xún)r(jià)比,具有良好的運(yùn)行效率和可靠性,因此已經(jīng)得到越來(lái)越多的J2EE應(yīng)

26、用開(kāi)發(fā)者和中小型企業(yè)的青睞。但同樣對(duì)系統(tǒng)資源要求高,配置復(fù)雜。第44頁(yè),共153頁(yè)。17.1 Java Web服務(wù)器介紹 在開(kāi)發(fā)或?qū)W習(xí)過(guò)程中,有許多免費(fèi)輕型的Java Web服務(wù)器可以供我們選用,如Tomcat、Resin、Orion等等。他們使用都很方便,占用資源也很少,適合開(kāi)發(fā)過(guò)程中的調(diào)試階段;而且這些服務(wù)器還可以和Jbuilder、Eclipse等開(kāi)發(fā)工具集成使用。根據(jù)實(shí)際開(kāi)發(fā)中的情況來(lái)看,Jakata Tomcat 和Sun Java結(jié)合的最好,和其他應(yīng)用服務(wù)器配合使用可支持完整的J2EE標(biāo)準(zhǔn),因此其應(yīng)用很廣泛。但是從Java 普遍存在的編碼問(wèn)題來(lái)看,還是Resin 解決得比較好。從使

27、用的角度來(lái)看,Resin比Tomcat方便,而且Resin也可以結(jié)合Jbuilder、Eclispe等IDE使用。Resin強(qiáng)調(diào)使用Xml技 術(shù),從Resin自己的HomePage使用xtp就可以看出來(lái)。本書(shū)將使用Resin服務(wù)器作為測(cè)試和開(kāi)發(fā)的工具。但本章的例子仍然可以在Tomcat上運(yùn)行,只需要對(duì)配置文件進(jìn)行簡(jiǎn)單的修改即可。第45頁(yè),共153頁(yè)。17.1 Java Web服務(wù)器介紹 Resin 可以在 /download/index.xtp 免費(fèi)下載和使用。使用Resin開(kāi)發(fā)或者學(xué)習(xí)是免費(fèi)的,但是如果把Resin作為收費(fèi)產(chǎn)品發(fā)布是需要付費(fèi)的。本書(shū)將使用2.1.16版本來(lái)運(yùn)行所有的例子。 下

28、載Resin 時(shí)選擇Archive Versions 中的 windows.zip的普通安裝包resin-ee-2.1.16。把該zip包解壓到任何目錄下面,如d:Resin-ee-2.1.16。以下介紹都假設(shè)Resin安裝在d:Resin-ee-2.1.16下。進(jìn)入d:Resin-ee-2.1.16bin,運(yùn)行httpd.exe,另外也可以在Command控制臺(tái)下運(yùn)行Resin服務(wù)器。此時(shí)彈出一個(gè)有start 和stop兩個(gè)Radio按紐和一個(gè)quit 按紐的對(duì)話(huà)窗,如圖第46頁(yè),共153頁(yè)。17.1 Java Web服務(wù)器介紹第47頁(yè),共153頁(yè)。17.1 Java Web服務(wù)器介紹第48

29、頁(yè),共153頁(yè)。第17章 Web服務(wù)器端編程17.1 Java Web服務(wù)器介紹17.2 Servlet介紹17.3 JSP介紹17.4 Struts介紹 第49頁(yè),共153頁(yè)。17.2 Servlet介紹17.2.1 Servlet的概念17.2.2 Servlet應(yīng)用范圍和運(yùn)行環(huán)境17.2.3 Servlet簡(jiǎn)單例子 17.2.4 Servlet常用類(lèi)、接口和生命周期17.2.5 Servlet應(yīng)用舉例第50頁(yè),共153頁(yè)。17.2.1 Servlet的概念 Servlet就是用 Java 編寫(xiě)的服務(wù)器端程序,是由服務(wù)器端調(diào)用和執(zhí)行的 Java 類(lèi),這種類(lèi)使用 Java Servlet 應(yīng)

30、用程序設(shè)計(jì)接口(API)及相關(guān)類(lèi)和方法。除了 Java Servlet API , Servlet 還可以使用用以擴(kuò)展和添加到 API 的 Java 類(lèi)軟件包。Servlet是一種采用 Java 來(lái)實(shí)現(xiàn) CGI(Common Gate Interface) 功能的技術(shù)。Servlet本身與協(xié)議無(wú)關(guān),與平臺(tái)也無(wú)關(guān)。也就是說(shuō)Servlet所適用的網(wǎng)絡(luò)協(xié)議可以是多種多樣的,比如HTTP,F(xiàn)TP,SMTP,TELNET等,但是就目前而言,只有HTTP服務(wù)已經(jīng)形成了標(biāo)準(zhǔn)的Java組件。對(duì)應(yīng)的軟件包有兩個(gè)javax.servlet.http和javax.servlet.jsp,分別對(duì)應(yīng)我們要講解的Serv

31、let和JSP編程。我們通常所說(shuō)的Servlet編程主要就是指針對(duì)HTTP的Servlet編程,用到的就是javax.servlet.http包中的類(lèi)(典型的就是HttpServlet類(lèi)),實(shí)際上Java Servlet編程的概念要更廣一些,在這里我們約定俗成的使用Servlet來(lái)指代HTTP Servlet的編程,這點(diǎn)讀者是需要了解的。由于JSP最終都是要經(jīng)過(guò)JSP引擎轉(zhuǎn)換成Servlet代碼的,而且Servlet編程和一般的Java編程是沒(méi)有大的區(qū)別的,只需要了解一定的規(guī)范即可。 第51頁(yè),共153頁(yè)。17.2.2 Servlet應(yīng)用范圍和運(yùn)行環(huán)境 Servlet運(yùn)行于Servlet引擎管

32、理的Java虛擬機(jī)中,被來(lái)自客戶(hù)機(jī)的請(qǐng)求所喚醒,與CGI不同的是,在虛擬機(jī)中只要裝載一個(gè)Servlet就能夠處理新的請(qǐng)求,每個(gè)新請(qǐng)求使用內(nèi)存中那個(gè)Servlet的相同副本,所以效率比CGI來(lái)得高。如果采用服務(wù)器端腳本,如ASP,PHP,語(yǔ)言解釋程序是內(nèi)置程序,雖然可以加快服務(wù)器的運(yùn)行,但是效率還是比不上準(zhǔn)編譯的Servlet。實(shí)際的使用也已經(jīng)證明,Servlet是效率很高的服務(wù)器端程序,很適合用來(lái)開(kāi)發(fā)Web服務(wù)器應(yīng)用程序。Java Servlet有著十分廣泛的應(yīng)用。不光能簡(jiǎn)單的處理客戶(hù)端的請(qǐng)求,借助Java的強(qiáng)大的功能,使用Servlet還可以實(shí)現(xiàn)大量的服務(wù)器端的管理維護(hù)功能,以及各種特殊的任

33、務(wù),比如,并發(fā)處理多個(gè)請(qǐng)求,轉(zhuǎn)送請(qǐng)求,代理等。 為了運(yùn)行Servlet,首先需要一個(gè)JVM來(lái)提供對(duì)Java的基本支持,一般需要安裝JRE(Java Runtime Environment)或JDK(Java Develop Kit,JRE是其中的一個(gè)子集)。其次我們需要Servlet API的支持,一般的Servlet引擎都自帶Servlet API,只要我們安裝Servlet引擎或安裝直接支持Servlet的Web服務(wù)器,便會(huì)自動(dòng)安裝上Servlet相關(guān)的程序包。 Resin自帶一個(gè)Servlet Runner和HTTP Server,因此要構(gòu)建一個(gè)簡(jiǎn)單的Web環(huán)境,光有Resin已經(jīng)足夠了

34、,不需要額外的支持軟件。 第52頁(yè),共153頁(yè)。17.2.3 Servlet簡(jiǎn)單例子 【例17-1】使用Servlet在客戶(hù)端輸出簡(jiǎn)單的問(wèn)候語(yǔ)句 /HelloWorld.java package test; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet private String greeting; public void init() throws ServletException greeting = ge

35、tInitParameter(greeting); 第53頁(yè),共153頁(yè)。17.2.3 Servlet簡(jiǎn)單例子 【例17-1】使用Servlet在客戶(hù)端輸出簡(jiǎn)單的問(wèn)候語(yǔ)句 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /doGet()是這個(gè)Servlet的核心,真正處理請(qǐng)求的地方 PrintWriter out = response.getWriter(); /從HttpServletResponse得到輸出流 ou

36、t.println(); out.println(); out.println( + greeting + ); out.println(); out.println(); out.println( + greeting + ); out.println(); out.println();/上面的語(yǔ)句都是向客戶(hù)端打印HTML文本 out.close(); /關(guān)閉HttpServletResponse public void destroy() / nothing to do 第54頁(yè),共153頁(yè)。17.2.3 Servlet簡(jiǎn)單例子 這是最簡(jiǎn)單的一個(gè)Servlet程序,整個(gè)類(lèi)從HttpServ

37、let派生,就跟Applet一樣,這個(gè)派生關(guān)系是必須的。這個(gè)Servlet必須實(shí)現(xiàn)doGet()方法(因?yàn)樗亲鳛殪o態(tài)頁(yè)面通過(guò)地址訪(fǎng)問(wèn)的,這種方式在HTTP中稱(chēng)為GET請(qǐng)求,在后面還會(huì)有更具體的講解),這是這個(gè)Servlet真正處理請(qǐng)求的地方,是整個(gè)Servlet的主體。doGet()有兩個(gè)參數(shù)HttpServletRequest req和 HttpServletResponse res。HttpServletRequest包含了客戶(hù)請(qǐng)求的各種信息,HttpServletResponse則包裝了服務(wù)器響應(yīng),主要處理對(duì)客戶(hù)機(jī)的輸出。通過(guò)javac對(duì)以上程序進(jìn)行編譯,我們可以得到HelloServ

38、let.class,下面我們就通過(guò)配置Resin來(lái)運(yùn)行這個(gè)Servlet。 在webapps下建立自己的發(fā)布目錄mytest, mytest目錄下的WEB_INF/classes是Resin默認(rèn)的classpath環(huán)境變量的值, 把HelloWorld.java拷貝到WEB_INF/classes /test目錄下。當(dāng)然也可以將其拷貝到有效的系統(tǒng)或用戶(hù)的classpath下,Resin都是能夠找到的,如Resin默認(rèn)的發(fā)布目錄doc。接下來(lái)就需要修改conf目錄下的resin.conf文件,來(lái)配置我們的Servlet。讀者可以使用任何一種自己所熟悉的文本編輯器來(lái)打開(kāi)該配置文件第55頁(yè),共153

39、頁(yè)。17.2.3 Servlet簡(jiǎn)單例子 在中加上下面的配置語(yǔ)句 這樣當(dāng)客戶(hù)端產(chǎn)生/Hello請(qǐng)求的時(shí)候,Resin就能把這個(gè)請(qǐng)求定向到test.HelloWorld上,同時(shí)給出greeting參數(shù)的值。該Servlet就能正常運(yùn)行了。下面我們啟動(dòng)Resin服務(wù)器(通過(guò)雙擊bin下的httpd.exe)。這樣我們就可以通過(guò)瀏覽器訪(fǎng)問(wèn)這個(gè)Servlet了。打開(kāi)瀏覽器,比如IE,在地址欄鍵入http:/localhost:8080/mytest/Hello,就可以看到運(yùn)行結(jié)果網(wǎng)頁(yè),如圖 第56頁(yè),共153頁(yè)。17.2.3 Servlet簡(jiǎn)單例子 第57頁(yè),共153頁(yè)。17.2.4 Servlet常

40、用類(lèi)、接口和生命周期 第58頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 1、Servlet的生命周期 Servlet容器負(fù)責(zé)處理客戶(hù)請(qǐng)求、把請(qǐng)求傳送給Servlet并把結(jié)果返回給客戶(hù)。不同的Web容器實(shí)際的實(shí)現(xiàn)可能有所不同,但容器與Servlet之間的接口是由ServletAPI定義好的,這個(gè)接口定義了Servlett容器在Servlet上要調(diào)用的方法及傳遞給Servlet的對(duì)象類(lèi)。 Servlet的生命周期可以被歸納為下面的步驟: (1) 裝載Servlet,這一項(xiàng)操作一般是動(dòng)態(tài)執(zhí)行的。 (2) Server創(chuàng)建一個(gè)Servlet實(shí)例;(3) Server調(diào)用Serv

41、let的init方法;(4) 一個(gè)客戶(hù)端請(qǐng)求到達(dá)Server;(5) Server創(chuàng)建一個(gè)請(qǐng)求對(duì)象;(6) Server創(chuàng)建一個(gè)響應(yīng)對(duì)象;(7) Server激活Servlet的service方法,傳遞請(qǐng)求和響應(yīng)對(duì)象作為參數(shù);(8) service方法獲得關(guān)于請(qǐng)求對(duì)象的信息,處理請(qǐng)求,訪(fǎng)問(wèn)其他資源,獲得需要的信息;第59頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 (9) service方法使用響應(yīng)對(duì)象的方法。將響應(yīng)傳回Server,最終到達(dá)客戶(hù)端。service方法可能激活其他方法以處理請(qǐng)求。如doGet,doPost或其他程序員自己開(kāi)發(fā)的方法(10) 對(duì)于更多的客戶(hù)端

42、請(qǐng)求,Server創(chuàng)建新的請(qǐng)求和響應(yīng)對(duì)象,仍然激活此Servlet的service方法,將這兩個(gè)對(duì)象作為參數(shù)傳遞給它,如此重復(fù)以上的循環(huán),但無(wú)需再次調(diào)用init方法,Servlet一般只初始化一次(11) 當(dāng)Server不再需要Servlet時(shí)(比如當(dāng)Server要關(guān)閉時(shí)),Server調(diào)用Servlet的destroy方法。 一旦請(qǐng)求了一個(gè)Servlet,就沒(méi)有辦法阻止容器執(zhí)行一個(gè)完整的生命周期。容器在Servlet首次被調(diào)用時(shí)創(chuàng)建它的一個(gè)實(shí)例,并保持該實(shí)例在內(nèi)存中,讓它對(duì)所有的請(qǐng)求進(jìn)行處理。容器可以決定在任何時(shí)候把這個(gè)實(shí)例從內(nèi)存中移走。在典型的模型中,容器為每個(gè)Servlet創(chuàng)建一個(gè)單獨(dú)的

43、實(shí)例,容器并不會(huì)每接到一個(gè)請(qǐng)求就創(chuàng)建一個(gè)新線(xiàn)程,而是使用一個(gè)線(xiàn)程池來(lái)動(dòng)態(tài)的將線(xiàn)程分配給到來(lái)的請(qǐng)求,但是這從Servlet的觀(guān)點(diǎn)來(lái)看,效果和為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新線(xiàn)程的效果相同。 第60頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 2、 Servlet接口 publicinterfaceServlet它的生命周期由javax.servlet.servlet接口定義。當(dāng)你在寫(xiě)servlet的時(shí)候必須直接或間接的實(shí)現(xiàn)這個(gè)接口。一般趨向于間接實(shí)現(xiàn):通過(guò)從javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。在實(shí)現(xiàn)

44、servlet接口時(shí)必須實(shí)現(xiàn)它的五個(gè)方法: (1) init():publicvoidinit(ServletConfigconfig)throwsServletException (2) service():publicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException (3) destroy(): publicvoiddestroy() (4) getServletConfig()publicServletConfiggetServletConfig() (5) getSer

45、vletInfo():publicStringgetServletInfo()第61頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 下面的類(lèi)和接口詳細(xì)情況見(jiàn)servert幫助文檔。3、GenericServlet類(lèi) publicabstractclassGenericServletimplements Servlet,ServletConfig, Serializable 此類(lèi)提供了servlet接口的基本實(shí)現(xiàn)部分,其中包含的service()方法被申明為abstract,因此該類(lèi)必須被繼承。init(ServletConfigconf)方法把servletConfig對(duì)象

46、存儲(chǔ)在一個(gè)privatetransient(私有臨時(shí))實(shí)例變量里,getServletConfig()方法返回指向本對(duì)象的指針,如果重載此方法,將不能使用getServletConfig來(lái)獲得ServletConfig對(duì)象,如果確實(shí)想重載,記住要包含對(duì)super.config的調(diào)用。第62頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 4、HttpServlet類(lèi) 該類(lèi)擴(kuò)展了GenericServlet類(lèi)并對(duì)Servlet接口提供了與HTTP更相關(guān)的實(shí)現(xiàn)。(1)、service()方法:protectedvoidservice(HttpServletRequestreq,H

47、ttpServletResponseres)throwsServletException,IOException publicvoidservice(HttpServletRequestreq,HttpServletResponseres)throwsServletException, IOExceptionservice() 方法是 Servlet 的核心。每當(dāng)一個(gè)客戶(hù)請(qǐng)求一個(gè)HttpServlet 對(duì)象,該對(duì)象的service() 方法就要被調(diào)用,而且傳遞給這個(gè)方法一個(gè)請(qǐng)求(ServletRequest)對(duì)象和一個(gè)響應(yīng)(ServletResponse)對(duì)象作為參數(shù)。 在 HttpServl

48、et 中已存在 service() 方法。缺省的服務(wù)功能是調(diào)用與 HTTP 請(qǐng)求的方法相應(yīng)的 do 功能。 第63頁(yè),共153頁(yè)。 如果servlet收到一個(gè)HTTP請(qǐng)求而你沒(méi)有重載相應(yīng)的do方法,它就返回一個(gè)說(shuō)明此方法對(duì)本資源不可用的標(biāo)準(zhǔn)HTTP錯(cuò)誤。下面是這些do方法的說(shuō)明: 1) doGet 用來(lái)處理HTTP的GET請(qǐng)求。 2)doPost 用來(lái)處理HTTP的POST請(qǐng)求。 3)doPut用來(lái)處理HTTP的PUT請(qǐng)求。4)doDelete用來(lái)處理HTTP的DELETE請(qǐng)求。5)doHead 用來(lái)處理HTTP的HEAD請(qǐng)求。6)doOptions用來(lái)處理HTTP的OPTIONS請(qǐng)求。 7)

49、doTrace用來(lái)處理HTTP的TRACE請(qǐng)求 在開(kāi)發(fā)以HTTP為基礎(chǔ)的servlet中,Servlet開(kāi)發(fā)者關(guān)心方法doGet和方法doPost即可。(2)、getLatModified(): protectedlonggetLastModified(HttpServletRequestreq)第64頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 5、HttpServletRequest接口 publicinterfaceHttpServletRequestextendsServletRequest 所有實(shí)現(xiàn)此接口的對(duì)象(例如從servlet容器傳遞的HTTP請(qǐng)求對(duì)象)都

50、能讓servlet通過(guò)自己的方法訪(fǎng)問(wèn)所有請(qǐng)求的數(shù)據(jù)。下面是一些用來(lái)獲取表單數(shù)據(jù)的基本方法。 (1) getParameter() publicStringgetParameter(Stringkey)此方法試圖將根據(jù)查詢(xún)串中的關(guān)鍵字定位對(duì)應(yīng)的參數(shù)并返回其值。如果有多個(gè)值則返回列表中的第一個(gè)值。如果請(qǐng)求信息中沒(méi)有指定參數(shù),則返回null。 (2) getParametervalues(): publicStringgetParametervalues(Stringkey)如果一個(gè)參數(shù)可以返回多個(gè)值,比如復(fù)選框集合,則可以用此方法獲得對(duì)應(yīng)參數(shù)的所有值。如果請(qǐng)求信息中沒(méi)有指定參數(shù),則返回null。

51、(3) GetParameterNames(): PublicEnumerationgetParameterNames()此方法返回一個(gè)Enumeration對(duì)象,包含對(duì)應(yīng)請(qǐng)求的所有參數(shù)名字列表。第65頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 6、HttpServletResponse接口 publicinterfaceHttpServletResponseextendsservletResponseservlet容器提供一個(gè)實(shí)現(xiàn)該接口的對(duì)象并通過(guò)service()方法將它傳遞給servlet。通過(guò)此對(duì)象及其方法,servlet可以修改響應(yīng)頭并返回結(jié)果。 (1)set

52、ContentType(): publicvoidsetContentType(Stringtype)在給調(diào)用者發(fā)回響應(yīng)前,必須用此方法來(lái)設(shè)置HTTP響應(yīng)的MIME類(lèi)型??梢允侨魏斡行У腗IME類(lèi)型,當(dāng)給瀏覽器返回HTML就是”text/html”類(lèi)型。 (2) getWriter(): publicPrintWritergetWriter()throwsIOException此方法將返回PrintWriter對(duì)象,把servlet的結(jié)果作為文本返回給調(diào)用者。PrintWriter對(duì)象自動(dòng)把Java內(nèi)部的Unicode編碼字符轉(zhuǎn)換成正確的編碼以使客戶(hù)端能夠閱讀。 (3) getOutputSt

53、ream(): (4) setHeader():第66頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 7、HttpSession接口 這個(gè)接口被 Servlet 引擎用來(lái)實(shí)現(xiàn)在 HTTP客戶(hù)端和 HTTP 會(huì)話(huà)兩者的關(guān)聯(lián)。這種關(guān)聯(lián)可能在多次連接和請(qǐng)求中持續(xù)一段給定的時(shí)間。 Session 用來(lái)在無(wú)狀態(tài)的 HTTP 協(xié)議下越過(guò)多個(gè)請(qǐng)求頁(yè)面來(lái)維持狀態(tài)和識(shí)別用戶(hù)。一個(gè) Session 可以通過(guò) Cookie 或重寫(xiě) URL 來(lái)維持。其方法有:getCreationTime()、getId()、getLastAccessedTime()、getMaxInactiveInterval

54、()、getValue()、getValueNames()、invalidate()、iSNew()、putValue()、removeValue()、setMaxInactiveInterval()等。第67頁(yè),共153頁(yè)。17.2.4 Servlet常用類(lèi)、接口和生命周期 8、 ServletConfig和ServletContext在Servlet的初始化中,初始化方法使用ServletConfig對(duì)象作為參數(shù),這個(gè)方法中將保存這個(gè)對(duì)象,以便方法getServletConfig()返回該參數(shù)。并且在該方法中重新編寫(xiě)getServletConfig()方法,以便能夠從新的位置得到該對(duì)象。在

55、下面的例子中,初始化方法就是調(diào)用super.init(config)方法來(lái)管理安排ServletConfig對(duì)象的,代碼如下: public void init(ServletConfig config)throws ServletException Super.init(config); / 初始化的操作 在服務(wù)器上使用Session對(duì)象來(lái)維持同單個(gè)客戶(hù)相關(guān)的狀態(tài),而當(dāng)為多個(gè)用戶(hù)的Web應(yīng)用維持一個(gè)狀態(tài)時(shí),則應(yīng)使用Servlet環(huán)境(ServletContext)。 ServletContext既可以用來(lái)為一個(gè)WEB應(yīng)用定義從URL到名稱(chēng)的映射,也可以用來(lái)讓Servlet在一個(gè)應(yīng)用程序中訪(fǎng)問(wèn)

56、所有客戶(hù)的共享信息。Sevlet環(huán)境的狀態(tài)信息保存在它的屬性中。有三個(gè)servletContext方法用于處理環(huán)境屬性:getAttribute、setAttribute和removeAttribute。第68頁(yè),共153頁(yè)?!纠?7-2】Servlet與表單交互的方法 第69頁(yè),共153頁(yè)。17.2.5 Servlet應(yīng)用舉例 表單是HTML中使用最廣泛的傳遞信息的手段。搞清楚Servlet與表單的交互,就在客戶(hù)端與服務(wù)器之間架起了一座橋梁。Servlet使用HttpServlet類(lèi)中的方法與表單進(jìn)行交互。1)、靜態(tài)HTML文本:information.htmlInput Informati

57、on請(qǐng)輸入信息姓名:性別: 男 女第70頁(yè),共153頁(yè)。17.2.5 Servlet應(yīng)用舉例 2)、下面是處理表單的Servlet程序FormDeal:/ FormDeal.javaimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class FormDeal extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, Serv

58、letException /處理GET請(qǐng)求的方法 response.setContentType(text/html; charset=gb2312); request.setCharacterEncoding(GB2312);/先設(shè)置Header,在這里只設(shè)置ContentType一項(xiàng)PrintWriter out = response.getWriter();/得到文本輸出WriterString name = request.getParameter(Name);/得到表單值NameString sex = request.getParameter(Sex);第71頁(yè),共153頁(yè)。17.

59、2.5 Servlet應(yīng)用舉例 /打印得到的表單值out.println();out.println();out.println();out.println(Your Infomation);out.println();out.println();out.println(Data You Posted);out.println();out.println();out.println(你的姓名:);out.println(+name+);out.println();out.println();out.println(你的性別:);out.print();第72頁(yè),共153頁(yè)。17.2.5 Ser

60、vlet應(yīng)用舉例 /打印得到的表單值if(sex.equals(1) out.println(男);else out.println(女);out.println();out.println();out.println();out.println();out.close(); /關(guān)閉Writer第73頁(yè),共153頁(yè)。17.2.5 Servlet應(yīng)用舉例 第74頁(yè),共153頁(yè)。第17章 Web服務(wù)器端編程17.1 Java Web服務(wù)器介紹17.2 Servlet介紹17.3 JSP介紹17.4 Struts介紹 第75頁(yè),共153頁(yè)。17.3 JSP介紹17.3.1 JSP的概念17.3.2

溫馨提示

  • 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)論