Servlet程序設(shè)計.ppt_第1頁
Servlet程序設(shè)計.ppt_第2頁
Servlet程序設(shè)計.ppt_第3頁
Servlet程序設(shè)計.ppt_第4頁
Servlet程序設(shè)計.ppt_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1,第十一章 Servlet程序設(shè)計,鄭莉,JAVA語言程序設(shè)計,2,目錄,11.1 Java網(wǎng)絡(luò)程序設(shè)計的基本概念 11.2 Servlet基礎(chǔ) 11.3 Servlet的生命周期 11.4 與客戶端交互 11.5 客戶端跟蹤 11.6 協(xié)作與通訊 11.7 程序舉例 11.8 本章小結(jié),3,11.1 Java網(wǎng)絡(luò)程序設(shè)計的基本概念,網(wǎng)絡(luò)將世界聯(lián)系在一起,使世界變得更加豐富多彩。同時網(wǎng)絡(luò)互連是一個內(nèi)容豐富而復(fù)雜的主題,所以這方面的程序設(shè)計涉及面很廣且不易掌握 與其他語言相比,Java語言在網(wǎng)絡(luò)應(yīng)用程序方面具有一定的優(yōu)勢。Java提供了很多內(nèi)置的網(wǎng)絡(luò)功能,使得基于Internet和Web的應(yīng)用

2、開發(fā)變得更加容易,4,11.1.1 協(xié)議,所有使用或?qū)崿F(xiàn)某種Internet服務(wù)的程序都必須遵從一個或多個網(wǎng)絡(luò)協(xié)議,這種協(xié)議很多,而IP、TCP、UDP是最為根本的三種協(xié)議,是所有其它協(xié)議的基礎(chǔ) IP(Internet Protocol,Internet協(xié)議) 是最底層的協(xié)議 定義了數(shù)據(jù)按照數(shù)據(jù)報(Datagram,一種自帶尋址信息的、獨立地從數(shù)據(jù)源走到終點的數(shù)據(jù)包)傳輸?shù)母袷胶鸵?guī)則 TCP(Transport Control Protocol,傳輸控制協(xié)議) 建立在IP之上,定義了網(wǎng)絡(luò)上程序到程序的數(shù)據(jù)傳輸格式和規(guī)則,提供了IP數(shù)據(jù)包的傳輸確認、丟失數(shù)據(jù)包的重新請求、將收到的數(shù)據(jù)包按照它們的

3、發(fā)送次序重新裝配的機制 是面向連接的協(xié)議,在開始數(shù)據(jù)傳輸之前,必須先建立明確的連接 UDP(User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議) 與TCP相似,比TCP具有更好的傳輸效率。 不可靠的,不保證數(shù)據(jù)的傳輸,也不提供重新排列次序或重新請求功能,是一種無連接協(xié)議,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,5,HTTP協(xié)議( HyperText Transfer Protocol) 是Internet眾多協(xié)議中的一種,表示超文本傳輸協(xié)議,它構(gòu)成了WWW的基礎(chǔ) 具有簡單快速、靈活、無狀態(tài)、無連接等特點 基于請求(Request)/響應(yīng)(Response)模式。其工作過程如下 首先客戶端與服

4、務(wù)器建立連接 然后客戶端發(fā)送一個請求給服務(wù)器 服務(wù)器接到請求后,給予相應(yīng)的響應(yīng)信息;最后關(guān)閉連接,完成一次操作,11.1.1 協(xié)議(續(xù)) HTTP協(xié)議,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,6,客戶端發(fā)送給服務(wù)器的請求 有很多類型,被稱為方法,其中最常用的是GET、POST GET方法 用來從服務(wù)器讀取信息,比如從服務(wù)器讀取文件、表格、數(shù)據(jù)庫查詢結(jié)果等 POST方法 用來向服務(wù)器傳送信息,比如把信用卡號、表格、存儲于數(shù)據(jù)庫的數(shù)據(jù)等傳送到服務(wù)器 HEAD方法 用來讀取服務(wù)器響應(yīng)頭(Response Head);得到諸如文件大小,文件最后修改時間,服務(wù)器類型等信息 PUT方法 將文件直接傳到服務(wù)器 DE

5、LETE方法 將文件直接從服務(wù)器刪除 TRACE方法 用來協(xié)助程序調(diào)試 OPTIONS方法 用來查詢服務(wù)器所支持的方法,11.1.1 協(xié)議(續(xù)) HTTP協(xié)議中客戶端發(fā)送給服務(wù)器的請求,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,7,11.1.2 關(guān)于URI,URI(Uniform Resource Identifier,統(tǒng)一資源標志符) HTTP協(xié)議用URI標識定位網(wǎng)絡(luò)上的數(shù)據(jù) 如果知道了公布在網(wǎng)絡(luò)上的某個HTML文件的URI,不管文件位于什么地方,都可以通過HTTP訪問該文檔 通常所說的URL是URI的一種,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,8,URL類 Java語言提供了URL類讓我們能在源代碼層使用

