Java語言程序設計(第三版-清華)第11章_第1頁
Java語言程序設計(第三版-清華)第11章_第2頁
Java語言程序設計(第三版-清華)第11章_第3頁
Java語言程序設計(第三版-清華)第11章_第4頁
Java語言程序設計(第三版-清華)第11章_第5頁
已閱讀5頁,還剩110頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第十一章Servlet程序設計JAVA語言程序設計1Java2平臺有3個版本,適用于桌面系統的Java2平臺標準版〔Java2PlatformStandardEdition,J2SE〕適用于創立效勞器應用程序和效勞的Java2平臺企業版〔Java2PlatformEnterpriseEdition,J2EE〕。適用于小型設備和智能卡的Java2平臺Micro版〔Java2PlatformMicroEdition,J2ME〕2J2EEJ2EE〔Java2PlatformEnterpriseEdition,J2EE〕是一種利用Java2平臺來簡化企業解決方案的開發、部署和管理相關的復雜問題的體系結構。目的是成為一個能夠使企業開發者大幅縮短投放市場時間的體系結構。J2EE技術的根底是核心Java平臺或Java2平臺的標準版,J2EE不僅穩固了標準版中的許多優點,例如“編寫一次、隨處運行”的特性、方便存取數據庫的JDBCAPI、CORBA技術以及能夠在Internet應用中保護數據的平安模式等提供了對EJB〔EnterpriseJavaBeans〕、JavaServletsAPI、JSP〔JavaServerPages〕以及XML技術的全面支持3J2EE說明書中定義了以下的J2EE組件:應用客戶端程序和applets是客戶層組件.JavaServlet和JavaServerPages(JSP)是web層組件.EnterpriseJavaBeans(EJB)是業務層組件.4參考資料

《TheJavaTutorialcontinued》《JavaWeb開發》,電子工業出版社,方振宇《Java網絡編程與分布式計算》,沈鳳譯5Servlet根底本節內容包括web效勞器Servlet根底Servlet容器、應用效勞器Web應用程序ServletAPIServlet的根本結構Servlet編譯和安裝6進行Servlet開發所需要的根本環境JSDK(JavaServletDevelopmentKit)。Java1.2或以上版本進行開發,不必安裝JSDK支持Servlet的Web效勞器711.1構建Javaweb環境web效勞器能夠處理Http請求的效勞器可以提供靜態頁面、圖像等有的web效勞器也支持動態頁面的生成,支持JSP、Servlet等,具有JVM瀏覽器統一資源定位器(URL)常用的web效勞器Microsoft的Web效勞器產品為InternetInformationServer(IIS),IBMWebSphere〔以電子商務開發為核心〕BEAWebLogic〔基于Internet的企業都選擇它來開發、部署最正確的應用〕ApacheTomcat仍然是世界上用的最多的Web效勞器,市場占有率達60%左右8Tomcat的安裝和配置下載web效勞器:///tomcat/下載最新版本運行:://localhost:8080/911.2Servlet根底Servlet是用java技術來實現CGI〔CommonGatewayInterface,通用網關接口〕功能的編程〔使用JavaServlet應用程序設計接口〔API〕及相關類和方法的Java程序〕介于瀏覽器〔或其他HTTP客戶端〕與效勞器之間,起到橋梁的作用。具體作用為:讀取客戶端發送的數據獲取客戶請求〔request〕中所包含的信息產生響應結果,并將結果包含到一個文件中,比方HTML文件中設置HTTP響應參數,比方告訴瀏覽器,文件類型為HTML將文件返回給客戶端與傳統的從命令行啟動的Java應用程序不同,Servlet由Web效勞器進行加載,該Web效勞器必須包含支持Servlet的Java虛擬機。10Servlet容器也稱為Servlet引擎是一個編譯好的可執行程序,它是web效勞器與servlet間的媒介。負責將用戶請求翻譯成Servlet能夠理解的形式傳遞給servlet,同時傳給servlet一個對象使之可以送回響應負責管理servlet的生命周期〔通過五個接口,見后〕Servlet不能獨立運行,必須部署到Servlet容器中,由容器來實例化和調用Servlet方法一些Servlet容器,如:ApacheTomcat,可以作為獨立的Web效勞器運行11Servlet工作原理Servlet容器負責把請求傳遞給Servlet,并把結果返回結客戶。在使用Servlet的過程中,并發訪問的問題由Servlet容器處理,當多個用戶請求同一個Servlet的時候,Servlet容器負責為每個用戶啟動一個線程,這些線程的運行和銷毀由Servlet容器負責,而在傳統的CGI程序中,是為每一個用戶啟動一個進程,因此Servlet的運行效率就要比CGI的高出很多。12Servlet運行模式Servlet生命周期Servlet類加載、Servlet實例化、調用init方法、調用service()方法、調用destroy()方法〔servlet容器效勞終止〕

