關(guān)鍵技術(shù)jsp與jdbc應(yīng)用詳解_第1頁(yè)
關(guān)鍵技術(shù)jsp與jdbc應(yīng)用詳解_第2頁(yè)
關(guān)鍵技術(shù)jsp與jdbc應(yīng)用詳解_第3頁(yè)
關(guān)鍵技術(shù)jsp與jdbc應(yīng)用詳解_第4頁(yè)
關(guān)鍵技術(shù)jsp與jdbc應(yīng)用詳解_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第 6 章Servlet 技術(shù)Servlet 是在 JSP 之前產(chǎn)生的一種在服務(wù)器端運(yùn)行的 Java 技術(shù),與 JSP 有著密切的關(guān)系。它是一種 Java 編程語(yǔ)言類,用來(lái)擴(kuò)展通過(guò)響應(yīng)請(qǐng)求編程模型服務(wù)應(yīng)用程序的服務(wù)器功能。Servlet 技術(shù)是 Java 動(dòng)態(tài) Web 技術(shù)的基礎(chǔ),將 Java 程序編譯成字節(jié)碼,然后在 Web 容器中運(yùn)行。由于 Java 是跨具有可移植性。的語(yǔ)言,能夠支持“一次編寫,到處運(yùn)行”,因此基于 Java 技術(shù)的 Servlet 也本章目標(biāo):了解 Servlet 的基礎(chǔ)知識(shí)和編寫 Servlet 的 API熟練掌握 Servlet 的編寫過(guò)程熟練掌握 Servlet

2、在實(shí)際開(kāi)發(fā)中的作用熟練掌握 MVC 框架及實(shí)際應(yīng)用6.1Servlet 基礎(chǔ)在講解 Servlet 編程之前,先對(duì) Servlet 的基礎(chǔ)進(jìn)行講解。在本節(jié)中將來(lái)了解一下 Servlet 的作用和技術(shù)特點(diǎn),Servlet 和 JSP 之間的區(qū)別和聯(lián)系,以及 Servlet 的生命周期等問(wèn)題,這些都是學(xué)習(xí) Servlet 編程的必要條件。6.1.1Servlet 技術(shù)功能Servlet 技術(shù)的主要功能是可以交互式地瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài) Web 內(nèi)容。執(zhí)行過(guò)程:首先客戶端發(fā)送請(qǐng)求到服務(wù)器端,服務(wù)器端將收到的請(qǐng)求到 Servlet 程序。在 Servlet程序執(zhí)行定義的操作后,將生成的響應(yīng)內(nèi)容返回

3、給服務(wù)器端,從而服務(wù)器端將響應(yīng)內(nèi)容返回給客戶端。Servlet 技術(shù)更具體的功能是可以處理 HTTP 請(qǐng)求,負(fù)責(zé)傳遞 HTTP 響應(yīng)到客戶端;處理HTML 中表單產(chǎn)生的數(shù)據(jù),包括 get 和t 數(shù)據(jù);并發(fā)處理多個(gè)請(qǐng)求(在聊天室等需要同步請(qǐng)求的開(kāi)發(fā)中經(jīng)常使用到)。此外 Servlet 還可以將請(qǐng)求轉(zhuǎn)發(fā)給其他的服務(wù)器和 Servlet,從而可以在鏡像內(nèi)容相同的幾個(gè)服務(wù)器之間平衡負(fù)載。隨著網(wǎng)絡(luò)業(yè)務(wù)的增大,該技術(shù)越來(lái)越受到人們的重視。在 Servlet 的開(kāi)發(fā)中,開(kāi)發(fā)可以定義彼此之間共同工作的激活,每個(gè)是一個(gè)Servlet,而且者能夠在這些 Servlet 之間傳送數(shù)據(jù)。6.1.2Servlet 技術(shù)

4、特點(diǎn)在目前實(shí)際應(yīng)用中有很多在服務(wù)器端的 CGI 開(kāi)發(fā)語(yǔ)言和類似于 CGI 的開(kāi)發(fā)語(yǔ)言,Servlet和這些語(yǔ)言相比有很多突出的優(yōu)點(diǎn),這也是 Servlet 能夠廣泛應(yīng)用的原因。Servlet 不但可以直接和 Web 服務(wù)器交互,還可以和數(shù)據(jù)庫(kù)、文件等資源進(jìn)行交互,從而更好地完成任務(wù),返回給客戶端響應(yīng)內(nèi)容。Servlet 的執(zhí)行效率非常高,因?yàn)樵诿看握?qǐng)求時(shí),并不會(huì)為每一個(gè)請(qǐng)求重新啟動(dòng) Servlet。這在傳統(tǒng)的 CGI 語(yǔ)言中是很難實(shí)現(xiàn)的。Servlet API 的規(guī)范非常完善,從而使得 Servlet 可以在主流服務(wù)器中直接或者通過(guò)必要的插件進(jìn)行運(yùn)行。6.1.3Servlet 與 JSP 的區(qū)

