中文第三章java servlet編程本章重點(diǎn)介紹JavaWeb的Servlet讀者如果_第1頁
中文第三章java servlet編程本章重點(diǎn)介紹JavaWeb的Servlet讀者如果_第2頁
中文第三章java servlet編程本章重點(diǎn)介紹JavaWeb的Servlet讀者如果_第3頁
中文第三章java servlet編程本章重點(diǎn)介紹JavaWeb的Servlet讀者如果_第4頁
中文第三章java servlet編程本章重點(diǎn)介紹JavaWeb的Servlet讀者如果_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第三章JavaServletJavaWebServletServlet編程,對(duì)于后面的JSP編程,會(huì)達(dá)到事半功倍的效果。JavaJava程序一樣編寫、編譯,它的特殊點(diǎn)在于,Servlet必須ServletHttpServlet這個(gè)類,本書也是如此。CGIASPServlet(以及3-1JSP/ServletWeb-BasedWeb服務(wù)3-1Servlet/JSPServletServlet編3-1Servlet源文件:packagepackageimportjava.io.*;importjavax.servlet.*;importimportpublic{oWorldextendspublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{PrintWriterout=response.getWriter();out.println(newDate());}}我們來分析一下這個(gè)程序。從這個(gè)程序中可以看出,它引入了java.servlet和java.servlet.httpJ2SEJ2EEservletCLASSPATHjavac來編譯它。在這個(gè)程序中我們讓oWorld這個(gè)類繼承了HttpServlet,并且覆蓋了HttpServlet中的doGet()方法,使得它可以處理客戶端的GET方式的請(qǐng)求,我們已經(jīng)在第一章中對(duì)瀏覽器中的提交方式做了說明,在這里,我們直接在瀏覽器中輸入地址來此Servlet資源,屬于使用GET方式。在doGet()方法中有兩個(gè)參數(shù):HttpServletRequest和HttpServletResponse,HttpServletRequest,可以從客戶端中獲得很多客戶端發(fā)送過來的信息,而通過HttpServletResponse,我們可以讓服class文件放入到第一c:\JavaWebExam\WEB-INF\classes\chap03這個(gè)拷貝到上面的中。然后,為了能夠從客戶端瀏覽器到這個(gè)Servlet程序,必須進(jìn)行一些配servlet如果你希望每次新增一個(gè)Servletservlet(servlet servletservlet映射就可以servletservlet類一個(gè)別名,然后在瀏覽器中就可以使用這個(gè)別名來servlet 如果你不想將servlet的實(shí)際路徑給客戶端的用戶,那么你可以給這個(gè)servlet配WebWEB-INF 這段代碼中的<servlet-name><url-pattern>中設(shè)置的就是用來提供給瀏覽器的地址。假設(shè)我們?cè)趙eb.xml 來它Tomcat接收到對(duì)/oServlet的請(qǐng)求后將會(huì)在web.xml中尋找/oServletservlet-namefirstServletfirstServletservlet類中得到和圖3-2所示類似的結(jié)果。如果點(diǎn)擊瀏覽器中的“刷新”,頁面上的時(shí)間將會(huì)每次都不同,也就是說,每當(dāng)瀏覽器連接一次這個(gè)Servlet程序,此oWorld程序就servlet

圖3-2oWorld運(yùn)行結(jié)servletservlet是第一次被調(diào)用,那么servletservlet已經(jīng)被實(shí)例化,那么,服務(wù)器只是會(huì)新啟動(dòng)一個(gè)線程來運(yùn)行它。也就是說,servlet會(huì)一直駐留在內(nèi)存中,而不是對(duì)于每次的連接都重新創(chuàng)建實(shí)例這是servlet不同于其他的頁編程語言的一個(gè)重要?jiǎng)e,讓這些線程不會(huì)到不同步的數(shù)據(jù)。在Servlet2.3之前,可以通過讓servlet類實(shí)現(xiàn)SingleThreadModel這個(gè)接口來避免這個(gè)問題,它將會(huì)對(duì)于每個(gè)客戶端的請(qǐng)求都產(chǎn)生deprecatedServlet2.4的Web服務(wù)器上使synchronized關(guān)鍵字來保護(hù)共享的對(duì)象。從示例3-1可以看到,我們?cè)诰帉懽约旱膕ervlet程序的時(shí)候,通常都是讓它繼承的方法有:init()、doGet()、doPost()destroy()。下面對(duì)這些方法一一說明。HttpServletdoGet()方法,可以處理瀏覽外一種請(qǐng)求方式:POSTservlet中使用哪個(gè)方法來處doPost()方法。publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//Get}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//Get}publicpublicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{}GETPOST3.2.3servlet的實(shí)例,也servletservlet的實(shí)例。其實(shí),在創(chuàng)建這個(gè)servlet實(shí)例的時(shí)候,HttpServlet中的init()方被調(diào)用如果我們需要對(duì)這個(gè)servlet做destroy()servletservlet實(shí)例之前,destroy()方法。可以在這個(gè)方法中執(zhí)行一些清理的動(dòng)作,比如釋放數(shù)據(jù)servletWeb服servlet的請(qǐng)求時(shí),Webservlet的實(shí)例,并且調(diào)用doXXX()servletWeb服務(wù)器中刪除的時(shí)候,Web服務(wù)器將會(huì)調(diào)用servlet的destroy()方法。利用ServletHTML表單數(shù)在Servlet中客戶端發(fā)送的數(shù)(提交到<FORM>標(biāo)記的ACTION析這個(gè)“名-Servlet中,我們可Servlet內(nèi)建機(jī)制,輕易的達(dá)到我們的目的。處理,并且,這兩個(gè)方法都有相同的參數(shù):HttpServletRequestHttpServletResponse。通HttpServletRequestgetParameter()方法,并且給這個(gè)戶端接收用戶名和,用戶將表單填寫好以后,將它提交給getData這個(gè)Servlet3-2HTML源文件:Name"Name"<FORMNAME="Longin":<INPUTTYPE="TEXT": Pwd""在這個(gè)HTML<FORM>ACTION屬性為“servlet/chap03.GetData”,也就是說,這個(gè)表單將提交 Pwd""下面我們?cè)賮砜纯疵麨镚etData的servlet類源文件:Getpackagepackageimportjava.io.*;importjavax.servlet.*;importimportpublicclass{DataextendspublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{”“Name= “”PwdPwd=request.getParameter("PrintWriterout=}}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}out.println("UserservletdoGet()doPost()方法,doPost()方法只是簡(jiǎn)單的HttpServletRequestgetParameter()方法取出參數(shù)值,并且將它打印到客且在其中輸入和,如圖3-3所示。3-3HTML在表單中輸入數(shù)據(jù)后,點(diǎn)擊“提交”按鈕將表單提交,此處會(huì)將表單提交到圖3-4GetData執(zhí)行結(jié)其實(shí)在這個(gè)例子中你也可以不用表單直接向GetData這個(gè)servlet傳遞數(shù)據(jù),url:Bush&…publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{ Name=request.getParameter(" Pwd=request.getParameter(" …publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{ Name=request.getParameter(" Pwd=request.getParameter(" PrintWriterout=out.println("UserName:"+}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{PrintWriteroutresponse.getWriter();……}servletgetParameterValues()方源文件: :: :<SELECTNAME="Favor"MULTIPLE<OPTION<OPTION<OPTION<OPTION<OPTION<OPTION"Data.htm源文件:Getpackagepackageimportjava.io.*;importjavax.servlet.*;importimportpublicclass{Data1extendspublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{ Name=request.getParameter(" Pwd=request.getParameter(" //取出 String[]favor=request.getParameterValues("Favor");PrintWriterout=response.getWriter();out.println("UserName:"+//將 for(inti={ }}publicvoiddoPost(HttpServletRequest}}}{HttpServletResponsethrowsString[]String[]favor=for(inti={ }另外,如果需要將表單中的所有元素的數(shù)據(jù)都出來,可以在servlet中使用HttpServletRequestfor(inti={ }3-53-5FavorgetParameterValues()來取得可能傳遞過來的多個(gè)值。HTTPservletHTTPservletHttpServletRequestgetHeader()HTTP請(qǐng)另外,這些報(bào)頭的參數(shù)名稱不區(qū)分大小寫,也就是說,也可以通過getHeader("user-agent")User-Agent報(bào)頭。3-1HTTP3-1常用HTTP瀏覽器可接受的MIME瀏覽器能夠進(jìn)行的數(shù)據(jù)編碼方信息,通常出現(xiàn)在對(duì)服務(wù)器發(fā)送的WWW-Authenticate頁面包含多個(gè)元素時(shí)(例如Applet,),顯著地減少所需要的時(shí)間Content-向服務(wù)器返回服務(wù)器之前設(shè)置的信URL中的主機(jī)和端口,可以通過這個(gè)信息獲得提出請(qǐng)求的機(jī)器主機(jī)名稱包含一個(gè)URL,用戶從該URL代表的頁面出發(fā)當(dāng)前請(qǐng)求的頁面。也就是說,是從哪個(gè)頁面進(jìn)入到這個(gè)Servlet的瀏覽器相關(guān)信息,如果Servlet只有當(dāng)所請(qǐng)求的內(nèi)容在指定的日期之后又經(jīng)過修改才返回它,否則返回304“NotModified”應(yīng)答,這樣瀏覽器就可以直接使用緩存中的內(nèi)容而不需要再servlet3-6HTTPpackagepackageimportjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importjava.util.Date;publicclassGetRequestHeaderextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{StringHeader[]={"Accept","Accept-Encoding","Accept-Charset",PrintWriterout=response.getWriter();out.println("Httpout.println("HttpRequestHeader</TITLE></HEAD>");out.println("HttpHeaderName");out.println("HttpHeaderValue");for(inti={}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}}}使用IE或者Netscape瀏覽器 這個(gè)servlet,比較兩種瀏覽器 同。圖3-6是在IE6中得到的結(jié)果。3-6在IEHTTPgetHeaderNames():使用這個(gè)方法可以得到一個(gè)包含了所有的請(qǐng)求頭名稱的Enumerationint的。CGI變量CGICGI編程中常用的,它匯集了各種有關(guān)請(qǐng)求的信息,這些信息中,HTTPSocket本身,而有些是和服務(wù)器的安裝配置相ServletCGICGIHttpServletRequest上的相3-2CGICGI只用于POST請(qǐng)求,表示所發(fā)送數(shù)據(jù)的任意HTTPURL中的附加路徑信息,即URL中映射到服務(wù)器實(shí)際路徑之后的路徑信這是字符串形式的附加到URL后面的“=”隔開的。在Servlet中很少需要用 的數(shù)據(jù),一般使用getParameter各個(gè)參數(shù)。發(fā)出請(qǐng)求的客戶端機(jī)器的IP如名,則返回IP地址。GET或者POSTHEADPUT、DELETE、OPTIONS,或者TRACE。URLServlet的那一部分,不包Web服務(wù)器名字,注意和服務(wù)器的端口,比如Tomcat常用8080,Weblogic7001等。請(qǐng)求命令中的協(xié)議名字和版本(HTTP/1.0或HTTP/1.1)3-1CGI3-7ServletCGIpackagepackageimportjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importjava.util.Date;publicclassGetCGIVarextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{{ PrintWriterout=response.getWriter();out.println("CGIVarName");//for(inti={}}}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}3-73-7servlet獲得CGIservletCGI變量有哪些值不一樣。servletHTTP,面我們已經(jīng)學(xué)習(xí)了如何通過servlet來獲得HTTP請(qǐng)求報(bào)頭,在本節(jié)學(xué)習(xí)servlet來設(shè)置響應(yīng)報(bào)頭。,setHeader(StringheaderName,StringservletHttpServletResponsesetHeader()setHeader(StringheaderName,String3-3HTTPContent-Content-Tomcat安裝下的confweb.xml文件,里面列出了幾乎所有的MIMEContent-用于標(biāo)明頁面所使用的語言,例如en、en-us這個(gè)報(bào)頭表明瀏覽器自動(dòng)重新調(diào)用的頁面除了setHeader()方法外,還有兩個(gè)方法用于設(shè)置日期或者整形數(shù)據(jù)格式報(bào)頭的方法:setDateHeader(StringheaderName,longms)和setIntHeader(StringheaderName,intservletHTML格式的時(shí)候。setContentLength(intlength)Content-LengthsendRedirect(Stringurl)Locationservleturlservlet動(dòng)態(tài)生成Content-Type的設(shè)置和用途,使用例子的是現(xiàn)在比較常用的用于生成登陸或時(shí)候的,如圖3-8就是一個(gè)比較典型的登錄界面,這里就用到了。這個(gè)功能是為了防止有的用戶使用自動(dòng)機(jī)等工具來不停的登錄而設(shè)立的。我們知道,有一些工具使用窮舉法來獲得用戶的,這種方式雖然效率低下,但是只要有足夠耐心,基本可以所有的。而因?yàn)橛脩裘褪窍鄬?duì)固定的,所以你很難防止。因此,須使用某種方法來動(dòng)態(tài)的然后一方面將這個(gè)生成顯示給用戶,一方面將它保存在服務(wù)器上,當(dāng)用戶進(jìn)行碼相比較,如果一致并且用戶名和正確則可以登錄,否則讓其登錄。之所以使用而不是直接使用文字顯示主要是為了防止有些工具能夠通過分析網(wǎng)頁而得到在這個(gè)例子中,我們來討論如何產(chǎn)生隨機(jī)的四位(這個(gè)功能其實(shí)很容易實(shí)現(xiàn),有Java編程基礎(chǔ)的讀者應(yīng)該很容易完成這個(gè)功能),并且將這四位產(chǎn)生圖形到客戶3-83-8servlet中產(chǎn)生packagepackageimportjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importjava.util.Random;importjava.awt.*;importjava.awt.image.*;importjavax.imageio.*;publicclassImgextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{OutputStreamout=response.getOutputStream();intwidth=80,height=20;//BufferedImageBufferedImageimage=newBufferedImage(width,Graphicsg=//Randomrandom=newg.fillRect(0,0,width,//g.setFont(newFont("TimesNewRoman",Font.ITALIC,18));StringsRand="";for(intStringrand=String.valueOf(random.nextInt(10));sRand+=rand;//g.setColor(newColor(20++random.nextInt(110),20+}}g.drawString(rand,20*i+}//ImageIO.write(image,"JPEG",}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}在這個(gè)程序中,我們首先指定了這個(gè)servlet的Content-Type,將它的值設(shè)置為“image/jpegservletMIME格式,為了避免在瀏覽器端使用緩存里的圖像,在程序中使用三條語句來避免客戶端緩存。然后使用BufferedImage在內(nèi)存getGraphics()Graphics對(duì)象,然ImageIOwrite()將圖形對(duì)象按照“JPEG3-93-9現(xiàn)在,可以使用這個(gè)隨機(jī)圖形生成servlet,生成隨機(jī)作為登錄界面的了,:<INPUTTYPE="TEXT":<INPUTTYPE="TEXT"SIZE="10"<IMGSRC="servlet/chap03.Img"><!--插 <INPUT<IMG在這個(gè)HTML程序中,我們定義了一個(gè)表單,用于接收用戶的登錄名和 <IMG和我們前面學(xué)習(xí)HTML的<IMG>不同的是,在這里SRC的是一個(gè)servlet,而不是我們熟悉的,其實(shí),這個(gè)servlet也是返回一個(gè)。者使用OCR3-10HTML圖3-10帶的登錄表servletservletservlet用于處理用戶的登AB頁面或者返回到登錄頁面。在這個(gè)可以使用HttpServletResponse的sendRedirect()URLsendRedirect()時(shí),Web服務(wù)器將會(huì)向?yàn)g覽器返回響應(yīng),指示瀏覽器請(qǐng)求新的URL。因?yàn)闉g覽器會(huì)重新提出新的請(qǐng)求,所以在跳轉(zhuǎn)之前所的所有3-11servlet(步URL(3),然后瀏覽器提出新的請(qǐng)求(4),服務(wù)器再根據(jù)瀏覽器端的新的請(qǐng)求做出響應(yīng)(5)sendRedirect()方法實(shí)現(xiàn)跳轉(zhuǎn)會(huì)需要瀏覽HttpServletResponse3-10sendRedirectpackagepackageimportjava.io.*;importjavax.servlet.*;importpublicclassRedirectextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{//}}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}URL:login.htmURL的變化,可以看出,地址欄sendRedirect()RequestDispatcherforward()sendRedirect()方法很重要的一個(gè)區(qū)別。另外,forward()sendRedirect()方法不同的另一個(gè)地方在于,當(dāng)執(zhí)行到這URL。下面forward()方法實(shí)現(xiàn)跳轉(zhuǎn)的例子:3-11RequestDispatcherforwardpackagepackageimportjava.io.*;importjavax.servlet.*;importpublicpublicclassForwardextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{RequestDispatcherrd;{rd=request.getRequestDispatcher("chap03.Img");}{rd=request.getRequestDispatcher("chap03.Test");}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}}在這個(gè)程序中,我們根據(jù)表單數(shù)據(jù)Dir的值,來決定跳轉(zhuǎn)的目的:如果Dir“imageservlet3-12request

