版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 第十一講 Java Servlet教學(xué)目的1 Servlet工作原理2 編譯和安裝servlet3 通過JSP頁面調(diào)用servlet4 servlet的共享變量 5 HttpServlet 類我們已經(jīng)知道,SUN公司以Java Servlet為基礎(chǔ),推出了Java Server Page。JSP提供了Java Servlet的幾乎所有好處,當(dāng)一個客戶請求一個JSP頁面時,JSP引擎根據(jù)JSP頁面生成一個Java文件,即一個servlet。這一章,將對servlet做一個較詳細(xì)的介紹,這不僅對于深刻理解JSP有一定的幫助,而且通過學(xué)習(xí)servlet,還能使我們選擇使用JSP+javabeans
2、+servlet的模式來開發(fā)我們的Web應(yīng)用程序。我們已經(jīng)知道,用JSP支持JavaBeans這一特點,可以有效的管理頁面的靜態(tài)部分和頁面的動態(tài)部分。另外,我們也可以在一個JSP頁面中調(diào)用一個servlet完成動態(tài)數(shù)據(jù)的處理,而讓JSP頁面本身處理靜態(tài)的信息。因此,開發(fā)一個Web應(yīng)用有兩種模式可以選擇:(1) JSP+javabeans(2) JSP+javabeans+servlet第十一講 Java Servlet11.1 Servlet工作原理servlet由支持servlet的服務(wù)器:servlet引擎,負(fù)責(zé)管理運行。當(dāng)多個客戶請求一個servlet時,引擎為每個客戶啟動一個線程而不是
3、啟動一個進(jìn)程,這些線程由servlet引擎服務(wù)器來管理,與傳統(tǒng)的CGI為每個客戶啟動一個進(jìn)程相比較,效率要高的多。11.1.1 Servlet 的生命周期學(xué)習(xí)過Java 語言的人對Java Applet(Java小應(yīng)用程序)都很熟悉,一個Java Applet是java.applet.Applet類的子類,該子類的對象由客戶端的瀏覽器負(fù)責(zé)初始化和運行。servlet的運行機(jī)制和Applet類似,只不過它運行在服務(wù)器端。一個servlet是javax.servlet包中HttpServlet類的子類,由支持servlet的服務(wù)器完成該子類的對象,即servlet的初始化。Servlet的生命周期
4、主要有下列三個過程組成:(1)初始化servlet。servlet第一次被請求加載時,服務(wù)器初始化這個servlet,即創(chuàng)建一個servlet對象,這對象調(diào)用init方法完成必要的初始化工作。(2)誕生的servlet對象再調(diào)用service方法響應(yīng)客戶的請求。(3)當(dāng)服務(wù)器關(guān)閉時,調(diào)用destroy方法,消滅servlet對象。init方法只被調(diào)用一次,即在servlet第一次被請求加載時調(diào)用該方法。當(dāng)后續(xù)的客戶請求servlet服務(wù)時,Web服務(wù)將啟動一個新的線程,在該線程中,servlet調(diào)用service方法響應(yīng)客戶的請求,也就是說,每個客戶的每次請求都導(dǎo)致service方法被調(diào)用執(zhí)行
5、。11.1.3 service方法: 該方法是HttpServlet類中的方法,我們可以在servlet中直接繼承該方法或重寫這個方法。方法描述: public void service(HttpServletRequest request HttpServletResponse response) throw ServletException,IOException 當(dāng)servlet成功創(chuàng)建和初始化之后,servlet就調(diào)用service方法來處理用戶的請求并返回響應(yīng)。Servlet引擎將兩個參數(shù)傳遞給該方法,一個HttpServletRequest類型的對象,該對象封裝了用戶的請求信息,此
6、對象調(diào)用相應(yīng)的方法可以獲取封裝的信息,即使用這個對象可以獲取用戶提交的信息。另外一個參數(shù)對象是HttpServletResponse類型的對象,該對象用來響應(yīng)用戶的請求。和init方法不同的是,init方法只被調(diào)用一次,而service方法可能被多次的調(diào)用,我們已經(jīng)知道,當(dāng)后續(xù)的客戶請求servlet服務(wù)時,Servlet引擎將啟動一個新的線程,在該線程中,servlet調(diào)用service方法響應(yīng)客戶的請求,也就是說,每個客戶的每次請求都導(dǎo)致service方法被調(diào)用執(zhí)行,調(diào)用過程運行在不同的線程中,互不干擾。11.1.4 destroy方法: 該方法是HttpServlet類中的方法。serv
7、let可直接繼承這個方法,一般不需要重寫。方法描述: public destroy() 當(dāng)Servlet引擎終止服務(wù)時,比如關(guān)閉服務(wù)器等,destroy()方法會被執(zhí)行,消滅servlet對象。11.2.2 編譯servlet 為了編譯servlet源文件,需要HttpServlet、HttpServletRequest等類,JDK內(nèi)置包中并不包含這些類文件。為了能編譯servlet源文件得到創(chuàng)建servlet用的字節(jié)碼文件,需要在環(huán)境變量中包含servlet.jar,這個jar文件在TOMCAT安裝目錄的commonlib文件下,如圖11.1所示(也可以到sun公司網(wǎng)站下載編譯servlet
8、所需要的類)。圖11.1 編譯servlet 所需要的jar文件 對于window2000,用鼠標(biāo)右鍵點擊“我的電腦”,彈出菜單,然后選擇屬性,彈出“系統(tǒng)特性”對話筐,再單擊該對話框中的高級選項,然后點擊按鈕“環(huán)境變量”,編輯classpath,添加新的環(huán)境變量的值: D:Tomcatjakarta-tomcat-4.0commonlibservlet.jar; 對于Win9x,用記事本編輯Autoexec.bat文件,將新的值: D:Tomcatjakarta-tomcat-4.0commonlibservlet.jar;加入即可(或?qū)ervlet.jar文件拷貝到j(luò)dk安裝目錄的jrel
9、ibext中)。 該環(huán)境變量值也可以即設(shè)即用,在DOS命令行鍵入: set classpath=D:Tomcatjakarta-tomcat-4.0commonlibservlet.jar回車確認(rèn)即可。 我們將上述servlet的源文件Hello.java保存到F:2000,然后編譯生成字節(jié)碼文件Hello.class11.2.3 存放servlet的目錄(1)所有web服務(wù)目錄可使用的servlet的存放位置如果讓所有web服務(wù)目錄都可以使用該servlet,那么創(chuàng)建這個servlet的字節(jié)碼文件需存放在Tomcat安裝目錄的classes目錄中,例如,本書所用機(jī)器的目錄就是:D:tomca
10、tJakarta-tomcat-4.0classes,如圖11.1所示。我們已經(jīng)知道,servlet第一次被請求加載時,服務(wù)器初始化一個servlet,即創(chuàng)建一個servlet對象,這對象調(diào)用init方法完成必要的初始化工作。如果你對servlet的源文件進(jìn)行了修改,并將新的字節(jié)碼文件存放到classes中,如果服務(wù)器沒有關(guān)閉的話,新的servlet不會被創(chuàng)建,因為,當(dāng)后續(xù)客戶請求servlet服務(wù)時,已初始化的servlet將調(diào)用service方法響應(yīng)客戶。(2)只對examples服務(wù)目錄可用的seclet的存放目錄examples是TOMCAT引擎的默認(rèn)web服務(wù)目錄之一。如果想讓某個s
11、ervlet只對examples目錄可用,那么創(chuàng)建該servlet的字節(jié)碼文件只需存放在webapps/example/Web-inf/classes目錄中。存放在該目錄中的servlet和存放在上面(1)中所述目錄中的servlet有所不同,服務(wù)器引擎首先檢查webapps/example/Web-inf/classes目錄中的創(chuàng)建該servlet的字節(jié)碼文件是否被修改過,如果重新修改過,就會用消滅servlet,用新的字節(jié)碼重新初始化servlet。如果經(jīng)常調(diào)試servlet,可以把servlet放在webapps/example/Web-inf/classes。需要注意的是,當(dāng)用戶請求s
12、ervlet服務(wù)時,由于服務(wù)器引擎每次都要檢查字節(jié)碼文件是否被修改過,導(dǎo)致服務(wù)器的運行效率降低。11.2.4 運行servlet如果一個servlet對所有的web服務(wù)目錄可用,那么只要在服務(wù)器引擎啟動后,在瀏覽器地址欄鍵入:http:/localhost:8080/web服務(wù)目錄/servlet/創(chuàng)建servlet類的名字即可,例如,對于用上述Hello創(chuàng)建的servlet,(1) Root 服務(wù)目錄http:/localhost:8080/servlet/Hello(2) friend目錄(我們自定義的一個web服務(wù)目錄)http:/localhost:8080/friend/servle
13、t/Hello如果是只對examples服務(wù)目錄可用的servelt,那么只要在服務(wù)器引擎啟動后,在瀏覽器地址欄鍵入:http:/localhost:8080/examples/servlet/創(chuàng)建servlet類的名字我們將Hello.class文件保存到Tomcat引擎的classes文件夾中。圖11.2和11.3是在不同的web目錄下運行servlet的效果。圖11.2 用Web根目錄訪問servlet圖11.3 用friend目錄訪問servlet圖11.4 存放帶包名的servlet如果servlet有包名,比如,Hello的包名是tom.jiafei,那么調(diào)用該servlet的UR
14、L是:http:/localhost:8080/web服務(wù)目錄/servlet/tom.jiafei.Hello因為起了包名,Hello的全名是tom.jiafei.Hello(就好比大連的全名是:中國.遼寧.大連)。11.3 通過JSP頁面調(diào)用servlet11.3.1 通過表單向servlet提交數(shù)據(jù)任何一個Web服務(wù)目錄下的JSP頁面都可以通過表單或超鏈接訪問某個servlet。通過JSP頁面訪問servlet的好處是,JSP頁面可以負(fù)責(zé)頁面的靜態(tài)信息處理,動態(tài)信息處理交給servlet去完成。在下面的例子中,JSP頁面通過表單向servlet提交一個正實數(shù),servlet負(fù)責(zé)計算這個數(shù)
15、的平方根返回給客戶。為了方便地調(diào)試servlet,本書中,servlet的字節(jié)碼文件存放在D:Tomcatjakarta-tomcat-4.0webappsexampleWeb-infclasses中,那么在JSP頁面中調(diào)用servlet時,servlet的URL是:/examples/servlet/servletNameservlet源文件 Sqrt.javaimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class Sqrt extends HttpServlet public void
16、 init(ServletConfig config) throws ServletException super.init(config); public void service(HttpServletRequest request,HttpServletResponse response) throws IOException /獲得一個向客戶發(fā)送數(shù)據(jù)的輸出流: PrintWriter out=response.getWriter(); response.setContentType(text/html;charset=GB2312);/設(shè)置響應(yīng)的MIME類型。 out.println(
17、 ); String number=request.getParameter(number); /獲取客戶提交的信息。 double n=0; try n=Double.parseDouble(number); out.print(+Math.sqrt(n); catch(NumberFormatException e) out.print(input number letter please! ); out.println( ); 11.3.2 通過超鏈接訪問servlet我們可以在JSP頁面中,點擊一個超鏈接,訪問servlet。例子3connection.jsp:加載servlet11.
18、4 servlet的共享變量我們已經(jīng)知道,在servlet被加載之后,當(dāng)后續(xù)的客戶請求servlet服務(wù)時,引擎將啟動一個新的線程,在該線程中,servlet調(diào)用service方法響應(yīng)客戶的請求,而且servlet類中定義的成員變量,被所有的客戶線程共享。在下面的例子4中,利用共享變量實現(xiàn)了一個計數(shù)器。例子4Count.java:import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class Count extends HttpServlet int count; public void init
19、(ServletConfig config) throws ServletException super.init(config); count=0; public synchronized void service(HttpServletRequest request,HttpServletResponse response) throws IOException /獲得一個向客戶發(fā)送數(shù)據(jù)的輸出流: PrintWriter out=response.getWriter(); response.setContentType(text/html;charset=GB2312);/設(shè)置響應(yīng)的MIM
20、E類型。 out.println( ); count+; /增加計數(shù)。 out.println(you are +count+th+ people); out.println( ); 注:在處理多線程問題時,我們必須注意這樣一個問題:當(dāng)兩個或多個線程同時訪問同一個變量,并且一個線程需要修改這個變量。我們應(yīng)對這樣的問題作出處理,否則可能發(fā)生混亂.所以上述例子中的service方法是一個synchronized方法。數(shù)學(xué)上有一個計算的公式:下面的例子中利用成員變量被所有客戶共享這一特性實現(xiàn)客戶幫助計算的值,即每當(dāng)客戶請求訪問servlet時都參與了一次的計算??蛻敉ㄟ^點擊一個JSP頁面的超鏈接訪問
21、一個計算的servlet例子5Example11_5.jsp:查看PI的值servlet源文件import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class ComputerPI extends HttpServlet double sum=0,i=1,j=1; int number=0; public void init(ServletConfig config) throws ServletException super.init(config); public synchronized vo
22、id service(HttpServletRequest request,HttpServletResponse response) throws IOException /獲得一個向客戶發(fā)送數(shù)據(jù)的輸出流: PrintWriter out=response.getWriter(); response.setContentType(text/plain);/設(shè)置響應(yīng)的MIME類型為純文本。 number+; sum=sum+i/j; j=j+2; i=-i; out.println(You are +number+th People coming to here); out.println(N
23、ow PI= +4*sum); 如果根據(jù)請求的類型進(jìn)行不同的處理,就需在兩個方法中編寫不同的處理過程(見例子7)。在下面的例子6中,用戶可以通過兩個表單向servlet提交一個正數(shù),其中一個表單的提交方式是post,另一個表單的方式是get。無論用戶用那種方式,服務(wù)器的servlet都計算這個數(shù)的全部因數(shù),返回給用戶。而在下面的例子7中,如果使用post方式提交正數(shù),servlet計算這個數(shù)的全部因數(shù),如果使用get方式,servlet求出小于這個數(shù)的全部素數(shù)。例子6 (提交正數(shù)的JSP頁面)Example11_6.jsp:輸入一個數(shù),提交給servlet(Post方式): 續(xù)前頁:輸入一個數(shù)
24、,提交給servlet(Get方式): sevlet源文件ComputerFacor.java:import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class ComputerFactor extends HttpServlet public void init(ServletConfig config) throws ServletException super.init(config); public void doPost(HttpServletRequest request,HttpSer
25、vletResponse response) throws ServletException,IOException例子7 (提交正數(shù)的JSP頁面)Example11_7.jsp:輸入一個數(shù),提交給servlet(Post方式): 輸入一個數(shù),提交給servlet(Get方式): sevlet源文件ComputerFacorandPrimNumber.java:import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class ComputerFactorandPrimNumber extends H
26、ttpServlet public void init(ServletConfig config) throws ServletException super.init(config); public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException /獲得一個向客戶發(fā)送數(shù)據(jù)的輸出流: PrintWriter out=response.getWriter(); response.setContentType(text/html;char
27、set=GB2312);/設(shè)置響應(yīng)的MIME類型。 out.println(); out.println();續(xù)前頁: String number=request.getParameter(number); /獲取客戶提交的信息。 double n=0; try n=Double.parseDouble(number); out.println( factors of +n+ :); /求n的全部因數(shù): for(int i=1;i=n;i+) if(n%i=0) out.println(i); catch(NumberFormatException e) out.print(input num
28、ber letter please! ); public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException PrintWriter out=response.getWriter(); response.setContentType(text/html;charset=GB2312);/設(shè)置響應(yīng)的MIME類型。 out.println(); out.println();續(xù)前頁: String number=request.getParame
29、ter(number); /獲取客戶提交的信息。 double n=0; try n=Double.parseDouble(number); out.println( Primnumbers less +n+ :); /求小于n的全部素數(shù): int j=1; for(int i=1;in;i+) for(j=2;j=i) out.println(i); catch(NumberFormatException e) out.print(input number letter please! ); 11.5.2 設(shè)置響應(yīng)的HTTP頭有關(guān)響應(yīng)的HTTP頭介紹,可參見第3講。在下面的例子8中,serv
30、let設(shè)置響應(yīng)頭:Refresh的頭值是2,那么該servlet在2秒鐘后自動刷新,即servlet在2秒鐘后重新調(diào)用service方法響應(yīng)用戶。例子8 (調(diào)用servlet的JSP頁面)Example11_8.jsp:查看時間sevlet源文件DateServlet.java:import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class DateServlet extends HttpServlet public void init(ServletConf
31、ig config) throws ServletException super.init(config); public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException /獲得一個向客戶發(fā)送數(shù)據(jù)的輸出流: PrintWriter out=response.getWriter(); response.setContentType(text/html;charset=GB2312);/設(shè)置響應(yīng)的MIME類型。 out.println()
32、; out.println(); response.setHeader(Refresh,2); /設(shè)置Refresh的值。 out.println(Now Time:); out.println(+new Date(); out.println(); out.println(); public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException doPost(request,response); 下面例子9實現(xiàn)servlet的重定向,客戶訪
33、問servlet:Day;如果訪問的時間是在22點之后,就被重定向到servlet:Night,提醒用戶休息。Day和Night被存放在examples/Web-inf/classes中。例子9Day.java:import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class Day extends HttpServlet public void init(ServletConfig config) throws ServletException super.i
34、nit(config); public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException /獲得一個向客戶發(fā)送數(shù)據(jù)的輸出流: PrintWriter out=response.getWriter(); response.setContentType(text/html;charset=GB2312);/設(shè)置響應(yīng)的MIME類型。續(xù)前頁: out.println(); out.println(); Calendar calendar=Calendar.getInstance(); /
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度集團(tuán)高層管理人員任期制競聘與續(xù)聘合同6篇
- 2025版小時工定期雇傭合同范本3篇
- 2025版土地征收及安置補(bǔ)償中介服務(wù)合同3篇
- 全新二零二五年度房地產(chǎn)銷售代理合同3篇
- 二零二五版企業(yè)內(nèi)部會計檔案安全保密服務(wù)協(xié)議3篇
- 2025年度文化創(chuàng)意產(chǎn)品開發(fā)與銷售合作協(xié)議范本4篇
- 二零二五年度廚具品牌設(shè)計創(chuàng)新合同4篇
- 2025年度個人土地承包經(jīng)營權(quán)流轉(zhuǎn)合同示范文本11篇
- 二零二五年度存量房交易房屋維修基金管理合同3篇
- 二零二五年度寵物活體銷售與繁育基地合作框架合同4篇
- 圖像識別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 個體戶店鋪租賃合同
- 禮盒業(yè)務(wù)銷售方案
- 二十屆三中全會精神學(xué)習(xí)試題及答案(100題)
- 小學(xué)五年級英語閱讀理解(帶答案)
- 仁愛版初中英語單詞(按字母順序排版)
- 【奧運會獎牌榜預(yù)測建模實證探析12000字(論文)】
- 魯濱遜漂流記人物形象分析
- 危險廢物貯存?zhèn)}庫建設(shè)標(biāo)準(zhǔn)
- 多層工業(yè)廠房主體結(jié)構(gòu)施工方案鋼筋混凝土結(jié)構(gòu)
- 救生艇筏、救助艇基本知識課件
評論
0/150
提交評論