5、別Servlet 是一種運(yùn)行在服務(wù)器端的Java 程序,是在 JSP 之前就已經(jīng)具有的。而 JSP 是在Servlet的基礎(chǔ)上由 Sun 公司推出的應(yīng)用于 Web 開(kāi)發(fā)的技術(shù)。雖然 Servlet 和 JSP 存在很多聯(lián)系,但是它們之間也有很大區(qū)別。Servlet 和 JSP 的編程方式不同。Servlet 嚴(yán)格遵循 Java 語(yǔ)言的編程標(biāo)準(zhǔn),而 JSP 則是遵循腳本語(yǔ)言的編程標(biāo)準(zhǔn)。讀過(guò) Servlet 程序的讀者會(huì)發(fā)現(xiàn),Servlet 程序要比 JSP 程序難理解。JSP 是為了簡(jiǎn)化 Servlet 編程而開(kāi)發(fā)的技術(shù),從而 JSP 在程序的編寫方面比 Servlet 容易。由于 JSP 是在

6、 Servlet 的基礎(chǔ)上開(kāi)發(fā)出來(lái)的,所以運(yùn)行 JSP 時(shí),并不需要編譯,而是由容器自動(dòng)將 JSP 翻譯為 Servlet 進(jìn)行編譯。而 Servlet 在運(yùn)行之前必須進(jìn)行編譯。由于 Java 的技術(shù)特點(diǎn),在第一次運(yùn)行時(shí),JSP 的運(yùn)行速度要比 Servlet 慢。這是因?yàn)?JSP 第一次運(yùn)行時(shí)需要編譯成 Servlet。如果 JSP 沒(méi)有發(fā)生變化,在以后的運(yùn)行中速度是一樣的。因?yàn)槎际侵苯舆\(yùn)行,不再需要編譯。6.1.4Servlet 的生命周期Servlet 的生命周期簡(jiǎn)單的可分為 Servlet 的初始化、Servlet 的執(zhí)行和 Servlet 的結(jié)束。在 Servlet 中使用 init

7、()方法來(lái)初始化 Servlet。Init()方法有兩種類型,一種是不帶任何參數(shù);另一種是帶有 ServeltConfig 參數(shù),使用該方法通常用于打開(kāi)共享資源。需要注意的是,init()方法在生命周期中只能被調(diào)用一次。初始化 Servlet 后,根據(jù)請(qǐng)求就可以執(zhí)行 Servlet,此時(shí)調(diào)用 Servlet 的 service()方法。Service()方法又拆分為多個(gè)方法來(lái)完成特定操作。Service()方法通常具有兩個(gè)參數(shù),ServletRequest 和ServletResponse。前者表示客戶端請(qǐng)求的信息,后者表示服務(wù)器端響應(yīng)的信息。170最后就是對(duì) Servlet 的銷毀,該步是通

8、過(guò) destroy()方法來(lái)完成的。和初始化一樣,destroy()方法在生命周期中也只能被調(diào)用一次。該方法主要完成關(guān)閉共享資源和清除資源等操作。6.2Servlet 編程常用接口和類由于 Servlet 是由開(kāi)發(fā)接口或類。本節(jié)將來(lái)學(xué)編寫的 Java 類,所以在 Servlet 的編寫中必然要用到已經(jīng)定義的Servlet 開(kāi)發(fā)中經(jīng)常要用到的一些接口和類,這里只給出其中一部分,在以后的學(xué)習(xí)中如果出現(xiàn)新的接口或類會(huì)單獨(dú)進(jìn)行講解。6.2.1Servlet 接口Servlet 接口是所有 Servlet 必須直接或者間接實(shí)現(xiàn)的接口。在 Servlet 接口中定義了 Servlet周期中的所有方法,如表

9、 6-1 所示。表 6-1 Servlet 接口方法6.2.2HttpServlet 類HttpServlet 類是針對(duì)使用 HTTP 中 Web 服務(wù)器的 Servlet 類。應(yīng)用程序特定的 Servlet 類擴(kuò)展了 HttpServlet 類,用來(lái)處理 HTTP 請(qǐng)求和生成 HTTP 響應(yīng)。應(yīng)用程序特定類需要覆蓋掉一個(gè)或者幾個(gè) HttpServlet 方法。HttpServlet 類的子類可以實(shí)現(xiàn)表 6-2 方法中的任意一個(gè)。表 6-2 HttpServlet 類方法在這些方法中,doGet()和 dot()方法是最常用的。在自己編寫的 Servlet 類中也通常只覆171方法作用void

10、 doGet (HttpServletRequest request, HttpServlet Response response) throws Servlet Exception ,IOException該方法用于支持 HTTP Get 請(qǐng)求。輸入?yún)?shù)、HTTP 報(bào)頭和輸入流可分別從 request 對(duì)象、response 頭標(biāo)和 response 對(duì)象的輸出流中獲得void do t (HttpServletRequest request, HttpServlet Response response) throws Servlet Exception ,IOException該方法用于支

11、持 HTTPt 請(qǐng)求。輸入?yún)?shù)、HTTP 報(bào)頭和輸入流可分別從 request 對(duì)象、response 頭標(biāo)和 response 對(duì)象的輸出流中獲得void doPut (HttpServletRequest request, HttpServlet Response response) throws Servlet Exception ,IOException該方法用于支持 HTTP Put 請(qǐng)求。請(qǐng)求的 URI被載入的文件位置void dete (HttpServletRequest request, HttpServlet Response response) throws Servle