chap03.Testpackagepackageimportjava.io.*;importjavax.servlet.*;importpublicpublicclassTestextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{PrintWriterout=response.getWriter();}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}}request中的那些屬性也會(huì)一同轉(zhuǎn)發(fā),所以在這個(gè)程序里可以取出“Dir”3-12URL3-12forward()JSP編程的相關(guān)內(nèi)容。HTTPWeb應(yīng)用的時(shí)候,可能經(jīng)常需要使用中文的界面。但是,因?yàn)榫幋a的問源文件:packageimportjava.io.*;importjavax.servlet.*;importpublicpackageimportjava.io.*;importjavax.servlet.*;importpublic{oWorldextendspublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{PrintWriteroutresponse.getWriter();}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}}3-13“GBKServlet中,可以通過修改“Content-TypesetContentType()這個(gè)方法去設(shè)置“Content-Type”報(bào)頭,比如,我們對(duì)上面的程序稍作修改,在使用獲得HttpServletResponse的getWriter()獲得輸出流之前加上如下語句:輯,然后重新在瀏覽器中它,將得到如圖3-14的輸出結(jié)果。3-14response.setContentType()一定要放在response.getWriter()之前才能Content-Type,就可以解決向客戶端輸出中文的問題。但是,如果向客戶端servlet在表單數(shù)據(jù)的時(shí)候,也是采用的“iso-8859-1”的編碼方式,所以,這個(gè)時(shí)候讀出來的數(shù)據(jù)就已經(jīng)是亂碼了,如果將這個(gè)出來的數(shù)據(jù)向客戶端輸出,即使設(shè)置了Type“GBK這個(gè)任務(wù)可以由HttpServletRequest上的setCharacterEncoding()方法來完成,它接收一個(gè)String參數(shù)用于指定編碼。只需要在表單數(shù)據(jù)之前,調(diào)用這個(gè)方法來將編碼設(shè)置成源文件:<FORMNAME="test" <INPUTTYPE="text"<INPUT這個(gè)html文件中,定義了一個(gè)表單,這個(gè)表單將會(huì)提交到oWorld這3-15servlet源文件:packagepackageimportjava.io.*;importjavax.servlet.*;importpublic{oWorldextendspublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{PrintWriterout=response.getWriter();}publicpublicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}}}doGet()servlet表單參數(shù)的servlet中正確的讀出來。3-15setCharacterEncoding()servlet的運(yùn)行結(jié)果,而右邊是使用了這個(gè)方法將默認(rèn)的參數(shù)方式改成“GBK”后servlet的運(yùn)行結(jié)果3-15ServletGETPOST解決POST方式提交表單的中文問題,但還是無法正確處理GETServlet容器的相關(guān)文檔來解決這個(gè)問題。對(duì)于本書所使用的Tomcat5.28,可以通過修改Tomcatserver.xml<Connector>TomcatGET3.7.1基我們知道,HTTP連接是一個(gè)無狀態(tài)的連接,這就意味著,當(dāng)瀏覽器得到它所請(qǐng)求的這樣,通過,客戶端和服務(wù)器端就建立起了一種松散的聯(lián)系。也就是說,是Web的應(yīng)用的功能。,碼利用保存在客戶端,當(dāng)用戶下一次這個(gè)的時(shí)候,可以直接從客戶端讀出用戶名和來,這樣就可以免得用戶每次都需要重新登錄。另外,我們可能需要讓用戶以按照他預(yù)設(shè)的顯示。除了這些功能外還是另一個(gè)重要應(yīng)用session的基石,關(guān)于session的使用,請(qǐng)閱讀下一節(jié)的內(nèi)容。,所帶來的重大的安全問題,這主要也是由的安全機(jī)制所決定的:不會(huì)以任何盤被這些所了。雖然不太可能帶來安全問題,但因?yàn)樗鼤?huì)保存信息到客3.7.2servlet中處理先需要?jiǎng)?chuàng)建一個(gè)的實(shí)例,可以通過的構(gòu)造器來創(chuàng)建,它接收兩個(gè)String屬性值。另外還有一些方法,請(qǐng)參考表3-4。表3-4方置了一個(gè)負(fù)值表示這個(gè)在用戶退出瀏覽器后馬上過期,如果setMaxAge()0值,表示刪除此/設(shè)置屬性 /在創(chuàng)建好對(duì)象后,需要將它發(fā)送到客戶端,可以使用HttpServletResponse的add()方法來實(shí)現(xiàn),它接收一個(gè)類型的值,并將這個(gè)發(fā)送到客戶端法來將不同的發(fā)送到客戶端。在將發(fā)送到客戶端以后可以使用HttpServletRequest的gets()方法從客戶端獲得這個(gè)的所有的,它返回包含所有本站的數(shù)組,然后通過遍歷這個(gè)數(shù)組就可以獲得對(duì)應(yīng)的。默認(rèn)情況下,在客戶端是保存在內(nèi)存中的,如果瀏覽器關(guān)閉,那么,也就失效了,如果想要讓長(zhǎng)久的保存到磁盤上,需要讓的生命周期變得更長(zhǎng)可以通過對(duì)象的setMaxAge()來修改它的生命周期,這個(gè)方法接收一個(gè)以秒為單位的整數(shù),表示這個(gè)可以在客戶端的保存時(shí)間。如果將它設(shè)置成0,則表示在客戶端HTMLservlet來完成這個(gè)功能,這是因?yàn)槲覀冞€需要通過這個(gè)文件去試圖客戶端的,而HTML文件無法完成這個(gè)功能。packagepackageimportjava.io.*;importjavax.servlet.*;importpublicclassLoginServletextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{StringName=StringPwd=//獲得所有[]s=request.gets();StringuserName="";Stringpwd="";StringisChecked="";{//如果曾經(jīng)設(shè)置過,checkbox狀態(tài)應(yīng)該是checkedisChecked="checked";for(inti=0;i<{{userName=}{pwd=}}}PrintWriterout=response.getWriter();}} <FORM+" :<INPUT+" :<INPUT+" :<INPUT+" :<INPUT+" <INPUT <INPUTTYPE=\"SUBMIT\">\n"); }publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}……s=…{ ,checkbox狀態(tài)應(yīng)該是isChecked=for(intfor(inti= {{userName }{userName }{pwd }}}…在這個(gè)程序中,我們?nèi)〕霰4嬖诳蛻?中的登錄名 ,然后將它設(shè)置HTML表單中的登錄名和 下面我們?cè)賮砜丛O(shè)置的程序源文件:packagepackageimportjava.io.*;importjavax.servlet.*;importpublic{TestextendspublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{=new= {}{{}{} PrintWriterout=response.getWriter(); }publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}}在這個(gè)程序中首先生成了兩個(gè)對(duì)象分別用來表單中傳遞過來的登錄和,然后根據(jù)客戶端的“Save”元素,決定是否向客戶端發(fā)送,或者刪除以前的,通過對(duì)象的setMaxAge()可以實(shí)現(xiàn)這個(gè)目的。記住,如果setMaxAge()的參數(shù)為0,表示刪除客戶端對(duì)應(yīng)的。圖3-16左邊是第一次LoginServlet的結(jié)果,右邊是選擇了將用戶名和保存到圖3-16使 的登錄表在上一節(jié)我們,HTTP協(xié)議是一個(gè)“無狀態(tài)”的協(xié)議,因此,要用戶的狀態(tài)String數(shù)據(jù)。技術(shù)就不能再使用了。在一些Web編程語言中,這確實(shí)是一個(gè)大問題,但是,Sun創(chuàng)造性的提出了另外一種替代的方法,那就是所謂的URL重寫。所謂的URL重寫,簡(jiǎn)單而言,就是將本來保存在中的用于標(biāo)識(shí)不同客戶端的sessionID放在url后面,如: 瀏覽器的功能,session還是能正常使用。一般來說,支持J2EE的Web服務(wù)器會(huì)自動(dòng)根據(jù)情況在和URL重寫之間進(jìn)行切換,不需要我們干預(yù)。但是,后面會(huì)看到,對(duì)于URL重寫實(shí)現(xiàn)的session,程序員還是需要做一些工作,以確保session能夠被servlet中會(huì)話狀servlet中,sessionjavax.servlet.http.HttpSession這個(gè)接口中的。這個(gè)接口構(gòu)建在或者URL重寫的基礎(chǔ)上。要得到一個(gè)HttpSession的實(shí)例,可以通過HttpServletRequest的getSession()方法來獲得HttpServletRequest有兩個(gè)重載的getSession()方法,一個(gè)不帶任何參數(shù),一個(gè)接收一個(gè)boolean類型的值,getSession方法和getSession(true)session,那么就會(huì)返回而如果getSession(false)表示如果對(duì)應(yīng)的客戶端已經(jīng)有對(duì)應(yīng)的session,那么返回這個(gè)舊的session是否為新建的。HttpSession3-5列出了這些常用的方3-5HttpSession從session中返回指定namename屬性不存在,則返回Enumeration返回session中所有的屬性名稱,并且封裝在EnumerationvoidsetAttribute(Stringname,Object在session中設(shè)置名稱為name的屬性,屬性值為一個(gè)對(duì)象valuevoidremoveAttribute(String從session中刪除指定名稱namevoid整個(gè)session,并且釋放sessionboolean用于檢測(cè)此sessionlong197011日以來的毫秒數(shù)int 來session而getSession()是在向客戶端輸出內(nèi)容之后被調(diào)用,將會(huì)拋出一個(gè)IllegalStateException異常。sessionHttpSessionservlet將保存HTML文件,請(qǐng)讀者參考上面的程序,自己稍作修改作為這個(gè)例子的登錄表單。session3-18sessionpackagepackageimportimportjavax.servlet.*;importjavax.servlet.http.*;publicclassSaveInfoextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{ 錄 //session//session{HttpSessionsession=request.getSession();}PrintWriterout=response.getWriter();out.println("Session已經(jīng)創(chuàng)建");}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}}下面我們?cè)賮砜磗ession的程序。示例3-19:從session中數(shù)packagepackageimportjava.io.*;importimportjava.io.*;importjavax.servlet.*;importpublicclassGetSessionextends{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws{PrintWriterout=response.getWriter();Stringuser=HttpSessionsession=request.getSession(false);{userString)session.getAttribute("userName");out.println("獲得創(chuàng)建的Session");}{}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws{}}有登錄,則自動(dòng)跳轉(zhuǎn)到登錄表單頁面“SessionLogin.htmsession中保存的sessionsession中的這些商品取出來。上面我們討論的都是基于技術(shù)的session,如果客戶端關(guān)閉了功能,那URLsession功能。雖然這個(gè)動(dòng)作不需在兩種情況下:一種是在servlet(或者JSP)中生成了超連接;還有一種情況是使用了HttpServletResponsesendRedirect()servlet程序員而言,只需要通過簡(jiǎn)單的編程即可實(shí)現(xiàn)這個(gè)功能:通過將產(chǎn)生的超URL調(diào)用HttpServletResponse的encodeURL()方法或者對(duì)sendRedirect()方法使用的URL調(diào)用HttpServletResponseencodeRedirectURL()方法,就可以對(duì)它們進(jìn)行必要的編碼:如果URLsessionURL后面自動(dòng)加上必要的例如,對(duì)于代碼SaveInfo.java中的超URL,如果要讓它能夠適應(yīng)URL重寫,應(yīng)response.encodeURL("chap03.GetSession")。將瀏覽器的功能關(guān)閉,此時(shí),SaveInfo中產(chǎn)生的超將會(huì)是和sessionsessionID。個(gè)應(yīng)用下的所有的Servlet/JSP共享這個(gè)容器中的屬性。我們可以將一些共享信息保存到servletcontext中,那么,同一應(yīng)用下的任何的Servlet/JSP或者JavaBean等都可以到來獲得表示對(duì)應(yīng)的servlet上下文的對(duì)象。為了讓我們更加方便的獲得它,可以調(diào)用GenericServletgetServletContext()方法。ServletContextStringgetRealPath(Stringpath)path轉(zhuǎn)換成物理路徑,用所對(duì)應(yīng)的根,在本章的前面的例子中已經(jīng)用到了這個(gè)方法;voidsetAttribute(Stringname,Objectvalue):將一個(gè)屬性保存到上下文中,屬性名removeAttribute()方法;name)null。注意這個(gè)方法的返回值Object,所以在取出來后,通常需要將它向下造型成原來的類型。StringgetInitParameter(Stringname)web.xml中設(shè)置的上下文相關(guān)的初始化參數(shù)值,其中,name為參數(shù)名稱,而返回的數(shù)據(jù)為對(duì)應(yīng)的參數(shù)的值。EnumerationgetInitParameterNames()web.xml中設(shè)置的所有上下文相關(guān)Enumeration類型。這個(gè)程序的時(shí)候,我們?cè)谶@個(gè)程序中將數(shù)加上1,然后保存到servlet上下文中,3-20ServletContextpackagepackageimportjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;publicclassFirstServletextends{publicvoiddoGet(HttpServletRequestHttpServletResponseresponse)throwsServletException,IOException{ServletContextctx=this.getServletContext();{Integercounter=(Integer)ctx.getAttribute("UserNumber");inttmp=0;//counter//servletUserNumber}}}if(counter=={counter=new}{tmp=Value()+1;counter=newInteger(tmp);}}PrintWriterout=response.getWriter();HttpServlet的getServletContext()(GenericServlet從servlet上下文中一個(gè)名為“UserNumber”的屬性值,如果這個(gè)屬性值不存(getAttribute()方法返回null值),說明“UserNumber”還沒有被設(shè)置,此次為第一次,否則,將其中的計(jì)數(shù)值出來加上1,再寫回到上下文中。到它,例如,我們?cè)诹硪粋€(gè)Servlet程序中可以將它出來:示例3-21:從ServletContext中計(jì)數(shù)packagepackageimportjavax.servlet.*;importjavax.servlet.http.*;importimportpublicclassUserNumberextends{publicvoiddoGet(HttpServletRequestHttpServletResponseresponse)throwsServletException,IOException{ServletContextctx=Integercounter=PrintWriterout=response.getWriter(); }}}if(counter!={}{ 的}這個(gè)程序中,也是首先通過HttpServlet的getServletContext()方法獲得表示對(duì)應(yīng)的 的}圖3-17是這個(gè)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論