




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第十一章Servlet程序設(shè)計JAVA語言程序設(shè)計1第十一章Servlet程序設(shè)計JAVA語言程序設(shè)計1目錄11.1Java網(wǎng)絡(luò)程序設(shè)計的基本概念11.2Servlet基礎(chǔ)11.3Servlet的生命周期11.4與客戶端交互11.5客戶端跟蹤11.6協(xié)作與通訊11.7程序舉例11.8本章小結(jié)2目錄11.1Java網(wǎng)絡(luò)程序設(shè)計的基本概念211.1Java網(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)用開發(fā)變得更加容易311.1Java網(wǎng)絡(luò)程序設(shè)計的基本概念網(wǎng)絡(luò)將世界聯(lián)系在一起11.1.1協(xié)議所有使用或?qū)崿F(xiàn)某種Internet服務(wù)的程序都必須遵從一個或多個網(wǎng)絡(luò)協(xié)議,這種協(xié)議很多,而IP、TCP、UDP是最為根本的三種協(xié)議,是所有其它協(xié)議的基礎(chǔ)IP(InternetProtocol,Internet協(xié)議)是最底層的協(xié)議定義了數(shù)據(jù)按照數(shù)據(jù)報(Datagram,一種自帶尋址信息的、獨立地從數(shù)據(jù)源走到終點的數(shù)據(jù)包)傳輸?shù)母袷胶鸵?guī)則TCP(TransportControlProtocol,傳輸控制協(xié)議)建立在IP之上,定義了網(wǎng)絡(luò)上程序到程序的數(shù)據(jù)傳輸格式和規(guī)則,提供了IP數(shù)據(jù)包的傳輸確認、丟失數(shù)據(jù)包的重新請求、將收到的數(shù)據(jù)包按照它們的發(fā)送次序重新裝配的機制是面向連接的協(xié)議,在開始數(shù)據(jù)傳輸之前,必須先建立明確的連接UDP(UserDatagramProtocol,用戶數(shù)據(jù)報協(xié)議)與TCP相似,比TCP具有更好的傳輸效率。不可靠的,不保證數(shù)據(jù)的傳輸,也不提供重新排列次序或重新請求功能,是一種無連接協(xié)議Java網(wǎng)絡(luò)程序設(shè)計的基本概念411.1.1協(xié)議所有使用或?qū)崿F(xiàn)某種Internet服務(wù)的程HTTP協(xié)議(HyperTextTransferProtocol)是Internet眾多協(xié)議中的一種,表示超文本傳輸協(xié)議,它構(gòu)成了WWW的基礎(chǔ)具有簡單快速、靈活、無狀態(tài)、無連接等特點基于請求(Request)/響應(yīng)(Response)模式。其工作過程如下首先客戶端與服務(wù)器建立連接然后客戶端發(fā)送一個請求給服務(wù)器服務(wù)器接到請求后,給予相應(yīng)的響應(yīng)信息;最后關(guān)閉連接,完成一次操作11.1.1協(xié)議(續(xù))
——HTTP協(xié)議Java網(wǎng)絡(luò)程序設(shè)計的基本概念5HTTP協(xié)議(HyperTextTransferPro客戶端發(fā)送給服務(wù)器的請求有很多類型,被稱為方法,其中最常用的是GET、POSTGET方法用來從服務(wù)器讀取信息,比如從服務(wù)器讀取文件、表格、數(shù)據(jù)庫查詢結(jié)果等POST方法用來向服務(wù)器傳送信息,比如把信用卡號、表格、存儲于數(shù)據(jù)庫的數(shù)據(jù)等傳送到服務(wù)器HEAD方法用來讀取服務(wù)器響應(yīng)頭(ResponseHead);得到諸如文件大小,文件最后修改時間,服務(wù)器類型等信息PUT方法將文件直接傳到服務(wù)器DELETE方法將文件直接從服務(wù)器刪除TRACE方法用來協(xié)助程序調(diào)試OPTIONS方法用來查詢服務(wù)器所支持的方法11.1.1協(xié)議(續(xù))
——HTTP協(xié)議中客戶端發(fā)送給服務(wù)器的請求Java網(wǎng)絡(luò)程序設(shè)計的基本概念6客戶端發(fā)送給服務(wù)器的請求11.1.1協(xié)議(續(xù))
—11.1.2關(guān)于URIURI(UniformResourceIdentifier,統(tǒng)一資源標志符)
HTTP協(xié)議用URI標識定位網(wǎng)絡(luò)上的數(shù)據(jù)如果知道了公布在網(wǎng)絡(luò)上的某個HTML文件的URI,不管文件位于什么地方,都可以通過HTTP訪問該文檔通常所說的URL是URI的一種Java網(wǎng)絡(luò)程序設(shè)計的基本概念711.1.2關(guān)于URIURI(UniformResourURL類Java語言提供了URL類讓我們能在源代碼層使用URL有六個構(gòu)造函數(shù),其中最簡單的是URL(Stringurl)。每個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è)計的基本概念8URL類11.1.2關(guān)于URI(續(xù))
applet瀏覽指定URL舉例:ShowDocument.javaimport.*;importjava.util.*;importjava.awt.*;importjava.awt.event.*;importjava.applet.AppletContext;importjavax.swing.*;importjavax.swing.event.*;publicclassShowDocumentextendsJApplet{ publicvoidinit(){ JButtongoButton=newJButton("Linkto"); ContainermyContainer=getContentPane(); myContainer.add(newJLabel("LinktoSOHU"),BorderLayout.NORTH); myContainer.add(goButton,BorderLayout.SOUTH); goButton.addActionListener(newButtonListener()); }
11.1.2關(guān)于URI(續(xù))
——例11_1Java網(wǎng)絡(luò)程序設(shè)計的基本概念9applet瀏覽指定URL舉例:ShowDocument.classButtonListenerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ try{
URLnewDocument=newURL("");
AppletContextbrowser=getAppletContext(); browser.showDocument(newDocument); } catch(ExceptionURLException){} } }}11.1.2關(guān)于URI(續(xù))
——例11_1Java網(wǎng)絡(luò)程序設(shè)計的基本概念10classButtonListenerimpleme11.1.3基于套接字的有連接通信基于套接字(socket)的有連接通信使用TCP協(xié)議一個socket必須在發(fā)送數(shù)據(jù)之前與目的地的socket取得連接一旦連接建立了,sockets就可以使用一個流接口完成打開-讀-寫-關(guān)閉,所有的發(fā)送的信息都會在另一端以同樣的順序被接收面向連接的操作比無連接的操作效率低,但是數(shù)據(jù)的安全性高Java網(wǎng)絡(luò)程序設(shè)計的基本概念1111.1.3基于套接字的有連接通信基于套接字(socket用Java建立簡單的服務(wù)器程序需要五個步驟Step1:創(chuàng)建ServerSocket對象ServerSocketmyServer=newServerSocket(intport,intbacklog);Port
指定一個可用的端口號,用來定位服務(wù)器上的服務(wù)器應(yīng)用程序backlog指定能夠連接到服務(wù)器的最多客戶數(shù)。連接客戶達到由backlog指定的最大客戶數(shù)量時,服務(wù)器將拒絕客戶連接Step2:通過ServerSocket的accept方法監(jiān)聽客戶連接,服務(wù)器無限期的監(jiān)聽客戶連接Socketconnection=myServer.accept();有一個客戶連接時,將產(chǎn)生并返回一個socket11.1.3基于套接字的有連接通信(續(xù))
——服務(wù)器端Java網(wǎng)絡(luò)程序設(shè)計的基本概念12用Java建立簡單的服務(wù)器程序需要五個步驟11.1.3基于Step3:通過Socket的方法getInputStream和getOutputStream獲取InputStream和OutputStream對象;通常將其他流類型和它們聯(lián)系起來,如:ObjectInputStreaminput=newObjectInputStream(connection.getInputStream());ObjectOutputStreamoutput=newObjectOutputStream(connection.getOutputStream());Step4:客戶和服務(wù)器通過OutputStream和InputStream對象進行通信Step5:通信傳輸完畢,服務(wù)器通過調(diào)用流和套接字的close方法關(guān)閉連接11.1.3基于套接字的有連接通信(續(xù))
——服務(wù)器端Java網(wǎng)絡(luò)程序設(shè)計的基本概念13Step3:通過Socket的方法getInputStre在客戶端建立簡單連接的思路類似,可分為四步Step1:建立一個Socket,實現(xiàn)與服務(wù)器的連接Socketconnection=newSocket(InetAddressaddress,intport);address:服務(wù)器IP地址。port:端口號連接成功,將返回一個Socket,否則產(chǎn)生異常Step2:通過getInputStream和getOutputStream分別獲取Socket的InputStream和OutputStream的引用。同樣,也可以將其他流類型與InputStream和OutputStream聯(lián)系起來Step3:客戶與服務(wù)器通過InputStream和OutputStream進行通信Step4:傳輸完畢后,通過調(diào)用流和套接字的close方法關(guān)閉連接11.1.3基于套接字的有連接通信(續(xù))
——客戶端Java網(wǎng)絡(luò)程序設(shè)計的基本概念14在客戶端建立簡單連接的思路類似,可分為四步11.1.3基于11.4數(shù)據(jù)報通信數(shù)據(jù)報通信(DatagramCommunication)使用用戶數(shù)據(jù)報協(xié)議(UserDatagramProtocol,UDP)與TCP不同的一種協(xié)議不能保證數(shù)據(jù)會被成功地送達,也不保證數(shù)據(jù)抵達的次序與送出的次序相同,所以也被稱為“不可靠的通信協(xié)議”,雖然可靠性不高,但是它的速度很快,所以有些場合也有很大的用處服務(wù)器通過DatagramSocket接收或發(fā)送信息,這些信息以DatagramPackets
的形式存在DatagramSocketmySocket=newDatagramSocket(intport);port表示端口,上述語句將服務(wù)器綁定到一個可以從客戶端接收packet的端口上,如果綁定失敗,將產(chǎn)生SocketException異常Java網(wǎng)絡(luò)程序設(shè)計的基本概念1511.4數(shù)據(jù)報通信數(shù)據(jù)報通信(DatagramCommu客戶端應(yīng)用程序的工作流程Step1:通過創(chuàng)建一個DatagramSocket對象來建立數(shù)據(jù)報通訊的Socket。有如下兩種構(gòu)造方法publicDatagramSocket()構(gòu)造一個數(shù)據(jù)報socket,并使其與本地主機任一可用的端口連接。若打不開socket則拋出SocketException異常。publicDatagramSocket(intport)
構(gòu)造一個數(shù)據(jù)報socket,并使其與本地主機指定的端口連接。若打不開socket或socket無法與指定的端口連接則拋出SocketException異常11.1.4數(shù)據(jù)報通信(續(xù))
——客戶端Java網(wǎng)絡(luò)程序設(shè)計的基本概念16客戶端應(yīng)用程序的工作流程11.1.4數(shù)據(jù)報通信(續(xù))
Step2:用DatagramPacket類來創(chuàng)建一個數(shù)據(jù)報包,用來實現(xiàn)無連接的包傳送服務(wù)DatagramPacket對象封裝了數(shù)據(jù)報包的數(shù)據(jù)(bufferedarray[],包長度(length),目標地址(address),目標端口(port);length必須小于等于bufferedarry.lengthDatagramPacket(bytebufferedarray[],intlength,
InetAddress
address,intport)DatagramPacket類提供了四個方法來獲取信息publicbyte[]getData()返回一個字節(jié)數(shù)組,包含收到或要發(fā)送的數(shù)據(jù)報中的數(shù)據(jù)publicintgetLength()返回發(fā)送或接收到的數(shù)據(jù)的長度publicInetAddressgetAddress()返回一個發(fā)送或接收此數(shù)據(jù)報包文的機器的IP地址publicintgetPort()返回發(fā)送或接收數(shù)據(jù)報的遠程主機的端口號11.1.4數(shù)據(jù)報通信(續(xù))
——客戶端Java網(wǎng)絡(luò)程序設(shè)計的基本概念17Step2:用DatagramPacket類來創(chuàng)建一個數(shù)據(jù)Step3:調(diào)用DatagramSocket對象的send(DatagramPacketp)方法發(fā)送數(shù)據(jù)報文包Step4:調(diào)用DatagramSocket對象的receive(DatagramPacket
p)方法接收從服務(wù)器返回的結(jié)果數(shù)據(jù)報文包該DatagramPacket對象用到另一種構(gòu)造方法,只需指明存放接收的數(shù)據(jù)報的緩沖區(qū)和長度DatagramPacket(bytebufferedarray[],intlength)receive方法會一直阻塞,直到收到一個數(shù)據(jù)報文包,此時DatagramPacket的緩沖區(qū)中包含的就是接收到的數(shù)據(jù),也包含發(fā)送者的IP地址,發(fā)送者機器上的端口號等信息Step5:處理接收緩沖區(qū)內(nèi)的數(shù)據(jù),獲取服務(wù)結(jié)果Step6:通訊完成后,使用DatagramSocket對象的close()方法來關(guān)閉數(shù)據(jù)報通訊Socket11.1.4數(shù)據(jù)報通信(續(xù))
——客戶端Java網(wǎng)絡(luò)程序設(shè)計的基本概念18Step3:調(diào)用DatagramSocket對象的send服務(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è)計的基本概念19服務(wù)器端應(yīng)用程序的工作流程11.1.4數(shù)據(jù)報通信(續(xù))
11.5ServletServlet是用java技術(shù)來實現(xiàn)CGI(CommonGatewayInterface,通用網(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è)計的基本概念2011.5ServletServletJava網(wǎng)絡(luò)程序設(shè)計的與傳統(tǒng)的CGI相比,Servlet具有很多優(yōu)點高效率通過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.5Servlet(續(xù))
——優(yōu)點Java網(wǎng)絡(luò)程序設(shè)計的基本概念21與傳統(tǒng)的CGI相比,Servlet具有很多優(yōu)點11.1.5便攜性好Servlet用Java語言編寫,遵循標準的API。因此Servlet編寫的程序可以無任何修改的在Apache,MicrosoftInternetInformationServer(IIS),IBMWebSphere,或者StarNineWebStar上運行。同樣具有一次編譯,到處運行移植性好的特點安全基于Java語言的安全特性,Servlet的安全性也比較可靠成本低有很多免費或相對比較便宜的Web服務(wù)器,適合做個人的或者小容量的網(wǎng)站。而且很多商業(yè)級的Web服務(wù)器相對也比較便宜。而且使一個服務(wù)器支持Servlet所需的額外花費也很少11.1.5Servlet(續(xù))
——優(yōu)點Java網(wǎng)絡(luò)程序設(shè)計的基本概念22便攜性好11.1.5Servlet(續(xù))
11.2Servlet基礎(chǔ)本節(jié)內(nèi)容包括Servlet容器、web服務(wù)器、應(yīng)用服務(wù)器Web應(yīng)用程序ServletAPIServlet的基本結(jié)構(gòu)Servlet編譯和安裝2311.2Servlet基礎(chǔ)本節(jié)內(nèi)容包括2311.2.1Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器Servlet容器也稱為Servlet引擎是一個編譯好的可執(zhí)行程序,它是web服務(wù)器與servlet間的的媒介負責將請求翻譯成Servlet能夠理解的形式傳遞給servlet,同時傳給servlet一個對象使之可以送回響應(yīng)負責管理servlet的生命周期Servlet基礎(chǔ)2411.2.1Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器Sweb服務(wù)器能夠處理Http請求的服務(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.1Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器(續(xù))Servlet基礎(chǔ)25web服務(wù)器11.2.1Servlet容器、Web服務(wù)器和servlet容器可以與web服務(wù)器協(xié)作提供對servlet的支持一些servlet容器(如ApacheTomcat)自己也可以作為獨立的web服務(wù)器運行隨著servlet和JSP的流行,一些主要的Web服務(wù)器和應(yīng)用程序服務(wù)器都直接或者通過插件支持servlet和JSP。如:SunONEApplicationServerLotusDominoGoWebServerBEAweblogicTengahServerWebSphere應(yīng)用服務(wù)器JigsawNetForgeAcmeServerMotBaysJetty
11.2.1Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器(續(xù))Servlet基礎(chǔ)26servlet容器可以與web服務(wù)器協(xié)作提供對servletApacheTomcat5是servlet2.4和JSP2.0規(guī)范的官方參考實現(xiàn)完全免費,并且提供完整的源代碼可以到/tomcat/
下載最新版本初始設(shè)置設(shè)置JAVA_HOME。假設(shè)JDK安裝在C:\j2sdk1.4.2,可以仿照path和classpath的設(shè)置方法,新建一個環(huán)境變量:JAVA_HOME=C:\j2sdk.1Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器(續(xù))
——ApacheTomcat5服務(wù)器及其初始設(shè)置Servlet基礎(chǔ)27ApacheTomcat511.2.1Servlet為方便調(diào)試,還可進行如下設(shè)置啟動servlet重新載入功能(所請求servlet類文件發(fā)生變化后,自動重新載入到服務(wù)器內(nèi)存)。打開install_dir/conf/server.xml,在注釋
<!--Definepropertiesforeachwebapplication-->后插入語句<DefaultContextreloadable=“true”/>開啟servlet調(diào)用器invokerservlet(可以不修改Web應(yīng)用的web.xml文件即可運行servlet)。打開install_dir/conf/web.xml,將servlet-mapping元素取消注釋<servlet-mapping><servlet-name>invoker</servlet-name><url-pattern>/servlet/*</url-pattern></servlet-mapping>11.2.1Servlet容器、Web服務(wù)器和應(yīng)用服務(wù)器(續(xù))
——ApacheTomcat5服務(wù)器及其初始設(shè)置Servlet基礎(chǔ)28為方便調(diào)試,還可進行如下設(shè)置11.2.1Servlet容器11.2.2Web應(yīng)用程序Web應(yīng)用程序組成部分包括servlet、JSP及其支持文件這些組成部分需要進行部署通常部署在Tomcat的webapps子目錄中。一般其目錄結(jié)構(gòu)包括根目錄(contextroot)和幾個子目錄,也可以把子目錄捆綁到一個類型為war的存檔文件中Servlet基礎(chǔ)2911.2.2Web應(yīng)用程序Web應(yīng)用程序Servlet基11.2.2Web應(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和實用工具類文件。如果類文件是包的組成部分,則包的目錄結(jié)構(gòu)從該目錄開始WEB-INF/lib包含Java存檔文件(JAR文件),是servlet和實用工具類文件Servlet基礎(chǔ)3011.2.2Web應(yīng)用程序(續(xù))webapps子目錄一般包11.2.2Web應(yīng)用程序(續(xù))Servlet基礎(chǔ)3111.2.2Web應(yīng)用程序(續(xù))Servlet基礎(chǔ)3111.2.3ServletAPIServletAPI開發(fā)servlet和JSP程序,需要參考ServletAPI文檔包含javax.servlet和javax.servlet.http兩個包中所有servlet須實現(xiàn)javax.servlet.Servlet接口,通常繼承如下兩個類中的一個GenericServletHttpServletServlet基礎(chǔ)ServletGenericservletHttpservletMyservlet3211.2.3ServletAPIServletAPISServlet接口所有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.3ServletAPI(續(xù))33Servlet接口Servlet基礎(chǔ)11.2.3Serv11.2.3ServletAPI(續(xù))HttpServletRequest接口由Web服務(wù)器創(chuàng)建該接口的一個對象,并將其傳遞給servlet的service方法該類對象含有來自于客戶端的請求HttpServletResponse接口由Web服務(wù)器創(chuàng)建該接口的一個
對象,并將其傳送給servlet的service方法通過該類對象服務(wù)器端可以對客戶端發(fā)出響應(yīng)信息Servlet基礎(chǔ)3411.2.3ServletAPI(續(xù))HttpServl11.2.3Servlet
API(續(xù))
——HttpServletRequest接口Servlet基礎(chǔ)3511.2.3ServletAPI(續(xù))
11.2.3Servlet
API(續(xù))
——HttpServletResponse接口Servlet基礎(chǔ)3611.2.3ServletAPI(續(xù))
——11.2.4Servlet的基本結(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方法可能生成異常,必須在方法名稱后聲明拋出異常或者用try-catch語句處理異常Servlet基礎(chǔ)3711.2.4Servlet的基本結(jié)構(gòu)Servlet的基本結(jié)GET請求是WEB瀏覽器請求的常見類型,用來請求Web頁面。本例中通過doGet方法處理GET請求。在doGet方法中通過HttpServletResponse對象得到PrintWriter,然后將一個文檔發(fā)給客戶。最終在客戶端生成一個網(wǎng)頁importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassMyServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{
res.setContentType("text/html"); PrintWriterout=res.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>MyFirstServlet</TITLE></HEAD>");
out.println("<BODY>");
out.println("<B>FirstServlet</B>");
out.println("</BODY></HTML>"); }}11.2.4Servlet的基本結(jié)構(gòu)(續(xù))
——例11_2Servlet基礎(chǔ)38GET請求是WEB瀏覽器請求的常見類型,用來請求Web頁面。11.2.5Servlet編譯和安裝編譯——在設(shè)置好path和classpath的前提下,servlet的編譯和普通的java程序完全相同可以通過javac.exe編譯,比如可以在Dos環(huán)境下輸入:javacMyServlet.java也可以通過集成開發(fā)環(huán)境(IDE)編譯復(fù)制——編譯成功之后,將生成的類文件復(fù)制到相應(yīng)的目錄下即可。在Tomcat服務(wù)器上,此目錄可能是install_dir\webapps\ROOT\WEB-INF\classes\運行——啟動Tomcat服務(wù)器,在地址欄輸入
http://localhost:8080/servlet/MyServletServlet基礎(chǔ)3911.2.5Servlet編譯和安裝編譯——在設(shè)置好pat11.3Servlet的生命周期首先服務(wù)器僅創(chuàng)建servlet的一個實例創(chuàng)建servlet實例時,它的init方法都會被調(diào)用針對每個客戶端的每個請求,都會創(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方法4011.3Servlet的生命周期首先服務(wù)器僅創(chuàng)建servl11.3Servlet的生命周期(續(xù))
——Servlet生命周期示意圖服務(wù)器服務(wù)器Servlet代碼服務(wù)器客戶端客戶端裝載Servlet代碼卸載Servlet代碼處理客戶端請求Servlet的生命周期4111.3Servlet的生命周期(續(xù))
——Ser11.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的生命周期4211.3.1初始化servlet的初始化Servlet的11.3.1初始化(續(xù))init方法的定義publicvoidinit(ServletConfigconfig)throwsServletException{ super.init(config); Stringgreeting=getInitParameter("greeting"); //Initializationcode…}Servlet的生命周期4311.3.1初始化(續(xù))init方法的定義Servlet11.3.2銷毀servlet的銷毀服務(wù)器卸載servlet實例之前,需要先調(diào)用servlet的destroy方法釋放servlet所獲得的資源使servlet有機會關(guān)閉數(shù)據(jù)庫連接、停止后臺運行的線程、將cookie列表和點擊數(shù)寫入到磁盤執(zhí)行其他清理活動Servlet的生命周期4411.3.2銷毀servlet的銷毀Servlet的生命11.4與客戶端交互HTTPservlet與客戶端的交互通過service方法處理客戶端的請求service方法根據(jù)請求(request)類型的不同,調(diào)用不同的方法對于GET請求,調(diào)用doGet()方法進行處理對于POST請求,調(diào)用doPost()方法進行處理4511.4與客戶端交互HTTPservlet與客戶端的交互11.4.1提取Servlet信息注冊的servlet都有相關(guān)的很多初始化參數(shù)這些初始化參數(shù)寫在web.xml中,具體語法格式請參閱Tomcat文檔getInitParameter()方法可以得到servlet初始化的一些參數(shù)返回一個指定參數(shù)的值(String類型)如果指定參數(shù)不存在,則返回nullgetInitParameterNames()方法可以得到初始化參數(shù)名稱返回String類型的Enumeration類型數(shù)據(jù)如果不存在初始化參數(shù),則返回一個null的Enumeration與客戶端交互4611.4.1提取Servlet信息注冊的servlet都有通過servlet初始化參數(shù)建立一個數(shù)據(jù)庫連接的程序段如下java.sql.Connectioncon=null;publicvoidinit(ServletConfigconfig)throwsServletException{ super.init(config); Stringhost=getInitParameter("host");
intport=Integer.parseInt(getInitParameter("port"));
Stringdb=getInitParameter("db"); Stringuser=getInitParameter("user"); Stringpassword=getInitParameter("password"); Stringproxy=getInitParameter("proxy");
con=establishConnection(host,port,db,user,password,proxy);}11.4.1提取Servlet信息(續(xù))
——通過初始化建立數(shù)據(jù)庫連接與客戶端交互47通過servlet初始化參數(shù)建立一個數(shù)據(jù)庫連接的程序段如下1輸出全部初始化參數(shù)名稱importjava.io.*;importjava.util.*;importjavax.servlet.*;publicclassPrintInitParaNamesextendsGenericServlet{ publicvoidservice(ServletRequestreq,ServletResponseres) throwsServletException,IOException{
res.setContentType("text/plain"); PrintWriterout=res.getWriter(); out.println("InitParametersAsFollowing:"); Enumerationenum=getInitParameterNames(); while(enum.hasMoreElements()){ Stringname=(String)enum.nextElement(); out.println(name":"+getInitParameter(name)); }}}11.4.1提取Servlet信息(續(xù))
——PrintInitParaNames.java與客戶端交互48輸出全部初始化參數(shù)名稱11.4.1提取Servlet信息(11.4.2提取服務(wù)器信息servlet可以得到很多服務(wù)器相關(guān)的信息,同時可以將這些信息發(fā)送到客戶端getServerName()返回服務(wù)器名稱getServerPort()返回服務(wù)器監(jiān)聽端口getServerInfo()輸出服務(wù)器程序和版本,之間用“/”分開getAttribute()返回服務(wù)程序的屬性得到路徑相關(guān)的信息publicStringHttpServletRequest.getPathInfo()publicStringHttpServletRequest.getPathTranslated()與客戶端交互4911.4.2提取服務(wù)器信息servlet可以得到很多服務(wù)器提取服務(wù)器信息舉例importjava.io.*;importjava.util.*;importjavax.servlet.*;publicclassServerSnoopextendsGenericServlet{publicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException{res.setContentType("text/plain");PrintWriterout=res.getWriter();out.println("req.getServerName()output:"+req.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提取服務(wù)器信息(續(xù))
——例11_3與客戶端交互50提取服務(wù)器信息舉例11.4.2提取服務(wù)器信息(續(xù))
11.4.3提取客戶端信息服務(wù)器可以從request得到很多客戶端的信息getRemoteAddr():得到IP地址getRemoteHost():得到客戶端機器的名稱利用InetAddress.getByName()方法可以將IP地址或客戶端機器名稱轉(zhuǎn)換成一個.InetAddress類型的對象InetAddressremoteInetAddress=InetAddress.getByName(req.getRemoteAddr());通過獲取客戶端的地址,并判斷是否隸屬某個范圍,可以限制某個地區(qū)的用戶訪問你的網(wǎng)站與客戶端交互5111.4.3提取客戶端信息服務(wù)器可以從request得到很11.4.3提取客戶端信息(續(xù))服務(wù)器可以得到客戶想做的事情客戶請求表現(xiàn)為表單數(shù)據(jù),由“名/值”對組成。當提交某一個網(wǎng)頁的時候常常在瀏覽器地址欄中看到類似格式的數(shù)據(jù)格式name/value,每對之間用&隔開,表達式為param1=value1¶m2=value2¶m3=value3…request.getParameter:得到表單參數(shù)的值request.getParameterValues:得到多次出現(xiàn)的參數(shù)值reques.getParameterNames:得到當前請求中所有參數(shù)的完整列表,調(diào)用形式如下publicStringServletRequest.getParameter(Stringname)publicString[]ServletRequest.getParameterValues(Stringname)與客戶端交互5211.4.3提取客戶端信息(續(xù))服務(wù)器可以得到客戶想做的事書本查詢的一個HTML網(wǎng)頁!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><HTML><HEAD><TITLE>ASampleFormforQueryaBook</TITLE></HEAD><BODYBGCOLOR="#FDF5E6"><FORMMETHOD=GETACTION="/Chapter11/QueryServlet">Booktolookup:<INPUTTYPE="TEXT"NAME="Book"VALUE="JavaServletProgramming"><!--Thedefaultbooktobelookedupis:《JavaServletProgramming》.--><INPUTTYPE=SUBMIT></FORM></BODY></HTML>11.4.3提取客戶端信息(續(xù))
——Query.html與客戶端交互53書本查詢的一個HTML網(wǎng)頁11.4.3提取客戶端信息(續(xù))獲取客戶端信息的servletimportjava.io.*;import.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassQueryServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres) throwsServletException,IOException{res.setContentType("text/html;charset=UTF-8");StringqueryBookValue=req.getParameter("Book");PrintWriterout=res.getWriter();out.println("Thebookyouwantedis:"+queryBookValue);out.close();}}11.4.3提取客戶端信息(續(xù))
——QueryServlet.java與客戶端交互54獲取客戶端信息的servlet11.4.3提取客戶端信息(11.4.3提取客戶端信息(續(xù))
——query.html與QueryServlet運行結(jié)果與客戶端交互5511.4.3提取客戶端信息(續(xù))
——query11.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:MicrosoftWord文檔application/pdf:crobat文件
application/zip:Zip檔案一個空行和響應(yīng)的文檔與客戶端交互5611.4.4發(fā)送HTML信息Web服務(wù)器響應(yīng)(responHTTP/1.1200OK //狀態(tài)行Content-Type:text/html //報頭Header2:……HeaderN:… //空行<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"> //文檔<HTML><HEAD>headcode</HEAD><BODY>…</BODY></HTML>11.4.4發(fā)送HTML信息(續(xù))與客戶端交互57HTTP/1.1200OK //狀態(tài)行11.4向客戶端輸出一個簡單網(wǎng)頁,顯示“HelloWorld!”importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassHelloWorldextendsHttpServlet{publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)
throwsServletException,IOException{res.setContentType("text/html");PrintWriterout=res.getWriter();out.println("<HTML>");out.println("<HEAD><TITLE>HelloWorld</TITLE></HEAD>");out.println("<BODY>");out.println("<BIG>HelloWorld!</BIG>");out.println("</BODY></HTML>");}}11.4.4發(fā)送HTML信息(續(xù))
——例11_4與客戶端交互58向客戶端輸出一個簡單網(wǎng)頁,顯示“HelloWorld!”程序說明HelloWorld繼承了HttpServlet,然后重寫doGet方法在doGet方法中,首先將HTTPContent-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é)果與客戶端交互59程序說明11.4.4發(fā)送HTML信息(續(xù))
11.5客戶端跟蹤客戶端跟蹤HTTP是無狀態(tài)協(xié)議,服務(wù)器不能自動維護客戶連接的上下文信息許多情況下,Web服務(wù)器必須要能夠跟蹤用戶的狀態(tài)比如購物網(wǎng)站和電子郵件網(wǎng)站,當用戶登錄以后,其身份和一系列的操作狀態(tài)都需要被跟蹤并保持servletAPI提供了兩種可以跟蹤客戶端狀態(tài)的方法CookieSession6011.5客戶端跟蹤客戶端跟蹤6011.5.1使用CookieCookie是Web服務(wù)器保存在用戶硬盤上的一段文本,Web服務(wù)器將它發(fā)送到瀏覽器之后,當再次訪問同一網(wǎng)絡(luò)時,瀏覽器將它原封不動的返回其中的信息片斷以‘名/值’對(name-valuepairs)的形式儲存使用這種方法,網(wǎng)站可以維護客戶的連接。這種用途可以體現(xiàn)在如下幾點在電子商務(wù)中標識用戶,實現(xiàn)短期跟蹤用戶記錄用戶名和用戶密碼,允許用戶下次自動登陸定制站點,記錄用戶的偏好定向廣告,記錄用戶感興趣的主題,并顯示與之相關(guān)的廣告客戶端跟蹤6111.5.1使用CookieCookie客戶端跟蹤61調(diào)用Cookie的構(gòu)造函數(shù)可創(chuàng)建一個cookie構(gòu)造方法接受兩個字符串參數(shù)cookie名稱cookie的值例如創(chuàng)建一個名為CookieName,值為John的cookie,可以使用下面的語句Cookielogin=newCookie(“CookieName”,”John”);客戶端跟蹤11.5.1使用Cookie(續(xù))
——創(chuàng)建Cookie對象62調(diào)用Cookie的構(gòu)造函數(shù)可創(chuàng)建一個cookie客戶端跟蹤1創(chuàng)建了一個名為login的cookie之后,可通過很多現(xiàn)有的方法設(shè)置cookie的值和屬性可通過如下語句設(shè)置cookie的注釋:login.setComent(“YoucangetUserNameformthiscookie”);創(chuàng)建cookie并將它發(fā)送到瀏覽器后,默認情況下,它是會話級的cookie,僅僅存儲在瀏覽器內(nèi)存中,用戶退出瀏覽器后,cookie將被刪除;如果希望將cookie存儲在磁盤上,則需要設(shè)定MaxAge,給出一個以秒為單位的生命周期,如下可以將生命設(shè)置為一天login.setMaxAge(60*60*24) //onedaysetPath(),setValue(),setVersion(),setDomain(),setSecure()等,相關(guān)的具體用法請查看servletAPI11.5.1使用Cookie(續(xù))
——設(shè)置Cookie屬性客戶端跟蹤63創(chuàng)建了一個名為login的cookie之后,可通過很多現(xiàn)有的剛創(chuàng)建的cookie存在于服務(wù)器內(nèi)存中。必須將它發(fā)送到客戶端,cookie才能真正的發(fā)揮作用。發(fā)送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個HTTP響應(yīng)報頭。發(fā)送的語句如下publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{Cookielogin=newCookie(“UserName”,”John”);login.setComent(“YoucangetUserNameformthiscookie”);
res.addCookie(login);//...}客戶端跟蹤11.5.1使用Cookie(續(xù))
——發(fā)送Cookie到客戶端64剛創(chuàng)建的cookie存在于服務(wù)器內(nèi)存中。必須將它發(fā)送到客戶端從客戶端讀取你感興趣的cookie,需要兩個步驟首先調(diào)用request.getCookies得到一個Cookie對象的數(shù)組然后調(diào)用每個cookie的getName方法,從數(shù)組中尋找所需的cookieStringnameString=“UserName”Cookie[]cookies=request.getCookies();for(inti=0;i<cookies.length;i++){ Cookiecookie=cookies[i]; if(nameString.equals(cookie.getName())) { //dosomething…//cookies.setMaxAge(0); }}找到感興趣的cookie之后,便可以操作此cookie,如通過getValue方法得到相關(guān)cookie的值,設(shè)置MaxAge等客戶端跟蹤11.5.1使用Cookie(續(xù))
——從客戶讀取Cookie65從客戶端讀取你感興趣的cookie,需要兩個步驟客戶端跟蹤111.5.2使用SessionSession一段時間內(nèi),單個客戶與web服務(wù)器的一連串的交互過程在一個Session中客戶可能會多次請求訪問同一個網(wǎng)頁,也有可能請求訪問各種不同的服務(wù)器資源,其間用戶的狀態(tài)需要跟蹤并保持存在于服務(wù)器端,不在網(wǎng)絡(luò)上傳送它的好處是可以用來記錄客戶端私有的信息,并且在時間范圍內(nèi)不會消失客戶端跟蹤6611.5.2使用SessionSession客戶端跟蹤6611.5.2使用Session(續(xù))Session的使用可以分為三個步驟獲得一個session存儲數(shù)據(jù)到session或從session讀取數(shù)據(jù)銷毀session客戶端跟蹤6711.5.2使用Session(續(xù))Session的使用可通過調(diào)用httpServletRequest的getSession方法可以得到一個sessionHttpSessionsession=request.getSession();為了保持正確的會話,必須在發(fā)送任何文檔到客戶程序之前獲得一個sessionpublicclassSessionServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//Gettheuser'ssessionHttpSessionsession=request.getSession(true);//...out=response.getWriter();//...}}客戶端跟蹤11.5.2使用Session(續(xù))
——獲得一個Session68通過調(diào)用httpServletRequest的getSessSessionIDServlet容器為HttpSession分配的一個唯一標識符作為Cookie保存在客戶的瀏覽器中sessioncookie每次客戶發(fā)出HTTP請求時,Servlet容器可以從HttpRequest對象中讀取SessionID,然后根據(jù)SessionID在服務(wù)器端找到相應(yīng)的HttpSession對象,從而獲取客戶的狀態(tài)信息,這樣的cookie叫做sessioncookie存儲于瀏覽器內(nèi)存中的,并不寫到硬盤上的針對某一次會話而言,會話結(jié)束也就隨著消失了客戶端跟蹤11.5.2使用Session(續(xù))
——存儲或讀取數(shù)據(jù)69SessionID客戶端跟蹤11.5.2使用SessioURL重寫瀏覽器不支持Cookie,或者將瀏覽器設(shè)置為不接受Cookie的情況,可通過URL重寫來實現(xiàn)會話管理向URL連接添加參數(shù),并把sessionID作為值包含在連接中。為servlet響應(yīng)部分的每個連接添加sessionID,可以使用一對方法response.encodeURL():使URL包含sessionIDresponse.encodeRedirectURL():使用重定向客戶端跟蹤11.5.2使用Session(續(xù))
——存儲或讀取數(shù)據(jù)70URL重寫客戶端跟蹤11.5.2使用Session(續(xù))從Session中讀取數(shù)據(jù)session.getAttribute(“name”)查找以前存儲的值如果不存在則返回null在調(diào)用此方法返回的對象前,一定要檢查它是否為null向session中設(shè)置相關(guān)信息setAttribute替換掉此前設(shè)定的任何值removeAttribute移除而不是替換某個值客戶端跟蹤11.5.2使用Session(續(xù))
——存儲或讀取數(shù)據(jù)71從Session中讀取數(shù)據(jù)客戶端跟蹤11.5.2使用SespublicclassSessionServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //Gettheuser'ssessionHttpSessionsession=request.getSession(true);SomeClassscl=(SomeClass)session.getAttribute("name1“);//IftheuserhasnoSomeClassobject,createanewoneif(scl==null){scl=newSomeClass();
session.putAttribute("name1",scl);}//...}}11.5.2使用Session(續(xù))
——SessionServlet.java客戶端跟蹤72publicclassSessionServletex銷毀Session意味著從系統(tǒng)刪除session對象及其值自動銷毀在一段時間(時間長短依賴與Web服務(wù)器的設(shè)定)沒有request的情況下,Web服務(wù)器會自動銷毀session手動銷毀通過調(diào)用session的invalidate方法可以手動的銷毀sessionlogout在支持servlet2.4的服務(wù)器中,可調(diào)用logout將客戶從Web服務(wù)器中注銷,同時廢棄所有與該用戶相關(guān)聯(lián)的會話需要注意的是,這個動作會影響到此servlet之外的其他servlet,因此一定要與網(wǎng)站的其他開發(fā)人員協(xié)調(diào)使用11.5.2使用Session(續(xù))
——銷毀Session客戶端跟蹤73銷毀Session11.5.2使用Session(續(xù))
11.6協(xié)作與通信協(xié)作與通信為了更好的響應(yīng)客戶端的請求,servlet有時需要和網(wǎng)絡(luò)上的其他資源進行通訊,比如HTML網(wǎng)頁其他servletJSP網(wǎng)頁Servlet協(xié)作通訊的第一步是獲得分發(fā)器(dispatcher),即RequestDispatcher接口的一個對象74
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東財貿(mào)職業(yè)學院《醫(yī)學統(tǒng)計學與流行病學》2023-2024學年第二學期期末試卷
- 商丘職業(yè)技術(shù)學院《稀有金屬冶金學》2023-2024學年第二學期期末試卷
- 蘇州衛(wèi)生職業(yè)技術(shù)學院《珠寶玉石材料學基礎(chǔ)》2023-2024學年第二學期期末試卷
- 長春醫(yī)學高等??茖W校《大數(shù)據(jù)財務(wù)分析》2023-2024學年第二學期期末試卷
- 2025年上海松江區(qū)都城企業(yè)發(fā)展有限公司招聘筆試參考題庫附帶答案詳解
- 打造卓越酒店品牌-品牌形象與市場競爭力的策略
- 室內(nèi)設(shè)計環(huán)節(jié)核心要素
- 云計算:賦能未來-理解、應(yīng)用與挑戰(zhàn)
- 知識產(chǎn)權(quán)保護與創(chuàng)新-知識產(chǎn)權(quán)專家演講
- 未來出行-無人駕駛的契機-交通運輸專家的演講稿
- 北師大版《相遇問題》公開課課件
- QC-R 596-2017高速鐵路板式無砟軌道自密實混凝土高清-無水印
- 2023高中學業(yè)水平合格性考試歷史重點知識點歸納總結(jié)(復(fù)習必背)
- 鄰補角、對頂角、同位角、內(nèi)錯角、同旁內(nèi)角經(jīng)典習題-一對一專用
- HP系列培訓手冊
- 常見病媒生物分類鑒定
- 畢業(yè)論文-原油電脫水方法與機理的研究
- 陜西省2022年普通高中學業(yè)水平考試(真題)
- 事故池管理的有關(guān)規(guī)定
- 2021-2022學年甘肅省天水市第一中學高一下學期第二階段考物理試題(原卷版)
- 混凝土結(jié)構(gòu)課程設(shè)計244
評論
0/150
提交評論