12、t Exception ,IOException該方法用于支持 HTTP Delete 請(qǐng)求。請(qǐng)求的 URI資源被刪除方法作用void init(ServletConfit config)throws ServletException在 Servlet 被載入后和提供服務(wù)前由 Servlet 引擎進(jìn)行調(diào)用一次,初始化 Servlet。該方法可能拋出 UnavailableException 異常,拋出后 Servlet 將退出服務(wù)ServletConfig getServletConfig()獲取 Servlet 配置的相關(guān)信息void serviervletRequest request,S

13、ervletResponse response) throws ServletException,IOExceptionServletRequest 表示客戶端請(qǐng)求的信息,ServletResponse 表示服務(wù)器端響應(yīng)的信息。該方法是 Servlet 的執(zhí)行方法String getServletInfo()獲取 Servlet 信息void destory()銷毀 Servlet 信息蓋這兩個(gè)方法。6.2.3HttpServletRequest 接口HttpServletRequest 接口擴(kuò)展于 ServletRequest 接口。在 JSP 中學(xué)習(xí)的 request 內(nèi)置對(duì)象就是 Htt

14、pServletRequest 的實(shí)例,所以該接口也就有 request 內(nèi)置對(duì)象的所有方法,例如獲取頭部信息的方法。HttpServletRequest 接口中最常用的方法是獲得請(qǐng)求中的參數(shù),即客戶端表單中的數(shù)據(jù)。使用最多的就是 getParameter()方法,面學(xué)習(xí) request 內(nèi)置對(duì)象時(shí),就經(jīng)常使用該方法獲取用戶在表單中輸入的信息。此外還有一個(gè) getParameterValues()方法,使用該方法可以獲取一個(gè)所得值組成的數(shù)組,這面的學(xué)習(xí)中已使用過(guò)。HttpServletRequest 接口還可以獲取由客戶端傳送的方法、客戶端正在使用的通信協(xié)議、產(chǎn)生請(qǐng)求并且接收請(qǐng)求的服務(wù)器端主機(jī)

15、名以及 IP 地址等信息,獲取這些信息在 HttpServletRequest接口中都各自對(duì)應(yīng)的方法??梢詤⒄?request 內(nèi)置對(duì)象的方法來(lái)學(xué)習(xí)這些方法。6.2.4HttpServletResponse 接口JSP 中的 response 內(nèi)置對(duì)象是一個(gè) HttpServletResponse 接口實(shí)例。HttpServletResponse 接口代表的是從服務(wù)器端發(fā)出的響應(yīng)。該接口的方法和 response 內(nèi)置對(duì)象的方法一樣,都能夠使用add()方法來(lái)操作對(duì)象,使用 sendRedirect()方法進(jìn)行頁(yè)面跳轉(zhuǎn)的操作。可以參照response 內(nèi)置對(duì)象的方法來(lái)學(xué)習(xí)這些方法。6.3Ser

16、vlet 開(kāi)發(fā)面的學(xué)習(xí)中已經(jīng)對(duì) Servlet 的基礎(chǔ)知識(shí)進(jìn)行了介紹,從這節(jié)開(kāi)始就來(lái)學(xué)習(xí) Servlet 編程。Servlet 的編寫比 JSP 的編寫要難一些,因?yàn)?Servlet 是純 Java 程序。但是有了前面學(xué)習(xí) JSP 的基礎(chǔ),再學(xué)習(xí) Servlet 是很容易的,在后面的學(xué)習(xí)中會(huì)經(jīng)??吹胶芏嗯c JSP 相似的地方。6.3.1Servlet 的創(chuàng)建自己編寫的 Servlet 要繼承 HttpServlet 類,通常使用其中的 do看一個(gè)簡(jiǎn)單的 Servlet 的程序。t()和 doGet()方法。先來(lái)172package ms; import java.io.*;import jav

17、ax.servlet.*; import javax.servlet.http.*;public class myOrvlet extends HttpServletpublic void dot(HttpServletRequest request,HttpServletResponse response)throws IOException在本程序中,首先要使用 import 導(dǎo)入相關(guān)包,其中 HttpServlet 類、HttpServletRequest 接口和 HttpServletResponse 接口都在 javax.servlet.http.*包中。在該 Servlet 中實(shí)現(xiàn)

18、的業(yè)務(wù)功能很容易,即向客戶端發(fā)送一個(gè) HTML 頁(yè)面的信息。編寫完 Servlet 程序后,首先要進(jìn)行編譯,產(chǎn)生.class 文件。然后將.class 文件放置在WEB-INFclasses 目錄中,通常情況下是將 Servlet 程序放在該目錄下,在編譯后自動(dòng)生成一個(gè)包,在其中放置.class 文件。這時(shí)還是不可以運(yùn)行,還需要對(duì) Servlet 進(jìn)行配置。6.3.2Servlet 的配置對(duì) Servlet 編寫和編譯后,要想啟動(dòng) Servlet 服務(wù),需要在 web.xml 文件中對(duì)該 Servlet 進(jìn)行配置。在 web.xml 文件中可以配置該 Servlet 的名字、類、初始化參數(shù)、啟