WebServerClientRequestResponseHTTP(HTML)(HTML)ServletHttpServletRequestHttpServletResponseservic()doGet()doPost()13Servlet的生命周期首先效勞器僅創立servlet的一個實例〔初始化〕創立servlet實例時,它的init方法都會被調用針對每個客戶端的每個請求,都會創立一個線程〔提供效勞〕該線程調用servlet實例的service方法Service方法根據收到HTTP請求的類型,調用doGet,doPost或者其他方法多個并發請求,一般會導致多個線程同時調用service方法,通過單線程模式〔SingleThreadModel〕也可以規定任何時間僅允許一個線程運行卸載servlet〔銷毀〕效勞器調用servlet的destroy方法14Servlet的生命周期(續)

——Servlet生命周期示意圖效勞器效勞器Servlet代碼效勞器客戶端客戶端裝載Servlet代碼卸載Servlet代碼處理客戶端請求Servlet的生命周期1511.3ServletAPIServletAPI包含javax.servlet.*和.*兩個軟件包Javax.servlet包含所有Servlet實現和擴展到通用接口和類〔與HTTP協議無關的Servlet類〕包含與HTTP協議相關的功能所有servlet須實現接口。可以通過直接或繼承方式實現GenericServlet和HttpServlet兩個類實現了Servlet的所有接口。ServletGenericservletHttpservletMyservlet16Servlet接口包括五個方法MethodDescriptionVoidinit(ServletConfigconfig)Thismethodisautomaticallycalledonceduringaservlet’sexecutioncycletoinitializetheservlet.TheServletConfigargumentissuppliedautomaticallybytheserverthatexecutestheservlet.ServletConfiggetServletConfig()ThismethodreturnsreferencetoanobjectthatimplementsinterfaceServletConfig.Thisobjectprovidesaccesstotheservlet’sconfigurationinformation.初始化參數和ServletContext對象Voidservice(ServletRequestrequest,ServletResponserewponse)Thisisthefirstmethodcalledoneveryservlettorespondtoaclientrequest.