6、URL 有六個構(gòu)造函數(shù),其中最簡單的是URL(String url)。每個URL對象都封裝了資源的標識符和協(xié)議處理程序,可以調(diào)用URL的方法來提取URL的組件 把URL對象作為AppletContext接口的showDocument方法的參數(shù),就可以使執(zhí)行applet的瀏覽器顯示URL所指定的資源,11.1.2 關(guān)于URI(續(xù)) URL類,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,9,applet瀏覽指定URL舉例: ShowDocument.java import .*; import java.util.*; import java.awt.*; import java.awt.event.*; i

7、mport java.applet.AppletContext; import javax.swing.*; import javax.swing.event.*; public class ShowDocument extends JApplet public void init() JButton goButton = new JButton(Link to ); Container myContainer = getContentPane(); myContainer.add( new JLabel(Link to SOHU),BorderLayout.NORTH); myContain

8、er.add(goButton,BorderLayout.SOUTH); goButton.addActionListener(new ButtonListener(); ,11.1.2 關(guān)于URI(續(xù)) 例11_1,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,10,class ButtonListener implements ActionListener public void actionPerformed(ActionEvent e) try URL newDocument = new URL(); AppletContext browser = getAppletContext(); brows

9、er.showDocument(newDocument); catch(Exception URLException) ,11.1.2 關(guān)于URI(續(xù)) 例11_1,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,11,11.1.3 基于套接字的有連接通信,基于套接字(socket)的有連接通信 使用TCP協(xié)議 一個socket必須在發(fā)送數(shù)據(jù)之前與目的地的socket取得連接 一旦連接建立了,sockets就可以使用一個流接口完成打開-讀-寫-關(guān)閉,所有的發(fā)送的信息都會在另一端以同樣的順序被接收 面向連接的操作比無連接的操作效率低,但是數(shù)據(jù)的安全性高,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,12,用Java建立簡單的

10、服務(wù)器程序需要五個步驟 Step1:創(chuàng)建ServerSocket對象 ServerSocket myServer = new ServerSocket (int port, int backlog); Port 指定一個可用的端口號,用來定位服務(wù)器上的服務(wù)器應(yīng)用程序 backlog指定能夠連接到服務(wù)器的最多客戶數(shù)。連接客戶達到由backlog指定的最大客戶數(shù)量時,服務(wù)器將拒絕客戶連接 Step 2:通過ServerSocket的accept方法監(jiān)聽客戶連接,服務(wù)器無限期的監(jiān)聽客戶連接 Socket connection = myServer.accept(); 有一個客戶連接時,將產(chǎn)生并返回一

11、個socket,11.1.3 基于套接字的有連接通信(續(xù)) 服務(wù)器端,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,13,Step 3:通過Socket的方法getInputStream和getOutputStream獲取InputStream和OutputStream對象;通常將其他流類型和它們聯(lián)系起來,如: ObjectInputStream input = new ObjectInputStream( connection.getInputStream( ) ); ObjectOutputStream output = new ObjectOutputStream( connection.getOut

12、putStream( ) ); Step 4:客戶和服務(wù)器通過OutputStream和InputStream對象進行通信 Step 5:通信傳輸完畢,服務(wù)器通過調(diào)用流和套接字的close方法關(guān)閉連接,11.1.3 基于套接字的有連接通信(續(xù)) 服務(wù)器端,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,14,在客戶端建立簡單連接的思路類似,可分為四步 Step 1:建立一個Socket,實現(xiàn)與服務(wù)器的連接 Socket connection = new Socket ( InetAddress address, int port); address:服務(wù)器IP地址。port:端口號 連接成功,將返回一個Soc

13、ket,否則產(chǎn)生異常 Step 2:通過getInputStream和getOutputStream分別獲取Socket的InputStream和OutputStream的引用。同樣,也可以將其他流類型與InputStream和OutputStream聯(lián)系起來 Step 3:客戶與服務(wù)器通過InputStream和OutputStream進行通信 Step 4:傳輸完畢后,通過調(diào)用流和套接字的close方法關(guān)閉連接,11.1.3 基于套接字的有連接通信(續(xù)) 客戶端,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,15,11.4 數(shù)據(jù)報通信,數(shù)據(jù)報通信(Datagram Communication) 使用用戶

14、數(shù)據(jù)報協(xié)議 ( User Datagram Protocol, UDP) 與TCP不同的一種協(xié)議 不能保證數(shù)據(jù)會被成功地送達,也不保證數(shù)據(jù)抵達的次序與送出的次序相同,所以也被稱為“不可靠的通信協(xié)議”,雖然可靠性不高,但是它的速度很快,所以有些場合也有很大的用處 服務(wù)器通過DatagramSocket接收或發(fā)送信息,這些信息以DatagramPackets 的形式存在 DatagramSocket mySocket = new DatagramSocket ( int port ); port表示端口,上述語句將服務(wù)器綁定到一個可以從客戶端接收packet的端口上,如果綁定失敗,將產(chǎn)生Socke

15、tException異常,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,16,客戶端應(yīng)用程序的工作流程 Step1:通過創(chuàng)建一個DatagramSocket對象來建立數(shù)據(jù)報通訊的Socket。有如下兩種構(gòu)造方法 public DatagramSocket() 構(gòu)造一個數(shù)據(jù)報socket,并使其與本地主機任一可用的端口連接。若打不開socket則拋出SocketException異常。 public DatagramSocket(int port) 構(gòu)造一個數(shù)據(jù)報socket,并使其與本地主機指定的端口連接。若打不開socket或socket無法與指定的端口連接則拋出SocketException異常,11.

16、1.4 數(shù)據(jù)報通信(續(xù)) 客戶端,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,17,Step 2:用DatagramPacket類來創(chuàng)建一個數(shù)據(jù)報包,用來實現(xiàn)無連接的包傳送服務(wù) DatagramPacket對象封裝了數(shù)據(jù)報包的數(shù)據(jù)(bufferedarray,包長度(length),目標地址(address),目標端口(port);length必須小于等于bufferedarry.length DatagramPacket(byte bufferedarray, int length, InetAddress address, int port) DatagramPacket類提供了四個方法來獲取信息 p

17、ublic byte getData() 返回一個字節(jié)數(shù)組,包含收到或要發(fā)送的數(shù)據(jù)報中的數(shù)據(jù) public int getLength() 返回發(fā)送或接收到的數(shù)據(jù)的長度 public InetAddress getAddress() 返回一個發(fā)送或接收此數(shù)據(jù)報包文的機器的IP地址 public int getPort() 返回發(fā)送或接收數(shù)據(jù)報的遠程主機的端口號,11.1.4 數(shù)據(jù)報通信(續(xù)) 客戶端,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,18,Step 3:調(diào)用DatagramSocket對象的send(DatagramPacket p)方法發(fā)送數(shù)據(jù)報文包 Step 4:調(diào)用DatagramSock

18、et對象的receive(DatagramPacket p)方法接收從服務(wù)器返回的結(jié)果數(shù)據(jù)報文包 該DatagramPacket對象用到另一種構(gòu)造方法,只需指明存放接收的數(shù)據(jù)報的緩沖區(qū)和長度 DatagramPacket(byte bufferedarray, int length) receive方法會一直阻塞,直到收到一個數(shù)據(jù)報文包,此時DatagramPacket的緩沖區(qū)中包含的就是接收到的數(shù)據(jù),也包含發(fā)送者的IP地址,發(fā)送者機器上的端口號等信息 Step 5:處理接收緩沖區(qū)內(nèi)的數(shù)據(jù),獲取服務(wù)結(jié)果 Step 6:通訊完成后,使用DatagramSocket對象的close()方法來關(guān)閉數(shù)

19、據(jù)報通訊Socket,11.1.4 數(shù)據(jù)報通信(續(xù)) 客戶端,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,19,服務(wù)器端應(yīng)用程序的工作流程 與客戶端應(yīng)用程序的通訊過程使非常相似 建立數(shù)據(jù)報通訊DatagramSocket 構(gòu)建數(shù)據(jù)報文包DatagramPacket 接收數(shù)據(jù)報和發(fā)送數(shù)據(jù)報,處理接收緩沖區(qū)內(nèi)的數(shù)據(jù) 通訊完畢后,關(guān)閉數(shù)據(jù)報通訊Socket 不同的是,服務(wù)器應(yīng)用程序要面向網(wǎng)絡(luò)中的所有計算機,所以服務(wù)器應(yīng)用程序收到一個包文后要分析它,得到數(shù)據(jù)報的源地址信息,這樣才能創(chuàng)建正確的返回結(jié)果報文給客戶機,11.1.4 數(shù)據(jù)報通信(續(xù)) 服務(wù)器端,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,20,11.5 Servle

20、t,Servlet 是用java技術(shù)來實現(xiàn)CGI(Common Gateway Interface, 通用網(wǎng)關(guān)接口)功能的編程 介于瀏覽器(或其他HTTP客戶端)與服務(wù)器之間,起到橋梁的作用。具體作用為: 讀取客戶端發(fā)送的數(shù)據(jù) 獲取客戶請(request)中所包含的信息 產(chǎn)生響應(yīng)結(jié)果,并將結(jié)果包含到一個文件中,比如HTML文件中 設(shè)置HTTP響應(yīng)參數(shù),比如告訴瀏覽器,文件類型為HTML 將文件返回給客戶端 Servlet的應(yīng)用并不限于處理HTTP請求的網(wǎng)頁或者應(yīng)用程序服務(wù)中,還可以置入到郵件或FTP服務(wù)程序中,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,21,與傳統(tǒng)的CGI相比,Servlet具有很多優(yōu)點

21、 高效率 通過Servlet,Java虛擬機用輕量級的Java線程處理每個請求。同時有N個請求的情況下,CGI程序需要被調(diào)入到服務(wù)器內(nèi)存N次;對于Servlet將開啟N個線程,但僅僅調(diào)入一個Servlet實例到內(nèi)存中 應(yīng)用方便 Servlet在解析和譯碼HTML數(shù)據(jù),讀取設(shè)置HTML標題,操作Cookie等很多方面,應(yīng)用更加方便。繼承自java的特點,其可靠性與復(fù)用性好 功能強大 Servlet可以直接與Web服務(wù)程序?qū)υ?;多個Servlet可以共享數(shù)據(jù);Servlet與數(shù)據(jù)庫的連接也比較簡單等,11.1.5 Servlet(續(xù)) 優(yōu)點,Java網(wǎng)絡(luò)程序設(shè)計的基本概念,22,便攜性好 Serv

22、let用Java語言編寫,遵循標準的API。因此Servlet編寫的程序可以無任何修改的在Apache,Microsoft Internet Information Server(IIS),IBM WebSphere,或者StarNine WebStar 上運行。同樣具有一次編譯,到處運行移植性好的特點 安全 基于Java語言的安全特性,Servlet的安全性也比較可靠 成本低 有很多免費或相對比較便宜的Web服務(wù)器,適合做個人的或者小容量的網(wǎng)站。而且很多商業(yè)級的Web服務(wù)器相對也比較便宜。而且使一個服務(wù)器支持Servlet所需的額外花費也很少,11.1.5 Servlet(續(xù)) 優(yōu)點,Jav

23、a網(wǎng)絡(luò)程序設(shè)計的基本概念,23,11.2 Servlet基礎(chǔ),本節(jié)內(nèi)容包括 Servlet容器、web服務(wù)器、應(yīng)用服務(wù)器 Web應(yīng)用程序 Servlet API Servlet的基本結(jié)構(gòu) Servlet編譯和安裝,24,11.2.1 Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器,Servlet容器 也稱為Servlet引擎 是一個編譯好的可執(zhí)行程序,它是web服務(wù)器與servlet間的的媒介 負責將請求翻譯成Servlet能夠理解的形式傳遞給servlet,同時傳給servlet一個對象使之可以送回響應(yīng) 負責管理servlet的生命周期,Servlet 基礎(chǔ),25,web服務(wù)器 能夠處理Htt

24、p請求的服務(wù)器 可以提供靜態(tài)頁面、圖像等 有的web服務(wù)器也支持動態(tài)頁面的生成,支持JSP、Servlet等,具有JVM 應(yīng)用服務(wù)器 可以處理基于多種協(xié)議的請求,當然也包括Http協(xié)議 可以支持servlets和JSP,以及所有其他J2EE服務(wù),包括JNDI、EJBs、JMS等,11.2.1 Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器(續(xù)),Servlet 基礎(chǔ),26,servlet容器可以與web服務(wù)器協(xié)作提供對servlet的支持 一些servlet容器(如Apache Tomcat)自己也可以作為獨立的web服務(wù)器運行 隨著servlet和JSP的流行,一些主要的Web服務(wù)器和應(yīng)用程序

25、服務(wù)器都直接或者通過插件支持servlet和JSP。如: Sun ONE Application Server Lotus Domino Go WebServer BEA weblogic Tengah Server WebSphere應(yīng)用服務(wù)器 Jigsaw NetForge AcmeServer Mot Bays Jetty,11.2.1 Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器(續(xù)),Servlet 基礎(chǔ),27,Apache Tomcat 5 是servlet2.4和JSP2.0規(guī)范的官方參考實現(xiàn) 完全免費,并且提供完整的源代碼 可以到

26、/tomcat/ 下載最新版本 初始設(shè)置 設(shè)置JAVA_HOME。假設(shè)JDK安裝在C: j2sdk1.4.2,可以仿照path和classpath的設(shè)置方法,新建一個環(huán)境變量:JAVA_HOMEC: j2sdk1.4.2,11.2.1 Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器(續(xù)) Apache Tomcat 5服務(wù)器及其初始設(shè)置,Servlet 基礎(chǔ),28,為方便調(diào)試,還可進行如下設(shè)置 啟動servlet重新載入功能(所請求servlet類文件發(fā)生變化后,自動重新載入到服務(wù)器內(nèi)存)。打開install_dir/conf/server.xml,在注釋 后插入語句 開啟servlet調(diào)用器i

27、nvoker servlet(可以不修改Web應(yīng)用的web.xml文件即可運行servlet)。打開install_dir/conf/web.xml,將servlet-mapping元素取消注釋 invoker /servlet/* ,11.2.1 Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器(續(xù)) Apache Tomcat 5服務(wù)器及其初始設(shè)置,Servlet 基礎(chǔ),29,11.2.2 Web應(yīng)用程序,Web應(yīng)用程序 組成部分包括servlet、JSP及其支持文件 這些組成部分需要進行部署 通常部署在Tomcat的webapps子目錄中。一般其目錄結(jié)構(gòu)包括根目錄(context root)

28、和幾個子目錄,也可以把子目錄捆綁到一個類型為war的存檔文件中,Servlet 基礎(chǔ),30,11.2.2 Web應(yīng)用程序(續(xù)),webapps子目錄一般包括, WEB-INF 包含Web應(yīng)用程序的部署描述文件(web.xml) 在web.xml文件中配置Web應(yīng)用程序??梢灾朴喐鞣N配置參數(shù):調(diào)用servlet的名稱、servlet的描述、servlet的完全的類名和servlet容器調(diào)用servlet的路徑 修改web.xml的部署描述符后,需要重新啟動Tomcat服務(wù)器 WEB-INF/classes 包括Web應(yīng)用程序中所使用的servlet和實用工具類文件。如果類文件是包的組成部分,則包

29、的目錄結(jié)構(gòu)從該目錄開始 WEB-INF/lib 包含Java存檔文件(JAR文件),是servlet和實用工具類文件,Servlet 基礎(chǔ),31,11.2.2 Web應(yīng)用程序(續(xù)),Servlet 基礎(chǔ),32,11.2.3 Servlet API,Servlet API 開發(fā)servlet和JSP程序,需要參考Servlet API文檔 包含javax.servlet和javax.servlet.http兩個包中 所有servlet須實現(xiàn)javax.servlet.Servlet接口,通常繼承如下兩個類中的一個 GenericServlet HttpServlet,Servlet 基礎(chǔ),33,

30、Servlet接口 所有servlets 必須實現(xiàn)這一接口 Servlet接口的所有方法都是被自動調(diào)用的 HttpServlet類 覆蓋了javax.servlet.Servlet接口的service方法 service方法由servlet容器調(diào)用,對客戶端的請求作出響應(yīng)。它會根據(jù)請求類型的不同自動調(diào)用doGet或doPost等方法 能夠處理兩個最普通的 HTTP 請求類型 doGet方法 響應(yīng) get 請求 doPost 方法響應(yīng) post 請求,Servlet 基礎(chǔ),11.2.3 Servlet API(續(xù)),34,11.2.3 Servlet API(續(xù)),HttpServletRequ

31、est接口 由Web服務(wù)器創(chuàng)建該接口的一個對象,并將其傳遞給servlet的 service 方法 該類對象含有來自于客戶端的請求 HttpServletResponse接口 由Web服務(wù)器創(chuàng)建該接口的一個 對象,并將其傳送給servlet的 service 方法 通過該類對象服務(wù)器端可以對客戶端發(fā)出響應(yīng)信息,Servlet 基礎(chǔ),35,11.2.3 Servlet API(續(xù)) HttpServletRequest接口,Servlet 基礎(chǔ),36,11.2.3 Servlet API(續(xù)) HttpServletResponse接口,Servlet 基礎(chǔ),37,11.2.4 Servlet的

32、基本結(jié)構(gòu),Servlet的基本結(jié)構(gòu) 一般擴展自HttpServlet 復(fù)寫doGet或者doPost方法 doGet或doPost都接收兩個類型的參數(shù):HttpServletRequest和HttpServletResponse 通過HttpServletRequest,可以得到所有的輸入數(shù)據(jù),比如表單數(shù)據(jù)、HTTP請求報頭等客戶信息 通過HttpServletResponse可以指定輸出信息 由于doGet和doPost方法可能生成異常,必須在方法名稱后聲明拋出異?;蛘哂胻ry-catch語句處理異常,Servlet 基礎(chǔ),38,GET請求是WEB瀏覽器請求的常見類型,用來請求Web頁面。

33、本例中通過doGet方法處理GET請求。在doGet方法中通過HttpServletResponse對象得到PrintWriter,然后將一個文檔發(fā)給客戶。最終在客戶端生成一個網(wǎng)頁 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet public void doGet( HttpServletRequest req, HttpServletResponse res) throws ServletException, IO

34、Exception res.setContentType(text/html); PrintWriter out = res. getWriter(); out.println(); out.println(My First Servlet ); out.println(); out.println( First Servlet ); out.println(); ,11.2.4 Servlet的基本結(jié)構(gòu)(續(xù)) 例11_2,Servlet 基礎(chǔ),39,11.2.5 Servlet編譯和安裝,編譯在設(shè)置好path和classpath的前提下,servlet的編譯和普通的java程序完全相同 可以

35、通過javac.exe編譯,比如可以在Dos環(huán)境下輸入: javac MyServlet.java 也可以通過集成開發(fā)環(huán)境(IDE)編譯 復(fù)制編譯成功之后,將生成的類文件復(fù)制到相應(yīng)的目錄下即可。在Tomcat服務(wù)器上,此目錄可能是 install_dirwebappsROOTWEB-INFclasses 運行啟動Tomcat服務(wù)器,在地址欄輸入 http:/localhost:8080/servlet/MyServlet,Servlet 基礎(chǔ),40,11.3 Servlet的生命周期,首先服務(wù)器僅創(chuàng)建servlet的一個實例 創(chuàng)建servlet實例時,它的init方法都會被調(diào)用 針對每個客戶端

36、的每個請求,都會創(chuàng)建一個線程 該線程調(diào)用servlet實例的service方法 Service方法根據(jù)收到HTTP請求得類型,調(diào)用doGet,doPost或者其他方法 多個并發(fā)請求,一般會導致多個線程同時調(diào)用service方法,通過單線程模式(SingleThreadModel)也可以規(guī)定任何時間僅允許一個線程運行 最后,卸載servlet 服務(wù)器調(diào)用servlet的destroy方法,41,11.3 Servlet的生命周期(續(xù)) Servlet生命周期示意圖,服務(wù)器,服務(wù)器,Servlet代碼,服務(wù)器,客戶端,客戶端,裝載,Servlet代碼,卸載,Servlet代碼,處理 客戶端請求,S

37、ervlet 的生命周期,42,11.3.1 初始化,servlet的初始化 服務(wù)器啟動,servlet被用戶首次調(diào)用,服務(wù)器構(gòu)造servlet實例之后,即立刻調(diào)用init(ServletConfig)方法,執(zhí)行servlet實例的初始化工作 ServeletConfig對象包含servlet初始化所需的很多參數(shù),比如計數(shù)器、默認值等 init方法都會在servlet處理客戶請求(request)之前被調(diào)用 一旦init方法被調(diào)用,只有服務(wù)器通過destroy方法銷毀servlet之后,init方法才能再次被調(diào)用,Servlet 的生命周期,43,11.3.1 初始化(續(xù)),init方法的定義

38、 public void init(ServletConfig config) throws ServletException super.init(config); String greeting = getInitParameter(greeting); / Initialization code ,Servlet 的生命周期,44,11.3.2 銷毀,servlet的銷毀 服務(wù)器卸載servlet實例之前,需要先調(diào)用servlet的destroy方法 釋放servlet所獲得的資源 使servlet有機會關(guān)閉數(shù)據(jù)庫連接、停止后臺運行的線程、將cookie列表和點擊數(shù)寫入到磁盤 執(zhí)行其他清

39、理活動,Servlet 的生命周期,45,11.4 與客戶端交互,HTTP servlet與客戶端的交互 通過service方法處理客戶端的請求 service方法根據(jù)請求(request)類型的不同,調(diào)用不同的方法 對于GET請求,調(diào)用doGet( )方法進行處理 對于POST請求,調(diào)用doPost( )方法進行處理,46,11.4.1 提取Servlet信息,注冊的servlet都有相關(guān)的很多初始化參數(shù) 這些初始化參數(shù)寫在web.xml中,具體語法格式請參閱Tomcat文檔 getInitParameter()方法 可以得到servlet初始化的一些參數(shù) 返回一個指定參數(shù)的值(String

40、類型) 如果指定參數(shù)不存在,則返回null getInitParameterNames()方法 可以得到初始化參數(shù)名稱 返回String類型的Enumeration類型數(shù)據(jù) 如果不存在初始化參數(shù),則返回一個null的Enumeration,與客戶端交互,47,通過servlet初始化參數(shù)建立一個數(shù)據(jù)庫連接的程序段如下 java.sql.Connection con = null; public void init(ServletConfig config) throws ServletException super.init(config); String host = getInitPara

41、meter(host); int port = Integer.parseInt(getInitParameter(port); String db = getInitParameter(db); String user = getInitParameter(user); String password = getInitParameter(password); String proxy = getInitParameter(proxy); con = establishConnection(host, port, db, user, password, proxy); ,11.4.1 提取S

42、ervlet信息(續(xù)) 通過初始化建立數(shù)據(jù)庫連接,與客戶端交互,48,輸出全部初始化參數(shù)名稱 import java.io.*; import java.util.*; import javax.servlet.*; public class PrintInitParaNames extends GenericServlet public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException res.setContentType(text/plain); PrintW

43、riter out = res.getWriter(); out.println(Init Parameters As Following:); Enumeration enum = getInitParameterNames(); while (enum.hasMoreElements() String name = (String) enum.nextElement(); out.println(name : + getInitParameter(name); ,11.4.1 提取Servlet信息(續(xù)) PrintInitParaNames.java,與客戶端交互,49,11.4.2 提

44、取服務(wù)器信息,servlet可以得到很多服務(wù)器相關(guān)的信息,同時可以將這些信息發(fā)送到客戶端 getServerName()返回服務(wù)器名稱 getServerPort()返回服務(wù)器監(jiān)聽端口 getServerInfo()輸出服務(wù)器程序和版本,之間用“/”分開 getAttribute()返回服務(wù)程序的屬性 得到路徑相關(guān)的信息 public String HttpServletRequest.getPathInfo() public String HttpServletRequest.getPathTranslated(),與客戶端交互,50,提取服務(wù)器信息舉例 import java.io.*;

45、import java.util.*; import javax.servlet.*; public class ServerSnoop extends GenericServlet public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException res.setContentType(text/plain); PrintWriter out = res.getWriter(); out.println(req.getServerName() output: + r

46、eq.getServerName(); out.println(req.getServerPort() output: + req.getServerPort(); out.println(getServletContext().getServerInfo() output: + getServletContext().getServerInfo() ); out.println(getServletContext().getAttribute(attribute) output: + getServletContext().getAttribute(attribute) ); ,11.4.2

47、 提取服務(wù)器信息(續(xù)) 例11_3,與客戶端交互,51,11.4.3 提取客戶端信息,服務(wù)器可以從request得到很多客戶端的信息 getRemoteAddr():得到IP地址 getRemoteHost():得到客戶端機器的名稱 利用InetAddress.getByName()方法可以將IP地址或客戶端機器名稱轉(zhuǎn)換成一個.InetAddress類型的對象 InetAddress remoteInetAddress = InetAddress.getByName(req.getRemoteAddr(); 通過獲取客戶端的地址,并判斷是否隸屬某個范圍,可以限制某個地區(qū)的用戶訪問你的網(wǎng)站,與客

48、戶端交互,52,11.4.3 提取客戶端信息(續(xù)),服務(wù)器可以得到客戶想做的事情 客戶請求表現(xiàn)為表單數(shù)據(jù),由“名/值”對組成。當提交某一個網(wǎng)頁的時候常常在瀏覽器地址欄中看到類似格式的數(shù)據(jù)格式 name/value,每對之間用 import .*; import javax.servlet.*; import javax.servlet.http.*; public class QueryServlet extends HttpServlet public void doGet(HttpServletRequest req, HttpServletResponse res) throws Ser

49、vletException, IOException res.setContentType(text/html;charset=UTF-8); String queryBookValue=req.getParameter(Book); PrintWriter out = res.getWriter(); out.println(The book you wanted is:+queryBookValue); out.close(); ,11.4.3 提取客戶端信息(續(xù)) QueryServlet.java,與客戶端交互,55,11.4.3 提取客戶端信息(續(xù)) query.html與Query

50、Servlet運行結(jié)果,與客戶端交互,56,11.4.4 發(fā)送HTML信息,Web服務(wù)器響應(yīng)(response)的構(gòu)成 狀態(tài)行 由http版本(HTTP/1.1),一個狀態(tài)代碼(200)和一段對應(yīng)狀態(tài)代碼的簡短消息(OK)組成 一些響應(yīng)報頭、 Content-Type: text/html 指定后面文檔MIME類型,后面的其他報頭可選。常用MIME類型有: text/html : HTML文檔 text/plain: 純文本 text/xml: XML image/jpeg:JEPG圖像 application/msword: Microsoft Word文檔 application/pdf:

51、crobat文件 application/zip:Zip檔案 一個空行和響應(yīng)的文檔,與客戶端交互,57,HTTP/1.1 200 OK /狀態(tài)行 Content-Type: text/html /報頭 Header2: HeaderN: /空行 /文檔 head code ,11.4.4 發(fā)送HTML信息(續(xù)),與客戶端交互,58,向客戶端輸出一個簡單網(wǎng)頁,顯示“Hello World!” import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends

52、HttpServlet public void doGet( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException res.setContentType(text/html); PrintWriter out = res.getWriter(); out.println(); out.println(Hello World); out.println(); out.println(Hello World!); out.println(); ,11.4.4 發(fā)送HTML信息(續(xù)

53、) 例11_4,與客戶端交互,59,程序說明 HelloWorld繼承了HttpServlet,然后重寫doGet方法 在doGet方法中,首先將HTTP Content-Type響應(yīng)報頭設(shè)置為text/html,即指定響應(yīng)的類型為HTML文檔;然后通過getWriter()得到PrintWriter類型的一個對象out,按照HTML格式輸出一個簡單網(wǎng)頁 運行結(jié)果,11.4.4 發(fā)送HTML信息(續(xù)) 例11_4運行結(jié)果,與客戶端交互,60,11.5 客戶端跟蹤,客戶端跟蹤 HTTP是無狀態(tài)協(xié)議,服務(wù)器不能自動維護客戶連接的上下文信息 許多情況下,Web服務(wù)器必須要能夠跟蹤用戶的狀態(tài) 比如購物

54、網(wǎng)站和電子郵件網(wǎng)站,當用戶登錄以后,其身份和一系列的操作狀態(tài)都需要被跟蹤并保持 servlet API提供了兩種可以跟蹤客戶端狀態(tài)的方法 Cookie Session,61,11.5.1 使用Cookie,Cookie 是Web服務(wù)器保存在用戶硬盤上的一段文本,Web服務(wù)器將它發(fā)送到瀏覽器 之后,當再次訪問同一網(wǎng)絡(luò)時,瀏覽器將它原封不動的返回 其中的信息片斷以名/值對(name-value pairs)的形式儲存 使用這種方法,網(wǎng)站可以維護客戶的連接。這種用途可以體現(xiàn)在如下幾點 在電子商務(wù)中標識用戶,實現(xiàn)短期跟蹤用戶 記錄用戶名和用戶密碼,允許用戶下次自動登陸 定制站點,記錄用戶的偏好 定向廣

55、告,記錄用戶感興趣的主題,并顯示與之相關(guān)的廣告,客戶端跟蹤,62,調(diào)用Cookie的構(gòu)造函數(shù)可創(chuàng)建一個cookie 構(gòu)造方法接受兩個字符串參數(shù) cookie名稱 cookie的值 例如創(chuàng)建一個名為CookieName,值為John的cookie,可以使用下面的語句 Cookie login = new Cookie(“CookieName”, ”John”);,客戶端跟蹤,11.5.1 使用Cookie(續(xù)) 創(chuàng)建Cookie對象,63,創(chuàng)建了一個名為login的cookie之后,可通過很多現(xiàn)有的方法設(shè)置cookie的值和屬性 可通過如下語句設(shè)置cookie的注釋: login.setCome

56、nt(“You can get UserName form this cookie”); 創(chuàng)建cookie并將它發(fā)送到瀏覽器后,默認情況下,它是會話級的cookie,僅僅存儲在瀏覽器內(nèi)存中,用戶退出瀏覽器后,cookie將被刪除;如果希望將cookie存儲在磁盤上,則需要設(shè)定MaxAge,給出一個以秒為單位的生命周期,如下可以將生命設(shè)置為一天 login.setMaxAge(60*60*24)/ one day setPath(),setValue(),setVersion(),setDomain(),setSecure()等,相關(guān)的具體用法請查看servlet API,11.5.1 使用Co

57、okie(續(xù)) 設(shè)置Cookie屬性,客戶端跟蹤,64,剛創(chuàng)建的cookie存在于服務(wù)器內(nèi)存中。必須將它發(fā)送到客戶端,cookie才能真正的發(fā)揮作用。發(fā)送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個HTTP響應(yīng)報頭。發(fā)送的語句如下 public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException Cookie login = new Cookie(“UserName”, ”John”);

58、login.setComent(“You can get UserName form this cookie”); res.addCookie(login); /. ,客戶端跟蹤,11.5.1 使用Cookie(續(xù)) 發(fā)送Cookie到客戶端,65,從客戶端讀取你感興趣的cookie,需要兩個步驟 首先調(diào)用request.getCookies得到一個Cookie對象的數(shù)組 然后調(diào)用每個cookie的getName方法,從數(shù)組中尋找所需的cookie String nameString = “UserName” Cookie cookies = request.getCookies(); for ( int i=0; icookies.length; i+) Cookie cookie = cookiesi; if (nameString.equals( cookie.getName() ) / do something / cookies.setMaxAge(0); 找到感興趣的cookie之后,便可以操作此cookie, 如通過getValue方法得到相關(guān)cookie的值,設(shè)置MaxAge等,客戶端跟蹤,11.5.1 使用Cookie(續(xù)) 從客戶讀取Cookie,66,1

溫馨提示

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

評論

0/150

提交評論