19、動(dòng)裝入的優(yōu)先級(jí)、運(yùn)行的安全設(shè)置以及 Servlet URL。其中 Servlet 的名字、類和 Servlet URL是必須給出的,在 6.3.1 節(jié)中開(kāi)發(fā)的 Servlet 程序也需要配置這三項(xiàng)才可以運(yùn)行。對(duì) Servlet 進(jìn)行配置需要在web.xml 文件中加入下面的程序。其中標(biāo)記表示 Servlet 的名稱,該名稱是由開(kāi)發(fā)者命名的,這里沒(méi)有要求,只是需要同一個(gè) Servlet 的名稱要相同。標(biāo)記表示該 Servlet 名稱所對(duì)應(yīng)的 Servlet程序,該 Servlet 程序指的是編譯后的.class 程序,其中的 ms 是在 Servlet 程序中創(chuàng)建的包。標(biāo)記表示 Servlet

20、的 URL地址。,即在客戶端對(duì)該程序進(jìn)行時(shí),輸入的 URL配置完成后,就可以運(yùn)行 6.3.1 節(jié)中編寫的 Servlet,運(yùn)行結(jié)果如圖 6-1 所示。在運(yùn)行該 Servlet 時(shí),輸入的 URL 為創(chuàng)建的項(xiàng)目目錄,即 Servlet 保存在6WEB-INFclasses 目錄下。myO,其中“6”表示rvlet 是在配置文件173myOrvletms.myOrvletmyOrvlet/myOrvletPrWriter out=response.getWriter();out.prln(o World);out.prln(oWorld);public void doGet(HttpServlet

21、Request request,HttpServletResponse response) throws IOExceptiondot(request,response);標(biāo)記中填寫的內(nèi)容,通過(guò)它可以找到并運(yùn)行指定的Servlet。6.3.3Servlet 中的中文解決在 6.3.1 節(jié)中編寫的第一個(gè) Servlet,沒(méi)有使用中文,如果在Servlet 中直接使用中文是會(huì)出現(xiàn)亂碼的。例如將第一個(gè)程序做如下修改:Servlet圖 6-1運(yùn)行 Servlet對(duì)該程序使用和6.3.2 節(jié)中的程序相同的配置,運(yùn)行該Servlet,運(yùn)行結(jié)果如圖 6-2 所示。從運(yùn)行結(jié)果中可以看出,在程序中要顯示的中文在

22、頁(yè)面中變?yōu)閱?wèn)號(hào)。這主要是由編碼方法的不同造成的,在瀏覽器中默認(rèn)使用的是 UTF-8 編碼方式來(lái)發(fā)送請(qǐng)求,而使用中文的編碼方式是gb2312。所以如果讓中文的顯示正常,就需要對(duì) Servlet 中的請(qǐng)求和響應(yīng)進(jìn)行編碼。下面是對(duì)上面程序進(jìn)行改進(jìn)后的程序。圖 6-2中文發(fā)生亂碼174package ms; import java.io.*;import javax.servlet.*; import javax.servlet.http.*;public class myOrvlet extends HttpServletpublic void dot(HttpServletRequest requ

23、est,HttpServletResponse response) throws IOExceptionpackage ms; import java.io.*;import javax.servlet.*; import javax.servlet.http.*;public class myOrvlet extends HttpServletpublic void dot(HttpServletRequest request,HttpServletResponse response) throws IOExceptionPrWriter out=response.getWriter();o

24、ut.pr ln(Servlet 中的中文解決 ); out.prln(Servlet 中的中文解決 );public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOExceptiondot(request,response);再次使用相同的配置運(yùn)行該 Servlet,運(yùn)行結(jié)果如圖 6-3所示。從運(yùn)行結(jié)果中可以看出,中文不能正常顯示已經(jīng)得到解決。在對(duì) Servlet 程序進(jìn)行重新編譯后,要想再次運(yùn)行該程序,需要重新啟動(dòng) Tomcat 服務(wù)器,才能正常運(yùn)行。圖 6-3使用 gb2312 編

25、碼的程序6.4Servlet 的典型應(yīng)用在實(shí)際開(kāi)發(fā)中,Servlet 的使用是非常普遍的。在本節(jié)中就來(lái)學(xué)些比較經(jīng)典的應(yīng)用Servlet的小模塊程序。熟練開(kāi)發(fā)這些小模塊程序?yàn)橐院箝_(kāi)發(fā)大型項(xiàng)目打下基礎(chǔ)。6.4.1獲取 Servlet 的初始化參數(shù)信息在 6.3 節(jié)中學(xué)習(xí) Servlet 的配置時(shí)已經(jīng)知道可以為 Servlet 配置初始化參數(shù),在本小節(jié)中就來(lái)學(xué)習(xí)如何獲取 Servlet 的初始化參數(shù)。首先配置初始化參數(shù)時(shí)在 web.xml 文件中加入如下程序:175CSServletms.CSServletuserpyqpassword1234/將客戶端請(qǐng)求的編碼方式設(shè)置為 gb2312 reque

