《Java程序設計之網絡編程》Java安全、Web編程、J2EE概述課件_第1頁
《Java程序設計之網絡編程》Java安全、Web編程、J2EE概述課件_第2頁
《Java程序設計之網絡編程》Java安全、Web編程、J2EE概述課件_第3頁
《Java程序設計之網絡編程》Java安全、Web編程、J2EE概述課件_第4頁
《Java程序設計之網絡編程》Java安全、Web編程、J2EE概述課件_第5頁
已閱讀5頁,還剩148頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Java程序設計之網絡編程 重慶大學計算機學院教學課件第1頁,共153頁。第16章 Java安全技術 第2頁,共153頁。主要內容16.1 安全基本知識 16.2 Java的安全模型 16.3 Java的密碼學結構 第3頁,共153頁。16.1 安全基本知識攻擊,保護 密碼學 ,機密性 ,認證 ,證書完整性 ,認可性 審計和日志 ,安全策略和訪問控制第4頁,共153頁。主要內容16.1 安全基本知識 16.2 Java的安全模型 16.3 Java的密碼學結構 第5頁,共153頁。16.2 Java的安全模型安全模型的演化 Java2 安全模型Java2的安全劃分 應用程序安全性小程序安全性

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

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

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

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

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

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

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

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

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

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

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

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

14、嗎? 否: 是輸入的主密碼 (如果和 keystore 密碼相同,按回車): 第24頁,共153頁。用keytool顯示證書的內容 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序號:

15、 43030437有效期間: Wed Aug 17 17:32:39 CST 2005 至: Thu Sep 06 17:32:39 CST 2007認證指紋: 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頁,共153頁。jarsignerJarsigner用于給打包后的Java程序簽名,或者驗證簽名。Jarsigner可以在簽名或者驗證簽名時,訪問由keytool創(chuàng)建的密鑰庫。 選項描述-stor

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

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

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

19、工廠第33頁,共153頁。JDK5.0提供的密碼學服務可以通過修改java.home/lib/security/java.security文件安裝密碼學服務提供者。缺省情況下,Java運行時環(huán)境已經安裝了下面的提供者: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見程序第34頁,共153頁。測試程序

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頁,共153頁。16.3.2核心類Security , Provider MessageDigest類 Signature類 Key ,KeyFactory , KeyPair ,KeyPairGenerator SecureRandom 第36頁,共153頁。16.3.3消息摘要使用MD5算法產生消息摘要也可以使用SHA1算法MessageDigest支持MD5和SHA消息摘要算法。調用getInstance()方法選擇一個合適的算法;調用update()方法準備數據輸入緩沖區(qū);digest()方法產生消息摘要;摘要的長度取決于所選擇的算法。

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

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

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

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

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

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

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

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

30、用程序設計接口(API)及相關類和方法。除了 Java Servlet API , Servlet 還可以使用用以擴展和添加到 API 的 Java 類軟件包。Servlet是一種采用 Java 來實現 CGI(Common Gate Interface) 功能的技術。Servlet本身與協(xié)議無關,與平臺也無關。也就是說Servlet所適用的網絡協(xié)議可以是多種多樣的,比如HTTP,FTP,SMTP,TELNET等,但是就目前而言,只有HTTP服務已經形成了標準的Java組件。對應的軟件包有兩個javax.servlet.http和javax.servlet.jsp,分別對應我們要講解的Serv

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

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

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

34、,不需要額外的支持軟件。 第52頁,共153頁。17.2.3 Servlet簡單例子 【例17-1】使用Servlet在客戶端輸出簡單的問候語句 /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頁,共153頁。17.2.3 Servlet簡單例子 【例17-1】使用Servlet在客戶端輸出簡單的問候語句 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /doGet()是這個Servlet的核心,真正處理請求的地方 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();/上面的語句都是向客戶端打印HTML文本 out.close(); /關閉HttpServletResponse public void destroy() / nothing to do 第54頁,共153頁。17.2.3 Servlet簡單例子 這是最簡單的一個Servlet程序,整個類從HttpServ

