




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第4 4章章 Java ServletJava Servlet技術(shù)技術(shù)主要內(nèi)容主要內(nèi)容n 4.1 Servlet概述n 4.2 Servlet生命周期n 4.3 使用Servlet n 4.4 Applet與Servlet通信4.1 Servlet4.1 Servlet概述概述nServlet是服務(wù)器端的小應(yīng)用程序,用于響應(yīng)客戶端的請求;并且一般會把處理的結(jié)果以HTML的形式返回給客戶端。nServlet是由服務(wù)器端調(diào)用和執(zhí)行的Java類。nServlet與JSP有著直接的血緣關(guān)系。 (JSP代碼就是先轉(zhuǎn)換為Servlet,然后才被編譯執(zhí)行)ServletServlet介紹介紹n什么是Ser
2、vlet Servlet是服務(wù)器端的小應(yīng)用程序,用于響應(yīng)客戶端的請求;并且一般會把處理的結(jié)果以HTML的形式返回給客戶端。 Servlet是由服務(wù)器端調(diào)用和執(zhí)行的Java類。 Servlet與JSP有著直接的血緣關(guān)系。 (JSP代碼就是先轉(zhuǎn)換為Servlet,然后才被編譯執(zhí)行)ServletServlet介紹介紹n Servlet的生命周期 當(dāng)客戶端第一次請求Sevlet時,Servlet被加載到內(nèi)存 服務(wù)器創(chuàng)建這個Servlet的實(shí)例,并調(diào)用該對象的init()方法進(jìn)行初始化 每當(dāng)客戶端發(fā)來請求的時候,容器創(chuàng)建請求對象和響應(yīng)對象,并調(diào)用該對象的service()方法對用戶的請求進(jìn)行處理,并對
3、用戶進(jìn)行響應(yīng) 當(dāng)服務(wù)器端不再需要該Servlet的時候,服務(wù)器調(diào)用destroy()方法卸載該Servlet 注意:在Servlet的生命周期中,service()方法是其中的核心。每當(dāng)客戶端向Servlet發(fā)出一個請求時,service()方法就會被調(diào)用。ServletServlet介紹介紹 默認(rèn)條件下,service()方法會調(diào)用與HTTP請求相應(yīng)的do功能。比如:客戶是以GET方式提交請求,則service()方法會調(diào)用doGet()方法;客戶是以POST方式提交請求,則service()方法會調(diào)用doPost()方法。 注意:用戶在地址欄中輸入該JSP頁面的URL直接訪問該頁面時,使用
4、的是get請求。n Servlet是用Java編寫的且協(xié)議和平臺都獨(dú)立的服務(wù)器端的組件。與客戶端組件Applet相對應(yīng)。Servlet擴(kuò)展了面向請求/響應(yīng)的服務(wù)器的模塊,使用平臺專用的API進(jìn)行服務(wù)器端的編程。Servlet為服務(wù)器和基于Web的客戶之間的通信提供了一條更為簡單的途徑。它的特殊用途包括:n (1) 允許用戶之間的合作。一個Servlet可以同時并發(fā)處理大量的請求,而且可以同步請求,因此使Servlets能夠支持像在線會議這樣的系統(tǒng)。Servlets能夠并發(fā)地服務(wù)多個客戶。n (2) 轉(zhuǎn)發(fā)請求。Servlets能夠轉(zhuǎn)發(fā)請求到其它的服務(wù)器和Servlets,因此Servlets能夠
5、被用來在多個鏡像同一個內(nèi)容的服務(wù)器之間來平衡負(fù)載,在多個服務(wù)器上根據(jù)任務(wù)類型或者組織邊界分割單一的邏輯服務(wù)。4.2 Servlet生命周期生命周期圖4.1 Servlet的生命周期服務(wù)器服務(wù)器處理用戶請求載入銷毀服務(wù)器Servlet代碼Servlet代碼客戶客戶Servlet代碼 1. 初始化初始化Servlet 當(dāng)服務(wù)器載入一個Servlet時,服務(wù)器運(yùn)行Servlet的init方法。初始化在客戶請求被處理和Servlet被銷毀之前完成。 2. Servlet_Client交互交互 初始化成功后,HTTP Servlet調(diào)用Service方法處理客戶請求,Service方法將每個請求分配到處
6、理這個請求的方法,從而支持標(biāo)準(zhǔn)的HTTP客戶請求。HttpServlet類中的方法處理客戶請求時使用以下兩個參數(shù): (1) HttpServletRequest對象:封裝了從客戶來的數(shù)據(jù),主要提供了訪問初始請求數(shù)據(jù)的方法和字段;訪問客戶數(shù)據(jù)時使用getParameter方法得到一個已命名參數(shù)的值。 (2) HttpServletResponse對象:封裝了對客戶的響應(yīng)。使用getWriter方法返回文本數(shù)據(jù)給客戶(可以以HTML網(wǎng)頁的形式表現(xiàn)出來)。Service方法支配的HTTP請求如表13.1所示。表表4.1 Service方法支配的方法支配的HTTP請求請求Service 方法 處理的
7、HTTP 請求 doGet 處理 GET、條件 GET 和 HEAD 請求 doPost 處理 POST 請求 doPut 處理 PUT 請求 deDelete 處理 DELETE 請求 通常,編寫的Servlet應(yīng)該重載處理它支持的HTTP交互的方法。如果出錯,這些方法返回一個BAD_REQUEST(400)錯誤。當(dāng)Servlet收到OPTIONS請求時,HttpServlet的Service方法調(diào)用doOptions方法。默認(rèn)的doOptions的實(shí)現(xiàn)自動地決定了支持何種HTTP選項和返回信息。HTTP Servlets通常能夠并發(fā)地服務(wù)多個客戶。如果Servlet中的這個方法對于客戶訪問
8、共享資源是可行的,那么你可以通過創(chuàng)建在某一時刻只能處理一個客戶請求的Servlet來處理并發(fā)。 3. 銷毀銷毀Servlet Servlet一直運(yùn)行直到服務(wù)器銷毀它們,比如在系統(tǒng)管理員的要求下。當(dāng)一個服務(wù)器銷毀一個Servlet時,服務(wù)器運(yùn)行Servlet的Destroy()方法。方法只運(yùn)行一次,服務(wù)器將不再運(yùn)行Servlet,直到服務(wù)器重新載入和重新初始化Servlet。4.3 使用使用Servlet4.3.1 編寫編寫Servlet 【例13.1】 在客戶端填寫“用戶注冊信息”網(wǎng)頁,并將此網(wǎng)頁提交到后臺服務(wù)器端Servlet,服務(wù)器端Servlet程序給予響應(yīng),并以網(wǎng)頁的形式按行輸出用戶提
9、交的基本信息。 1. 客戶端客戶端 客戶端是一個“用戶注冊信息”的HTML網(wǎng)頁,如圖13.2所示。用戶輸入個人信息,點(diǎn)擊“確定”按鈕,將表單數(shù)據(jù)提交到服務(wù)器,然后等待服務(wù)器的響應(yīng)。Index.html源文件代碼如下:用戶注冊信息收集用戶注冊信息 姓名: 身份證號: 性別男女職業(yè) 計算機(jī)業(yè) 醫(yī)生 教師 軍隊 個性化宣言 圖4.2 “用戶注冊信息”網(wǎng)頁 在網(wǎng)頁index.html中要注意表單的書寫,表單的action屬性對應(yīng)服務(wù)器端的Servlet,本例中取值為3:8080/examples/Servlet/user.UserServlet;method屬性是
10、訪問方法,本例中為POST方法。表13.2是表單中的元素標(biāo)簽和命名,可以看到除去“確定”和“清空”,其它的元素標(biāo)簽在第三欄都有一個對應(yīng)的名字,Servlet通過這些名字獲得用戶在界面上輸入的值,而用戶單擊“確定”按鈕時,表單內(nèi)容就提交到action屬性指定的Servlet。表表4.2 表單元素標(biāo)簽及命名表單元素標(biāo)簽及命名元素標(biāo)簽 類 型 標(biāo) 簽 命 名 姓名 text name 身份證號 text number 性別 radio sex 職業(yè) select job 個性化宣言 textarea ta 確定 submit 清空 reset 2. 服務(wù)器端服務(wù)器端 服務(wù)器端Servlet收集用戶界
11、面輸入的數(shù)據(jù)(見圖4.3),然后按行返回這些內(nèi)容,結(jié)果如圖4.4所示。注意傳輸過程中中文字符可能會有出錯情況,因此再添加一個轉(zhuǎn)換字段,使得Servlet能夠正確打印輸出。/程序文件名:UserServlet.javapackage user;import java.io.*;import javax.Servlet.*;import javax.Servlet.http.*;public class UserServlet extends HttpServlet String name,number,sex,job,ta;public void init() throws ServletExc
12、eptionsuper.init();name = new String();number = new String();sex = new String();job = new String();ta = new String();/解決中文轉(zhuǎn)換問題public String parseChinese(String inStr) String s = null; byte temp; if (inStr = null) /System.out.println(Warn:Chinese null founded!); return new String(); try temp=inStr.ge
13、tBytes(iso-8859-1); s = new String(temp); catch(UnsupportedEncodingException e) System.out.println (e.toString(); return s; public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException /獲取用戶界面輸入的值name = req.getParameter(name);number = req.getParameter(numb
14、er);sex = req.getParameter(sex);job = req.getParameter(job);ta = req.getParameter(ta); /進(jìn)行輸出res.setContentType(text/html; charset=GB2312);PrintWriter out = res.getWriter();out.println();out.println(注冊信息返回結(jié)果);out.println( 姓名: + parseChinese(name);out.println( 身份證號: + number);out.println( 性別: + parseC
15、hinese(sex) + 職業(yè): + parseChinese(job);out.println(個性化宣言: + parseChinese(ta) + ); 圖4.3 用戶輸入注冊信息圖4.4 Servlet返回信息4.3.2 編譯、配置編譯、配置Servlet 安裝的Java包是沒有帶Servlet的JAR文件,所以將D:Apache Tomcat 4.0commonlib目錄下的Servlet.jar配置到路徑包的安裝路徑下庫的擴(kuò)展目錄中,編譯時會自動連接庫,如本書配置到的目錄為D:j2sdk1.4.0_01jrelibext。在命令行提示符下鍵入命令javac UserServlet
16、.java編譯文件,生成類UserServlet.class。 Servlet是服務(wù)器端組件,所以必須配置到服務(wù)器端。對于Tomcat 4.0服務(wù)器,將index.html配置到物理路徑D:Apache Tomcat 4.0webappsROOTuser目錄下,對應(yīng)的網(wǎng)絡(luò)路徑就是3:8080/user/index.html;將UserServlet配置到物理路徑下的D:Apache Tomcat 4.0webappsexamplesWEB-INFclassesuser目錄下,對應(yīng)的網(wǎng)絡(luò)地址就是3:8080/exampl
17、es/Servlet/user.UserServlet。這些配置信息由index.html中的Action屬性標(biāo)明。 如果希望能夠配置到根目錄下,則在開始-程序-Apache Tomcat 4.0-Configuration中單擊EditServer Configuration,然后找到行: !- - -刪除第二個,將以上語句變成: 將機(jī)器重啟動,使得配置文件生效,并在D:Apache Tomcat 4.0webappsROOTWEB-INF路徑下建立classes目錄,然后將UserServlet.java源文件中的語句行package user;去掉,重新編譯成.class類文件并放入此目
18、錄,則action屬性對應(yīng)的網(wǎng)絡(luò)地址為3:8080/Servlet/ UserServlet4.4 Applet與與Servlet通信通信 Applet與Servlet的通信過程的基本原理相當(dāng)于HTML網(wǎng)頁的POST請求。首先兩者之間建立一個連接,使用URLConnection類對象打開連接后,Applet將請求發(fā)送給Servlet,Servlet處理請求并返回處理結(jié)果。注意,發(fā)送請求數(shù)據(jù)時一定用URLEncoder類的Encode方法進(jìn)行格式編碼,在Servlet端還需用URLDecoder類的Decode方法進(jìn)行格式解碼。 在HTTP協(xié)議中POST請求
19、是以參數(shù)名=參數(shù)值的方式自動進(jìn)行URL編碼后傳送的,編程中要手工實(shí)現(xiàn),例如名-值對 qry = SELECT number,code,score from chengji WHERE code=3001進(jìn)行URL編碼如下: String qry = URLEncoder.encode(qry,UTF-8) + = + URLEncoder.encode(qryString,UTF-8); 建立連接時,注意將DbServlet配置到路徑D:Apache Tomcat 4.0webappsROOTWEB-INFclasses下。String str = 3:8
20、080/Servlet/DbServlet;URL urlName = new URL(str);打開連接。URLConnection uc = urlName.openConnection();設(shè)置參數(shù)。uc.setDoOutput(true);uc.setDoInput(true);uc.setUseCaches(false); uc.setRequestProperty(Content-type,application/x-www-form-urlencoded); 得到數(shù)據(jù)流發(fā)送格式轉(zhuǎn)換后的POST請求。 DataOutputStream dos = new DataOutputStr
21、eam(uc.getOutputStream(); dos.writeBytes(qry); 在DbServlet中接收數(shù)據(jù)并進(jìn)行解碼。 String qry = req.getParameter(qry); qry = URLDecoder.decode(qry,UTF-8); 【例4.2】編寫Applet和Servlet交互的程序,使得用戶在Applet界面(見圖4.5)上輸入數(shù)據(jù)庫查詢語句,單擊“查詢”按鈕后,后臺Servlet接收請求,對后臺數(shù)據(jù)庫進(jìn)行查詢,并將查詢結(jié)果返回到Applet界面的文本區(qū)域內(nèi)。圖4.5 Applet用戶界面圖4.6 Applet和Servlet交互原理圖數(shù)據(jù)
22、庫SQL查詢ResultSet對象URLConnection打開連接,發(fā)送請求流對象接收返回結(jié)果Java AppletJava Servlet4.4.1 Servlet文件文件 首先書寫查詢數(shù)據(jù)庫的Servlet文件,編譯通過后配置到上面提到的路徑。/程序文件名DbServlet.javaimport javax.Servlet.*;import javax.Servlet.http.*;import java.util.*;import java.sql.*;import java.io.*;import .*;public class DbServlet extends HttpServl
23、etpublic void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletExceptionPrintWriter out = res.getWriter();res.setContentType(text/html;charset=GB2312); /得到Applet請求參數(shù),解碼后輸出String qry = req.getParameter(qry);qry = URLDecoder.decode(qry,UTF-8);out.println(qry);Connecti
24、on dbCon = null;try /同數(shù)據(jù)庫建立連接Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);String dbURL = jdbc:odbc:STU;dbCon = DriverManager.getConnection(dbURL,);PreparedStatement p = dbCon.prepareStatement(qry);ResultSet rs = p.executeQuery();/輸出查詢結(jié)果while(rs.next()out.print(rs.getString(1);out.print(rs.getString(2
25、) + );out.println(rs.getInt(3);catch(Exception e)out.println(讀寫數(shù)據(jù)庫出錯: + e.getMessage();finallytrydbCon.close();out.close();catch(Exception e) out.println(關(guān)閉數(shù)據(jù)庫連接出錯: + e.getMessage(); ;4.4.2 Applet文件文件編寫與Servlet通信的Applet文件。/程序文件名DbApplet.javaimport java.awt.*;import java.applet.*;import java.awt.even
26、t.*;import java.io.*;import .*;public class DbApplet extends Applet implements ActionListenerTextField tfQuery;TextArea taResults;Button btnExecute;URL chatURL;public void init()Panel pa = new Panel();pa.setLayout(new FlowLayout(FlowLayout.LEFT);pa.add(new Label(查詢串:);tfQuery = new TextField(SELECT
27、number,code,score from chengji WHERE code=3001,50);pa.add(tfQuery);btnExecute = new Button(查詢);btnExecute.addActionListener(this);pa.add(btnExecute);add(North,pa);taResults = new TextArea(30,60);add(Center,taResults);chatURL = getCodeBase();public void actionPerformed(ActionEvent evt)String lbl = ev
28、t.getActionCommand();if(lbl.equals(查詢) String qryString = tfQuery.getText(); try /查詢串編碼 String qry = URLEncoder.encode(qry,UTF-8) + = + URLEncoder.encode(qryString,UTF-8); /打開到DbServlet的連接String str = 3:8080/Servlet/DbServlet;URL urlName = new URL(str);URLConnection uc = urlName.openConnection();uc.setDoOutput(true);uc.setDoInput(true);uc.setUseCaches(false); uc.setRequestProperty(C
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人促甲狀腺素注射液-藥品臨床應(yīng)用解讀
- 2024年咨詢工程師考試題庫帶答案解析
- 靜脈曲張治療
- 預(yù)防接種百日咳的重要性與實(shí)施策略
- 中航公司工作總結(jié)
- 零食店創(chuàng)新創(chuàng)業(yè)計劃書
- 難忘的八個字說課
- 預(yù)防接種的禁忌癥
- 靜脈溶栓后的護(hù)理查房
- 預(yù)防一氧化碳中毒班會
- 常見危急值及處理流程課件
- 環(huán)境、社會和公司治理ESG的作業(yè)管理
- 第14課 明清時期的經(jīng)濟(jì)、科技與文化
- 2023年新概念英語第一冊全冊144課練習(xí)題打印版
- 基礎(chǔ)教育改革專題課件
- 煤炭送貨辦法實(shí)施細(xì)則(二篇)
- 五年級(下)科學(xué)教科版全冊全套單元期中期末檢測卷(一)附答案
- 四大穿刺技術(shù)操作規(guī)范
- 金合CAD操作說明
- 土的承載比CBR試驗JTG34302020
- 2022-2023學(xué)年四川省綿陽市綿陽中學(xué)高三1月月考語文試題(解析版)
評論
0/150
提交評論