26、st.setCharacterEncoding(gb2312);/將服務(wù)器端響應(yīng)的編碼方式設(shè)置為 gb2312response.setContentType(text/html;charset=gb2312); PrWriter out=response.getWriter();out.prln(Servlet 中的中文解決 );out.prln(Servlet 中的中文解決 );public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOExceptiondot(request,res

27、ponse);在配置初始化參數(shù)的同時(shí)也配置了 Servlet 的基本環(huán)境。其中每一對(duì)標(biāo)記就定義一個(gè)初始參數(shù),在其中標(biāo)記定義的是參數(shù)名稱,標(biāo)記定義的是參數(shù)值。下面是獲取配置的初始化參數(shù)的程序。import javax.servlet.*;Enumeratione;/根據(jù)初始化參數(shù)的名稱獲取參數(shù)值/將初始化參數(shù)值顯示176pw.prln(初始化參數(shù)的值為:+value);String value=config.getInitParametaram);ServletConfig config;public void dot(HttpServletRequest request,HttpServlet

28、Response response) throws IOException/將客戶端請(qǐng)求的編碼方式設(shè)置為gb2312 request.setCharacterEncoding(gb2312);/將服務(wù)器端響應(yīng)的編碼方式設(shè)置為gb2312response.setContentType(text/html;charset=gb2312); pw=response.getWriter();/獲取Servlet 配置的相關(guān)信息config=this.getServletConfig();/獲取所有初始化參數(shù)的名稱 e=config.getInitParameterNames();/將所有初始化參數(shù)循環(huán)