StringgetServletInfo()ThismethodisdefnedbyaservletprogrammertoreturnaStringcontainingservletinformationsuchastheservlet’sauthorandversion.Voiddestroy()Thiscleanupmethodiscalledwhenaservletisterminatedbytheserveronwhichitisexecuting.Thisisagoodmethodtousetodeallocatearesourceusedbytheservlet(suchasopenfileoranopendatabaseconnection)1711.3.1創立servlet的三種方法通過實現Servlet接口創立Servlet通過繼承GenericServlet類實現Servlet通過繼承HttpServlet實現Servlet1811.3.1創立servlet的三種方法1、通過實現Servlet接口創立Servletimport;import;importjavax.servlet.*;publicclassHello1implementsServlet{//實現Servlet接口publicHello1(){}publicstaticvoidmain(Stringargs[]){}publicvoidinit(ServletConfigconfig)throws//初始化sevletServletException{}publicServletConfiggetServletConfig(){//實現getServletConfig()returnnull;}

19public

void

service(ServletRequestreq,ServletResponseresp)throwsServletException,IOException{resp.setContentType("text/html;charset=utf-8");PrintWriterprintwriter=resp.getWriter();//實例化PrintWriterprintwriter.println(“實現Servlet接口”);//處理業務邏輯}

publicStringgetServletInfo(){//實現getServletInfo()

return

null;}

public

void

destroy(){//實現destory()

}}20配置web.xmlServlet容器根據XML文件的配置信息來找到要運行的Servlet類,并加載、執行標簽<servlet>用于注冊servlet程序,包括兩個子標簽:<servlet-mane>:

設置注冊名稱,不可沖突<servlet-class>:指定當前注冊的servlet的完整類名,包括類的包名Servlet中wet.xml中映射其訪問路徑,包括兩個子標簽:<servlet-mane>:用于指定已經注冊過的servlet名稱<url-pattern>:用于設置servlet的對外訪問路徑21import;import;importjavax.servlet.*;import;publicclassHello1extendsGenericServlet{publicvoidservice(ServletRequestreq,ServletResponserep){try{PrintWriterout=rep.getWriter();rep.setContentType("text/html;charset=utf-8");out.println("通過繼承GenericServlet實現");}catch(Exceptione){e.printStackTrace();}}}2、通過繼承GenericServlet類實現Servlet223、通過繼承HttpServlet實現ServletServlet根底兩個常見的HTTP請求類型GET:從server獲得信息。通常為HTMLdocument或圖象POST:將數據發送至server。通常為HTML表單形式。23Server端響應方法:doGet(),doPost()復寫doGet或者doPost方法doGet或doPost都接收兩個類型的參數:HttpServletRequest和HttpServletResponse通過HttpServletRequest,可以得到所有的輸入數據,比方表單數據、HTTP請求報頭等客戶信息通過HttpServletResponse可以指定輸出信息由于doGet和doPost方法可能生成異常,必須在方法名稱后聲明拋出異常或者用try-catch語句處理異常24HttpServletRequest接口由Web效勞器創立該接口的一個對象,并將其傳遞給servlet的service方法該類對象含有來自于客戶端的請求〔方法見后〕HttpServletResponse接口由Web效勞器創立該接口的一個對象,并將其傳送給servlet的service方法通過該類對象效勞器端可以對客戶端發出響應信息〔方法見后〕25

——HttpServletRequest接口Servlet根底26

——HttpServletResponse接口Servlet根底2711.4建立Web站點Web站點的建立在webapps中定義站點名創立WEB-INF文件在WEB-INF下創立web.xml文件在WEB-INF下創立classes文件夾,存放編譯好的類文件如果采用MyEclipse創立web工程,這些文件夾和配置文件會自動生成。〔具體見后〕28MyEclipse中進行File-New-WebProject創立工程Src-右鍵-New-Servlet創立Servlet程序給出包名給出servlet類名在Tomcatwebapps中自動生相關配置文件〔WEB-INF,web.xml,classes〕29<?xmlversion=“1.0”encoding=“UTF-8”?>//xml版本信息<web-appversion="2.4"xmlns="://java.sun/xml/ns/j2ee"xmlns:xsi=":///2001/XMLSchema-instance"xsi:schemaLocation“>//web.xml文件配置開始<!servletmappingstart>//注釋信息<servlet>//servlet配置信息開始<description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>Hello1</servlet-name>//servlet注冊名<servlet-class>Hello1</servlet-class>//servlet完整的類名〔可包含包名〕</servlet><servlet-mapping>//servlet映射信息開始<servlet-name>Hello1</servlet-name>//servlet注冊名<url-pattern>/servlet/Hello1</url-pattern>//servlet的對外訪問路徑</servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>//web.xml文件結束配置web.xml文件30<?xmlversion="1.0"encoding="UTF-8"?><web-appversion="2.4" xmlns="://java.sun/xml/ns/j2ee" xmlns:xsi=":///2001/XMLSchema-instance" xsi:schemaLocation ://java.sun/xml/ns/j2ee/web-app_2_4.xsd"><servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>myServlet</servlet-name><servlet-class>myServlet</servlet-class></servlet>

<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>Hello1</servlet-name><servlet-class>Hello1</servlet-class></servlet>

標簽<servlet>用來注冊Servlet程序。包括兩個子標簽:<servlet-name>用來設置Servlet的注冊名稱,不能與其他servlet同名<servlet-class>用來指定當前注冊的Servlet程序的完整類名。注意:完整類名要包含類的包名。理解Web.xml文件31<servlet-mapping><servlet-name>myServlet</servlet-name><url-pattern>/servlet/myServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>Hello1</servlet-name><url-pattern>/servlet/Hello1</url-pattern></servlet-mapping>

標簽<sevlet-mapping>用來映射一個已注冊的Servlet的對外訪問路徑。用戶通過該Servlet所映射到對外訪問路徑才能訪問Servlet。該標簽有兩個子標簽:<servlet-name>用來指定已經注冊過的servlet名稱<url-pattern>用來設置servlet的對外訪問路徑32Servlet編譯和安裝編譯——在設置好path和classpath的前提下,servlet的編譯和普通的java程序完全相同(可以通過javac.exe編譯,比方可以在Dos環境下輸入:javacMyServlet.java也可以通過集成開發環境(IDE)編譯建立web站點——編譯成功之后,將生成的類文件復制到相應的目錄下即可。在Tomcat效勞器上,此目錄可能是install_dir\webapps\ROOT\WEB-INF\classes\運行——啟動Tomcat效勞器,在地址欄輸入://localhost:8080/servlet/MyServletServlet根底33Eclipse中創立servlet創立WebProject-在project的src下創立servlet注意Servlet文件的訪問路徑要根據你創立servlet時的路徑來確定〔見圖〕34訪問路徑為:://localhost:8080/ServletDemo/servlet/myServlet35訪問路徑為:://localhost:8080/ServletDemo/otherServlet36<!--Fig.19.6:HTTPGetServlet.html--><HTML><HEAD><TITLE>ServletHTTPGETExample</TITLE></HEAD><BODY><FORMACTION="://localhost:8080/servletDemo/HTTPGetServlet"METHOD="GET"><P>ClickthebuttontohavetheservletsendanHTMLdocument</P><INPUTTYPE="submit"VALUE="GetHTMLDocument"></FORM></BODY></HTML>Action訪問路徑應與前面創立servlet的兩種情況匹配3711.5Servlet應用舉例1、處理HTTPGET請求在通過提交表單調用Servlet的時候,只需要把表單的action指向對應的Servlet例:HTTPGetServlet.javaHTTPGetServlet.html3811.5Servlet應用舉例2、處理HTTPPOSt請求及文件操作例:HTTPPostServlet.javaHTTPPostServlet.html3911.5Servlet應用舉例3、Servlet讀寫數據庫例:GuestBookServlet.javaGuestBookForm.html4011.5客戶端跟蹤客戶端跟蹤HTTP是無狀態協議,效勞器不能自動維護客戶連接的上下文信息許多情況下,Web效勞器必須要能夠跟蹤用戶的狀態比方購物網站和電子郵件網站,當用戶登錄以后,其身份和一系列的操作狀態都需要被跟蹤并保持servletAPI提供了兩種可以跟蹤客戶端狀態的方法CookieSession4111.5.1使用CookieCookieCookie是Web效勞器保存在用戶硬盤上的一段文本(不太準確)。cookie機制采用的是在客戶端保持狀態的方案。cookie的內容主要包括:名字、值、過期時間。以‘名/值’對(name-valuepairs)的形式儲存。〔見cookies文件〕cookie一般不存儲在硬盤上而是保存在內存〔如果設置了過期時間,那么保存在硬盤〕,cookie中保存的是字符串。其用途可以表達在如下幾點:在電子商務中標識用戶,實現短期跟蹤用戶記錄用戶名和用戶密碼,允許用戶下次自動登陸定制站點,記錄用戶的偏好,提供個人化效勞的網站定向廣告,記錄用戶感興趣的主題,并顯示與之相關的廣告客戶端跟蹤42調用Cookie的構造函數可創立一個cookie構造方法接收兩個字符串參數cookie名稱cookie的值例如創立一個名為CookieName,值為John的cookie,可以使用下面的語句Cookielogin=newCookie(“CookieName”,”John”);客戶端跟蹤11.5.1使用Cookie(續)

——創立Cookie對象43創立了一個名為login的cookie之后,可通過很多現有的方法設置cookie的值和屬性可通過如下語句設置cookie的注釋:login.setComent(“YoucangetUserNamefromthiscookie”);創立cookie并將它發送到瀏覽器后,默認情況下,它是會話級的cookie,僅僅存儲在瀏覽器內存中,用戶退出瀏覽器后,cookie將被刪除;如果希望將cookie存儲在磁盤上,那么需要設定MaxAge,給出一個以秒為單位的生命周期,如下可以將生命設置為一天login.setMaxAge(60*60*24) //onedaysetPath(),setValue(),setVersion(),setDomain(),setSecure()等,相關的具體用法請查看servletAPI11.5.1使用Cookie(續)

——設置Cookie屬性客戶端跟蹤44剛創立的cookie存在于效勞器內存中。必須將它發送到客戶端,cookie才能真正的發揮作用。發送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個HTTP響應報頭。發送的語句如下publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{Cookielogin=newCookie(“UserName”,”John”);login.setComent(“YoucangetUserNameformthiscookie”);res.addCookie(login);//...}客戶端跟蹤11.5.1使用Cookie(續)

——發送Cookie到客戶端45從客戶端讀取你感興趣的cookie,需要兩個步驟首先調用request.getCookies得到一個Cookie對象的數組然后調用每個cookie的getName方法,從數組中尋找所需的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方法得到相關cookie的值,設置MaxAge等客戶端跟蹤11.5.1使用Cookie(續)

——從客戶讀取Cookie4611.5.2使用SessionSessionsession機制是一種效勞器端的機制,效勞器使用一種類似于散列表的結構〔也可能就是使用散列表〕來保存信息。session中保存的是對象在一個Session中客戶可能會屢次請求訪問同一個網頁,也有可能請求訪問各種不同的效勞器資源,其間用戶的狀態需要跟蹤并保持當每個用戶首次與這臺WWW效勞器建立連接時,他就與這個效勞器建立了一個Session,同時效勞器會自動為其分配一個SessionID,用以標識這個用戶的唯一身份訪問者從到達某個特定主頁到離開為止的那段時間內單個客戶與web效勞器的一連串的交互過程存在于效勞器端,不在網絡上傳送它的好處是可以用來記錄客戶端私有的信息,并且在時間范圍內不會消失客戶端跟蹤47SessionIDServlet容器為HttpSession分配的一個唯一標識符作為Cookie保存在客戶的瀏覽器中sessioncookie每次客戶發出HTTP請求時,Servlet容器可以從HttpRequest對象中讀取SessionID,然后根據SessionID在效勞器端找到相應的HttpSession對象,從而獲取客戶的狀態信息,這樣的cookie叫做sessioncookie存儲于瀏覽器內存中的,并不寫到硬盤上的針對某一次會話而言,會話結束也就隨著消失了客戶端跟蹤11.5.2使用Session(續)

——存儲或讀取數據4811.5.2使用Session(續)Session的使用可以分為三個步驟獲得一個session存儲數據到session或從session讀取數據銷毀session客戶端跟蹤49通過調用ServletRequest的getSession方法可以得到一個sessionHttpSessionsession=request.getSession();為了保持正確的會話,必須在發送任何文檔到客戶程序之前獲得一個sessionpublicclassSessionServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//Gettheuser'ssessionHttpSessionsession=request.getSession(true);//...out=response.getWriter();//...}}客戶端跟蹤11.5.2使用Session(續)

——獲得一個Session50URL重寫瀏覽器不支持Cookie,或者將瀏覽器設置為不接受Cookie的情況,可通過URL重寫來實現會話管理向URL連接添加參數,并把sessionID作為值包含在連接中。為servlet響應局部的每個連接添加sessionID,可以使用一對方法response.encodeURL():使URL包含sessionIDresponse.encodeRedirectURL():使用重定向客戶端跟蹤11.5.2使用Session(續)

——存儲或讀取數據51從Session中讀取數據session.getAttribute(“name”)查找以前存儲的值如果不存在那么返回null在調用此方法返回的對象前,一定要檢查它是否為null向session中設置相關信息setAttribute替換掉此前設定的任何值removeAttribute移除而不是替換某個值客戶端跟蹤11.5.2使用Session(續)

——存儲或讀取數據52publicclassSessionServletextendsHttpServlet{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(續)

——SessionServlet.java客戶端跟蹤53銷毀Session意味著從系統刪除session對象及其值自動銷毀在一段時間〔時間長短依賴與Web效勞器的設定〕沒有request的情況下,Web效勞器會自動銷毀session手動銷毀通過調用session的invalidate方法可以手動的銷毀sessionlogout在支持servlet2.4的效勞器中,可調用logout將客戶從Web效勞器中注銷,同時廢棄所有與該用戶相關聯的會話需要注意的是,這個動作會影響到此servlet之外的其他servlet,因此一定要與網站的其他開發人員協調使用11.5.2使用Session(續)

——銷毀Session客戶端跟蹤54Cookies和Session例題CookiesCookieExample.javaSelectLanguage.htmlSessionTrackSession.javaAccessCount.java5511.6與客戶端交互HTTPservlet與客戶端的交互通過service方法處理客戶端的請求service方法根據請求(request)類型的不同,調用不同的方法對于GET請求,調用doGet()方法進行處理對于POST請求,調用doPost()方法進行處理5611.6.1提取Servlet信息注冊的servlet都有相關的很多初始化參數這些初始化參數寫在web.xml中,具體語法格式請參閱Tomcat文檔getInitParameter()方法可以得到servlet初始化的一些參數返回一個指定參數的值〔String類型〕如果指定參數不存在,那么返回nullgetInitParameterNames()方法可以得到初始化參數名稱返回String類型的Enumeration類型數據如果不存在初始化參數,那么返回一個null的Enumeration與客戶端交互57通過servlet初始化參數建立一個數據庫連接的程序段如下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.6.1提取Servlet信息(續)

——通過初始化建立數據庫連接與客戶端交互58輸出全部初始化參數名稱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.6.1提取Servlet信息(續)

——PrintInitParaNames.java與客戶端交互5911.6.2提取效勞器信息servlet可以得到很多效勞器相關的信息,同時可以將這些信息發送到客戶端getServerName()返回效勞器名稱getServerPort()返回效勞器監聽端口getServerInfo()輸出效勞器程序和版本,之間用“/”分開getAttribute()返回效勞程序的屬性得到路徑相關的信息publicStringHttpServletRequest.getPathInfo()publicStringHttpServletRequest.getPathTranslated()與客戶端交互60提取效勞器信息舉例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.6.2提取效勞器信息(續)

——例11_3與客戶端交互6111.6.3提取客戶端信息效勞器可以從request得到很多客戶端的信息getRemoteAddr():得到IP地址getRemoteHost():得到客戶端機器的名稱利用InetAddress.getByName()方法可以將IP地址或客戶端機器名稱轉換成一個類型的對象InetAddressremoteInetAddress=InetAddress.getByName(req.getRemoteAddr());通過獲取客戶端的地址,并判斷是否隸屬某個范圍,可以限制某個地區的用戶訪問你的網站與客戶端交互6211.6.3提取客戶端信息(續)效勞器可以得到客戶想做的事情客戶請求表現為表單數據,由“名/值”對組成。當提交某一個網頁的時候常常在瀏覽器地址欄中看到類似格式的數據格式name/value,每對之間用&隔開,表達式為param1=value1¶m2=value2¶m3=value3…request.getParameter:得到表單參數的值request.getParameterValues:得到屢次出現的參數值reques.getParameterNames:得到當前請求中所有參數的完整列表,調用形式如下publicStringServletRequest.getParameter(Stringname)publicString[]ServletRequest.getParameterValues(Stringname)與客戶端交互63書本查詢的一個HTML網頁!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.6.3提取客戶端信息(續)

——Query.html與客戶端交互64獲取客戶端信息的servletimportjava.io.*;import.*;importjavax.servlet.*;import.*;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.6.3提取客戶端信息(續)

——QueryServlet.java與客戶端交互6511.6.3提取客戶端信息(續)

——query.html與QueryServlet運行結果與客戶端交互6611.6.4發送HTML信息Web效勞器響應(response)的構成狀態行由版本(HTTP/1.1),一個狀態代碼(200)和一段對應狀態代碼的簡短消息(OK)組成一些響應報頭、Content-Type:text/html指定后面文檔MIME類型,后面的其他報頭可選。常用MIME類型有:text/html:HTML文檔text/plain:純文本text/xml:XMLimage/jpeg:JEPG圖像application/msword:MicrosoftWord文檔application/pdf:crobat文件application/zip:Zip檔案一個空行和響應的文檔與客戶端交互67HTTP/1.1200OK //狀態行Content-Type:text/html //報頭Header2:……HeaderN:… //空行<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"> //文檔<HTML><HEAD>headcode</HEAD><BODY>…</BODY></HTML>11.6.4發送HTML信息(續)與客戶端交互68向客戶端輸出一個簡單網頁,顯示“HelloWorld!”importjava.io.*;importjavax.servlet.*;import.*;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.6.4發送HTML信息(續)

——例11_4與客戶端交互69程序說明HelloWorld繼承了HttpServlet,然后重寫doGet方法在doGet方法中,首先將HTTPContent-Type響應報頭設置為text/html,即指定響應的類型為HTML文檔;然后通過getWriter()得到PrintWriter類型的一個對象out,按照HTML格式輸出一個簡單網頁運行結果11.6.4發送HTML信息(續)

——例11_4運行結果與客戶端交互7011.4與客戶端交互HTTPservlet與客戶端的交互通過service方法處理客戶端的請求service方法根據請求(request)類型的不同,調用不同的方法對于GET請求,調用doGet()方法進行處理對于POST請求,調用doPost()方法進行處理7111.4.1提取Servlet信息注冊的servlet都有相關的很多初始化參數這些初始化參數寫在web.xml中,具體語法格式請參閱Tomcat文檔getInitParameter()方法可以得到servlet初始化的一些參數返回一個指定參數的值〔String類型〕如果指定參數不存在,那么返回nullgetInitParameterNames()方法可以得到初始化參數名稱返回String類型的Enumeration類型數據如果不存在初始化參數,那么返回一個null的Enumeration與客戶端交互72通過servlet初始化參數建立一個數據庫連接的程序段如下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信息(續)

——通過初始化建立數據庫連接與客戶端交互73輸出全部初始化參數名稱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信息(續)

——PrintInitParaNames.java與客戶端交互7411.4.2提取效勞器信息servlet可以得到很多效勞器相關的信息,同時可以將這些信息發送到客戶端getServerName()返回效勞器名稱getServerPort()返回效勞器監聽端口getServerInfo()輸出效勞器程序和版本,之間用“/”分開getAttribute()返回效勞程序的屬性得到路徑相關的信息publicStringHttpServletRequest.getPathInfo()publicStringHttpServletRequest.getPathTranslated()與客戶端交互75提取效勞器信息舉例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提取效勞器信息(續)

——例11_3與客戶端交互7611.4.3提取客戶端信息效勞器可以從request得到很多客戶端的信息getRemoteAddr():得到IP地址getRemoteHost():得到客戶端機器的名稱利用InetAddress.getByName()方法可以將IP地址或客戶端機器名稱轉換成一個類型的對象InetAddressremoteInetAddress=InetAddress.getByName(req.getRemoteAddr());通過獲取客戶端的地址,并判斷是否隸屬某個范圍,可以限制某個地區的用戶訪問你的網站與客戶端交互7711.4.3提取客戶端信息(續)效勞器可以得到客戶想做的事情客戶請求表現為表單數據,由“名/值”對組成。當提交某一個網頁的時候常常在瀏覽器地址欄中看到類似格式的數據格式name/value,每對之間用&隔開,表達式為param1=value1¶m2=value2¶m3=value3…request.getParameter:得到表單參數的值request.getParameterValues:得到屢次出現的參數值reques.getParameterNames:得到當前請求中所有參數的完整列表,調用形式如下publicStringServletRequest.getParameter(Stringname)publicString[]ServletRequest.getParameterValues(Stringname)與客戶端交互78書本查詢的一個HTML網頁!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提取客戶端信息(續)

——Query.html與客戶端交互79獲取客戶端信息的servletimportjava.io.*;import.*;importjavax.servlet.*;import.*;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提取客戶端信息(續)

——QueryServlet.java與客戶端交互8011.4.3提取客戶端信息(續)

——query.html與QueryServlet運行結果與客戶端交互8111.4.4發送HTML信息Web效勞器響應(response)的構成狀態行由版本(HTTP/1.1),一個狀態代碼(200)和一段對應狀態代碼的簡短消息(OK)組成一些響應報頭、Content-Type:text/html指定后面文檔MIME類型,后面的其他報頭可選。常用MIME類型有:text/html:HTML文檔text/plain:純文本text/xml:XMLimage/jpeg:JEPG圖像application/msword:MicrosoftWord文檔application/pdf:crobat文件application/zip:Zip檔案一個空行和響應的文檔與客戶端交互82HTTP/1.1200OK //狀態行Content-Type:text/html //報頭Header2:……HeaderN:… //空行<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"> //文檔<HTML><HEAD>headcode</HEAD><BODY>…</BODY></HTML>11.4.4發送HTML信息(續)與客戶端交互83向客戶端輸出一個簡單網頁,顯示“HelloWorld!”importjava.io.*;importjavax.servlet.*;import.*;publicclassHelloWorldextendsHttpServlet{publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)

thro

溫馨提示

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

評論

0/150

提交評論