37、let派生,就跟Applet一樣,這個派生關系是必須的。這個Servlet必須實現doGet()方法(因為它是作為靜態(tài)頁面通過地址訪問的,這種方式在HTTP中稱為GET請求,在后面還會有更具體的講解),這是這個Servlet真正處理請求的地方,是整個Servlet的主體。doGet()有兩個參數HttpServletRequest req和 HttpServletResponse res。HttpServletRequest包含了客戶請求的各種信息,HttpServletResponse則包裝了服務器響應,主要處理對客戶機的輸出。通過javac對以上程序進行編譯,我們可以得到HelloServ

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

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

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

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

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

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

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

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

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

47、ttpServletResponseres)throwsServletException,IOException publicvoidservice(HttpServletRequestreq,HttpServletResponseres)throwsServletException, IOExceptionservice() 方法是 Servlet 的核心。每當一個客戶請求一個HttpServlet 對象,該對象的service() 方法就要被調用,而且傳遞給這個方法一個請求(ServletRequest)對象和一個響應(ServletResponse)對象作為參數。 在 HttpServl

48、et 中已存在 service() 方法。缺省的服務功能是調用與 HTTP 請求的方法相應的 do 功能。 第63頁,共153頁。 如果servlet收到一個HTTP請求而你沒有重載相應的do方法,它就返回一個說明此方法對本資源不可用的標準HTTP錯誤。下面是這些do方法的說明: 1) doGet 用來處理HTTP的GET請求。 2)doPost 用來處理HTTP的POST請求。 3)doPut用來處理HTTP的PUT請求。4)doDelete用來處理HTTP的DELETE請求。5)doHead 用來處理HTTP的HEAD請求。6)doOptions用來處理HTTP的OPTIONS請求。 7)

49、doTrace用來處理HTTP的TRACE請求 在開發(fā)以HTTP為基礎的servlet中,Servlet開發(fā)者關心方法doGet和方法doPost即可。(2)、getLatModified(): protectedlonggetLastModified(HttpServletRequestreq)第64頁,共153頁。17.2.4 Servlet常用類、接口和生命周期 5、HttpServletRequest接口 publicinterfaceHttpServletRequestextendsServletRequest 所有實現此接口的對象(例如從servlet容器傳遞的HTTP請求對象)都

50、能讓servlet通過自己的方法訪問所有請求的數據。下面是一些用來獲取表單數據的基本方法。 (1) getParameter() publicStringgetParameter(Stringkey)此方法試圖將根據查詢串中的關鍵字定位對應的參數并返回其值。如果有多個值則返回列表中的第一個值。如果請求信息中沒有指定參數,則返回null。 (2) getParametervalues(): publicStringgetParametervalues(Stringkey)如果一個參數可以返回多個值,比如復選框集合,則可以用此方法獲得對應參數的所有值。如果請求信息中沒有指定參數,則返回null。

51、(3) GetParameterNames(): PublicEnumerationgetParameterNames()此方法返回一個Enumeration對象,包含對應請求的所有參數名字列表。第65頁,共153頁。17.2.4 Servlet常用類、接口和生命周期 6、HttpServletResponse接口 publicinterfaceHttpServletResponseextendsservletResponseservlet容器提供一個實現該接口的對象并通過service()方法將它傳遞給servlet。通過此對象及其方法,servlet可以修改響應頭并返回結果。 (1)set

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

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

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

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

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

57、on請輸入信息姓名:性別: 男 女第70頁,共153頁。17.2.5 Servlet應用舉例 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請求的方法 response.setContentType(text/html; charset=gb2312); request.setCharacterEncoding(GB2312);/先設置Header,在這里只設置ContentType一項PrintWriter out = response.getWriter();/得到文本輸出WriterString name = request.getParameter(Name);/得到表單值NameString sex = request.getParameter(Sex);第71頁,共153頁。17.

59、2.5 Servlet應用舉例 /打印得到的表單值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頁,共153頁。17.2.5 Ser

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論