29、顯示while(e.hasMoreElements()/獲取初始化參數(shù)名稱String param=(String)e.nexement();/將初始化參數(shù)的名稱顯示pw.prln(初始化參數(shù)名稱為:+param); pw.prln();import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.http.*;import java.util.Enumeration;public class CSServlet extends HttpServletPrWritw;p

30、ackage ms;import java.io.IOException; import java.io.PrWriter;CSServlet/CSServlet運(yùn)行該 Servlet,運(yùn)行結(jié)果如圖 6-4 所示。在本程序中,首先使用 Servlet 的 getServletConfig()方法獲取 Servlet 配置的所有相關(guān)信息,然后使用 ServletConfig接口實(shí)例調(diào)用 getInitParameterNames()方法獲取配置中的所有參數(shù)名稱。接下來(lái)對(duì)所有參數(shù)名稱進(jìn)行循環(huán)操作,顯示出所有參數(shù)名稱。最后就是通過(guò)參數(shù)名稱使用 getInitParameter()方法來(lái)獲取初始化參數(shù)

31、的值。 在本程序中多次使用到 ServletConfig 接口,該接口的相關(guān)知識(shí)可以通過(guò)學(xué)習(xí) API 來(lái)了解。圖 6-4獲取初始化參數(shù)6.4.2通過(guò) Servlet 獲取表單提交數(shù)據(jù)使用 Servlet 不但可以獲取初始化參數(shù)信息,還可以獲取用戶在表單中輸入的信息。這和使用 JSP 獲取表單中輸入信息的方式是類似的。首先都需要定義一個(gè)提交表單程序,這里定義一個(gè)最常見(jiàn)的用戶輸入用戶名和的頁(yè)面程序 6-1.jsp 代碼如下:177用戶名pw.prln();public void doGet(HttpServletRequest request,HttpServletResponse respons

32、e) throws IOExceptiondot(request,response);運(yùn)行 Tomcat,輸入該程序所在的路徑,運(yùn)行結(jié)果如圖 6-5 所示。在本程序的運(yùn)行結(jié)果中輸入用戶名為“pyq”,BDServlet 程序。BDServlet 程序的內(nèi)容如下:為“1234”,進(jìn)行提交,就會(huì)提交到Servlet 程序編寫和編譯完成后,對(duì)該程序進(jìn)行如下配置:178BDServletms.BDServletBDServlet/BDServletpackage ms;import java.io.IOException; import java.io.PrWriter; import javax.s

33、ervlet.http.*;public class BDServlet extends HttpServletPrWritw;public void dot (HttpServletRequest request,HttpServletResponse response) throws IOException/將客戶端請(qǐng)求的編碼方式設(shè)置為gb2312 request.setCharacterEncoding(gb2312);/將服務(wù)器端響應(yīng)的編碼方式設(shè)置為gb2312response.setContentType(text/html;charset=gb2312); pw=response.

34、getWriter();/使用HttpServletRequest 接口的getParameter()方法獲取用戶名信息String name=request.getParameter(name);/使用HttpServletRequest 接口的getParameter()方法獲取信息String pwd=request.getParameter(pwd); pw.prln(你輸入的用戶名為:+name); pw.prln();pw.prln(你輸入的為:+pwd);public void doGet (HttpServletRequest request,HttpServletRespon

35、se response) throws IOExceptiondot(request,response);在用戶輸入的表單程序中,進(jìn)行提交,就會(huì)提交到該 Servlet 程序,運(yùn)行結(jié)果如圖 6-6 所示。圖 6-5提交表單圖 6-6獲取表單數(shù)據(jù)在該 Servlet 程序中,使用 HttpServletRequest 接口的 getParameter()方法來(lái)獲取表單中的輸入信息。此時(shí)可以發(fā)現(xiàn)這和使用 request 內(nèi)置對(duì)象獲取表單的輸入信息非常類似。在該程序的運(yùn)行結(jié)果中,可以看到獲取的信息顯示在 URL 中。要想使程序具有更高的安全性,只需要將提交表單中的 method 屬性設(shè)置為t 即可,

36、此時(shí)提交后就會(huì)調(diào)用 Servlet 程序中的 dot 方法,從而在 URL 中就不再顯示獲取的信息。6.4.3在 Servlet 中實(shí)現(xiàn)頁(yè)面轉(zhuǎn)發(fā)功能使用 Servlet 程序,還可以實(shí)現(xiàn)頁(yè)面轉(zhuǎn)發(fā)的功能,這和 JSP 中使用 response 內(nèi)置對(duì)象進(jìn)行頁(yè)面轉(zhuǎn)發(fā)很相似。在本節(jié)中就來(lái)定義一個(gè)根據(jù)用戶輸入內(nèi)容的不同,而實(shí)現(xiàn)不同頁(yè)面轉(zhuǎn)發(fā)的程序。這里先定義一個(gè)登錄的提交表單程序 6-2.jsp 代碼如下:179實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能用戶名運(yùn)行 Tomcat,提交該表單程序,運(yùn)行結(jié)果如圖 6-7 所示。 在該登錄頁(yè)面中進(jìn)行提交,就會(huì)提交到 Servlet 程序,先來(lái)看Servlet 程序的內(nèi)容。package

37、 ms;import import import import import publicPrjava.io.IOException;java.io.PrWriter;javax.servlet.http.*; javax.servlet.ServletException; javax.servlet.RequestDispatcher;class ZFServlet extends HttpServlet圖 6-7登錄頁(yè)面Writw;RequestDispatcher rd;public void dot(HttpServletRequest request,HttpServletRespo

38、nse response)throws ServletException,IOException/將客戶端請(qǐng)求的編碼方式設(shè)置為 gb2312 request.setCharacterEncoding(gb2312);/將服務(wù)器端響應(yīng)的編碼方式設(shè)置為 gb2312response.setContentType(text/html;charset=gb2312); pw=response.getWriter();/使用 HttpServletRequest 接口的 getParameter()方法獲取用戶名信息String name=request.getParameter(name);/使用 H

39、ttpServletRequest 接口的 getParameter()方法獲取 String pwd=request.getParameter(pwd);信息/判斷用戶名和是否正確if(name.equals(pyq)&pwd.equals(1234)/定義跳轉(zhuǎn)到的頁(yè)面 rd=request.getRequestDispatcher(6-3.jsp);/使用 RequestDispatcher 接口的 forward()方法實(shí)現(xiàn)跳轉(zhuǎn)rd.forward(request,response);else/定義頁(yè)面跳轉(zhuǎn)到的頁(yè)面 rd=request.getRequestDispatcher(6-4.

40、jsp);/使用 RequestDispatcher 接口的 forward()方法實(shí)現(xiàn)跳轉(zhuǎn)rd.forward(request,response);public void doGet (HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException180在本程序中,首先獲取用戶在表單程序中輸入的信息,這在 6.4.2 節(jié)中已經(jīng)講解過(guò)。然后判斷輸入的信息是否為指定信息,在判斷的結(jié)果中使用 getRequestDispatcher()方法指定要跳轉(zhuǎn)到的頁(yè)面程序的名稱,最后使用

41、 RequestDispatcher 接口的 forward()方法實(shí)現(xiàn)跳轉(zhuǎn)。在該程序中如果輸入的用戶名為“pyq”, 為“1234”,頁(yè)面就會(huì)自動(dòng)跳轉(zhuǎn)到 6-3.jsp 程序。6-3.jsp 程序內(nèi)容如下:跳轉(zhuǎn)到該程序后的運(yùn)行結(jié)果如圖 6-8 所示。如果用戶輸入的不是所規(guī)定的內(nèi)容,則頁(yè)面就會(huì)自動(dòng)跳轉(zhuǎn)到 6-4.jsp 程序。6-4.jsp 程序內(nèi)容如下:跳轉(zhuǎn)到該程序后的運(yùn)行結(jié)果如圖 6-9 所示。是否登錄成功的顯示結(jié)果和程序都是很簡(jiǎn)單的。這里主要學(xué)習(xí)如何使用 Servlet 完成跳轉(zhuǎn)功能。圖 6-8登錄成功圖 6-9登錄失敗181實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能你輸入的用戶名或者錯(cuò)誤實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能歡迎你本

42、dot(request,response);6.4.4使用 Servlet 限制時(shí)間在一些在 4.1 節(jié)學(xué)習(xí)ses中經(jīng)常對(duì)用戶的時(shí)間進(jìn)行限制,如果用戶時(shí)間超時(shí),則將自動(dòng)斷線。內(nèi)置對(duì)象時(shí),學(xué)習(xí)了如何獲取 ses的創(chuàng)建時(shí)間和最后時(shí)間。在 Servlet時(shí)間的程序。程序中同樣能夠通過(guò)這些操作來(lái)完成特定功能??聪旅媸鞘褂?Servlet 限制對(duì)該 Servlet 進(jìn)行配置后,程序運(yùn)行結(jié)果如圖 6-10 所示。在本程序中,通過(guò)對(duì) HttpSes接口的操作,首先設(shè)置一個(gè)用戶的最大時(shí)間。然后通過(guò)該182package ms;import java.io.IOException; import java.io

43、.PrWriter; import javax.servlet.http.*;public class XZServlet extends HttpServletPrWritw;HttpSeshs; time=10;public void dot(HttpServletRequest request,HttpServletResponse response) throws IOException/將客戶端請(qǐng)求的編碼方式設(shè)置為gb2312 request.setCharacterEncoding(gb2312);/將服務(wù)器端響應(yīng)的編碼方式設(shè)置為gb2312response.setContentT

44、ype(text/html;charset=gb2312); pw=response.getWriter();hs=request.getSes();/設(shè)置ses的生命周期為 10 秒hs.setMaxInactiveerval(time);/計(jì)算已經(jīng)時(shí)間time1=()(hs.getLastAcsedTime()-hs.getCreationTime()/1000;/計(jì)算剩余多少時(shí)間斷線 time2=time-time1;pw.prln(你已經(jīng)+time1+秒,過(guò)+time2+秒后自動(dòng)斷線);/如果超出時(shí)間,將自動(dòng)跳轉(zhuǎn) if(time1=time)hs.invalidate();/定義頁(yè)面跳

45、轉(zhuǎn)到的頁(yè)面 response.sendRedirect(6-5.jsp);public void doGet (HttpServletRequest request,HttpServletResponse response) throws IOExceptiondot(request,response);接口 dot 的 getLastAcsedTime()和 goolreationTime()方法計(jì)算用戶的時(shí)間,并且計(jì)算出剩余時(shí)間。當(dāng)超過(guò)規(guī)定的時(shí)間后,就會(huì)自動(dòng)跳轉(zhuǎn)到 6-5.jsp 程序。6-5.jsp 程序的內(nèi)容如下:跳轉(zhuǎn)到該程序后的結(jié)果如圖 6-11 所示。圖 6-10時(shí)間限制內(nèi)圖 6-

46、11超出時(shí)間后6.4.5使用 Servlet 進(jìn)行操作的相關(guān)知識(shí)在第 4 章中已經(jīng)做了詳細(xì)講解,在本節(jié)就來(lái)學(xué)習(xí)如何在 Servlet 中進(jìn)行操作。首先定義一個(gè)表單程序,提交后把其中的內(nèi)容保存在顯示在頁(yè)面中。首先來(lái)看一個(gè)簡(jiǎn)單的提交表單程序 6-6.jsp 代碼如下:中,然后再獲取并183屬性名稱為屬性值為限制時(shí)間你時(shí)間過(guò)長(zhǎng),自動(dòng)斷線運(yùn)行 Tomcat,輸入該程序所在的路徑,運(yùn)行結(jié)果如圖 6-12 所示。在該表單程序中輸入指定的內(nèi)容,例如輸入的屬性名稱為“pyq”,屬性值為“1234”,進(jìn)行提交,就會(huì)提交到 Servlet 程序。該 Servlet 程序的內(nèi)容如下:184package ms;im

47、port java.io.IOException; import java.io.PrWriter; import javax.servlet.http.*; import javax.servlet.*;public class CKServlet extends HttpServletPrWritw;public void dot (HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException/將客戶端請(qǐng)求的編碼方式設(shè)置為gb2312 request.setChara

48、cterEncoding(gb2312);/將服務(wù)器端響應(yīng)的編碼方式設(shè)置為gb2312response.setContentType(text/html;charset=gb2312); pw=response.getWriter();/使用HttpServletRequest 接口的getParameter 方法獲取用戶名信息String name=request.getParameter(name);/使用HttpServletRequest 接口的getParameter 方法獲取信息 String value=request.getParameter(value); if(name!=

49、null)/將獲取的信息保存在中c=new(name,value);/使用HttpServletResponse 接口添加新對(duì)象response.add(c);/使用HttpServletRequest 接口獲取所有的s=request.gets();pw.prln(中的屬性名稱和屬性值的對(duì)應(yīng)關(guān)系如下:); pw.prln();/對(duì)所有進(jìn)行循環(huán)顯示for(i=0;is.length;i+)ck=si;/使用getName()方法獲取屬性名稱對(duì)該 Servlet 程序進(jìn)行配置后,運(yùn)行結(jié)果如圖 6-13 所示。在該 Servlet 程序中,首先獲取用戶在表單程序中輸入的內(nèi)容,然后創(chuàng)建一個(gè)對(duì)象,并使

50、用 HttpServletResponse 接口將輸入的內(nèi)容添加到新創(chuàng)建的對(duì)象及其屬性名稱和對(duì)應(yīng)的屬性值并顯示在頁(yè)面中。對(duì)象。接下來(lái)獲取該圖 6-12表單程序圖 6-13對(duì)操作6.5Servlet 過(guò)濾器使用 Servlet 過(guò)濾器可以直接處理請(qǐng)求和響應(yīng)過(guò)程。Servlet 中實(shí)現(xiàn)過(guò)濾器功能的是 Web 中的一個(gè)小型組件,其來(lái)自客戶端的請(qǐng)求和響應(yīng)信息,從而進(jìn)行查看、提取或者對(duì)客戶端和服務(wù)器端之間交換的數(shù)據(jù)信息進(jìn)行某項(xiàng)特定的操作。過(guò)濾器并不是 Servlet,它并不實(shí)際創(chuàng)建一個(gè)請(qǐng)求,而是請(qǐng)求到達(dá)一個(gè) Servlet 前的預(yù)處理程序,或者響應(yīng)離開(kāi) Servlet 后的處理程序。6.5.1編寫 Se

51、rvlet 過(guò)濾器程序Servlet 過(guò)濾器也是一個(gè) Java 程序,在定義該 Java 程序時(shí)必須要使用 javax.servlet.Filter 接口及其三個(gè)方法,即 init()方法、doFilter()方法和 destroy()方法。init()方法是在 Servlet 容器實(shí)例化過(guò)濾器時(shí)被調(diào)用。該方法在 doFilter()方法之前被調(diào)用,負(fù)責(zé)設(shè)置 FilterConfig 對(duì)象。該對(duì)象為過(guò)濾器提供初始化參數(shù),并允許與之相關(guān)的185String myName=ck.getName();/使用 getValue()方法獲取屬性值 String myValue=ck.getValue()

52、; if(myName.equals(pyq)pw.prln(myName+#+myValue);public void doGet (HttpServletRequest request,HttpServletResponse response) throws ServletException,IOExceptiondot(request,response);ServletContext。doFilter()方法是過(guò)濾器的業(yè)務(wù)方法,在該方法中完成過(guò)濾器需要完成的工作。每當(dāng)應(yīng)用程序接收請(qǐng)求處理時(shí),都會(huì)自動(dòng)調(diào)用該方法。doFilter 方法接收三個(gè)輸入?yún)?shù),即 ServletRequest、 S

53、ervletResponse 和 FilterChain 對(duì)象。destroy()方法和 Servlet 中的 destroy()方法一樣,用于銷毀。不過(guò)過(guò)濾器中的 destroy()方法只是用來(lái)銷毀過(guò)濾器??聪旅孀远x的過(guò)濾器程序。186package ms;import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain;import javax.servlet.FilterConfig; import javax.servlet.ServletException;import

54、 javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletResponse; public class GuoLv implements Filterprivate FilterConfig filterConfig=null;/初始化過(guò)濾器public void init(FilterConfig filterConfig)this.filterConfig=

55、filterConfig;/過(guò)濾器實(shí)際操作public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException/獲得輸出流ServletOutputStream out=(HttpServletResponse) response).getOutputStream();/輸出內(nèi)容 response.setCharacterEncoding(GB2312); out.pr(); out.pr(# );out.pr(

56、); olose();/下一個(gè)Filterchain.doFilter(request,response);/銷毀過(guò)濾器public void destroy()在該Servlet 過(guò)濾器程序中采用了javax.servlet.Filter 接口和javax.servlet.Filter 接口中的init()方法、doFilter()方法和 destroy()方法,這樣就定義了一個(gè) Servlet 過(guò)濾器程序。該程序不能直接運(yùn)行,還需要進(jìn)行配置。6.5.2配置和運(yùn)行 Servlet 過(guò)濾器在配置過(guò)濾器之前要先定義一個(gè) Servlet 程序,讓 Servlet 過(guò)濾器對(duì)該 Servlet 程序進(jìn)

57、行過(guò)濾。Servlet 程序代碼如下:將該 Servlet 程序和 Servlet 過(guò)濾器程序一起在 Web 程序中進(jìn)行配置。在其中需要加入如下程序:187GuoLvms.GuoLvGuoLvGLServletGLServletms.GLServletpackage ms; import java.io.*;import javax.servlet.*; import javax.servlet.http.*;public class GLServlet extends HttpServletpublic void dot (HttpServletRequest request,HttpSer

58、vletResponse response) throws IOException/將客戶端請(qǐng)求的編碼方式設(shè)置為gb2312 request.setCharacterEncoding(gb2312);/將服務(wù)器端響應(yīng)的編碼方式設(shè)置為gb2312response.setContentType(text/html;charset=gb2312); PrWriter out=response.getWriter();out.prln();out.prln(&);public void doGet (HttpServletRequest request,HttpServletResponse resp

59、onse) throws IOExceptiondot(request,response);其中標(biāo)記定義的是 Servlet 過(guò)濾器的名稱。標(biāo)記定義了 Servlet 過(guò)濾器的.class 文件。標(biāo)記對(duì)中的標(biāo)記定義的是該 Servlet 過(guò)濾器為哪一個(gè) Servlet 進(jìn)行過(guò)濾。進(jìn)行配置后,就可以運(yùn)行本節(jié)中定義的 Servlet 程序,運(yùn)行結(jié)果如圖 6-14 所示。從運(yùn)行結(jié)果中可以看出,頁(yè)面中顯示“#”號(hào),而在 Servlet程序中是沒(méi)有顯示該內(nèi)容的功能。這是因?yàn)樵擄@示是來(lái)自 Servlet過(guò)濾器。由此可以看出,當(dāng)運(yùn)行 Servlet 程序時(shí),將自動(dòng)調(diào)用對(duì)該Servlet 進(jìn)行過(guò)濾的 Serv

60、let 過(guò)濾器。圖 6-14Servlet 過(guò)濾器6.6Servlet器在對(duì) Servlet 的操作中,還可以編寫 Servlet下文事件、會(huì)話事件和請(qǐng)求事件。通常編寫 Servlet器。Servlet 事件主要分為三種:Servlet 上器程序?qū)@三種事件進(jìn)行。6.6.1編寫 Servlet器程序由于 Servlet 事件分為三種,所以在編寫 Servlet器時(shí)要根據(jù)不同的事件來(lái)編寫器程序。整個(gè)編寫過(guò)程都是相似的,需要首先實(shí)現(xiàn)相應(yīng)的接口,接下來(lái)將按事件的不同,分別進(jìn)行講解。(1)對(duì) Servlet 上下文進(jìn)行使用 Servlet器可以ServletContext 對(duì)象的創(chuàng)建和刪除以及屬性的添

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論