版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGEPAGE280《JavaWeb編程技術(shù)》電子教案沈澤剛編制
《JavaWeb編程技術(shù)》教案第01講環(huán)境構(gòu)建與簡(jiǎn)單程序開(kāi)發(fā)2學(xué)時(shí)110分鐘章節(jié)內(nèi)容第1章JavaWeb起步入門1.1萬(wàn)維網(wǎng)與Internet 1.2Web前端技術(shù) 1.3Web后端技術(shù) 1.4Tomcat服務(wù)器1.5IntelliJIDEA開(kāi)發(fā)工具1.6Maven入門1.7Servlet和JSP簡(jiǎn)介教學(xué)目標(biāo)了解Internet與Web的基本概念、了解HTTP及相關(guān)技術(shù)了解Web前端技術(shù)和Web后端技術(shù)了解Servlet和JSP掌握Maven重點(diǎn)掌握Tomcat服務(wù)器和IntelliJIDEA開(kāi)發(fā)工具的安裝重點(diǎn)難點(diǎn)重點(diǎn):重點(diǎn)掌握Tomcat服務(wù)器和IntelliJIDEA開(kāi)發(fā)工具的安裝。難點(diǎn):Tomcat服務(wù)器的配置和IntelliJIDEA開(kāi)發(fā)工具的使用。教學(xué)環(huán)節(jié)教學(xué)方法及其它說(shuō)明事項(xiàng)1.采用講授法、演示法、討論法。2.案例+項(xiàng)目式教學(xué)。3.采用線上線下混合教學(xué)模式。配套線上課程地址:/detail/2182465434.軟件環(huán)境:Windows10,JDK17以上,IntelliJIDEA2023以上。導(dǎo)言或復(fù)習(xí)瀏覽器是Web應(yīng)用的客戶端程序,可向Web服務(wù)器發(fā)送各種請(qǐng)求,并對(duì)從服務(wù)器發(fā)回的文檔和各種多媒體數(shù)據(jù)格式進(jìn)行解析、顯示和播放。瀏覽器的主要功能是解析網(wǎng)頁(yè)文件內(nèi)容并正確顯示,網(wǎng)頁(yè)一般是\o"HTML"HTML格式。瀏覽器除了請(qǐng)求服務(wù)器的靜態(tài)資源,還可以請(qǐng)求動(dòng)態(tài)資源。例如,服務(wù)器可能會(huì)提供一個(gè)文檔,要求用戶通過(guò)瀏覽器輸入信息。在用戶完成輸入后,瀏覽器將輸入的信息傳遞給服務(wù)器,服務(wù)器利用輸入信息進(jìn)行計(jì)算,然后向?yàn)g覽器返回一個(gè)新的文檔,將結(jié)果通知給瀏覽器。有時(shí)候?yàn)g覽器可能還會(huì)直接請(qǐng)求執(zhí)行服務(wù)器中存儲(chǔ)的某個(gè)程序。程序的執(zhí)行結(jié)果發(fā)回給瀏覽器。常見(jiàn)的瀏覽器有MicrosoftEdge、\o"MozillaFirefox"Firefox、GoogleC\o"chrome"hrome、\o"InternetExplorer"InternetExplorer、和\o"Opera"Opera,瀏覽器是最常使用的\o"客戶端程序"客戶端程序。Tomcat也是一種常用的Web服務(wù)器,它具有Web服務(wù)器的功能,同時(shí)也是Web容器,可以運(yùn)行Servlet和JSP。講授內(nèi)容1.1萬(wàn)維網(wǎng)與Internet1.1.1萬(wàn)維網(wǎng)WWWWeb是基于瀏覽器/服務(wù)器(B/S)的一種體系結(jié)構(gòu),客戶使用瀏覽器向Web服務(wù)器發(fā)出請(qǐng)求,服務(wù)器響應(yīng)客戶請(qǐng)求,向客戶送回所請(qǐng)求的網(wǎng)頁(yè),在瀏覽器窗口上顯示網(wǎng)頁(yè)的內(nèi)容。1.1.2服務(wù)器和瀏覽器1、Web瀏覽器2、Web服務(wù)器1.1.3主機(jī)和IP地址連接到Internet上的所有計(jì)算機(jī),從大型機(jī)到微型機(jī)都以獨(dú)立的身份出現(xiàn),我們稱它為主機(jī)(host)。為實(shí)現(xiàn)各主機(jī)間的通信,每臺(tái)主機(jī)都必須有一個(gè)唯一的網(wǎng)絡(luò)地址,叫IP(InternetProtocol)地址。IP地址分為IPv4與IPv6兩個(gè)版本。IPv6采用128位地址長(zhǎng)度,這種IP地址有效地解決了地址短缺問(wèn)題。1.1.4HTTP協(xié)議1.1.5URL與URIWeb上的資源是通過(guò)URL標(biāo)識(shí)的。URL(UniformResourceLocator)稱為統(tǒng)一資源定位器,指Internet上位于某個(gè)主機(jī)上的資源。資源包括HTML文件、圖像文件和程序等。URL通常由四部分組成:協(xié)議名稱、所在主機(jī)的DNS名或IP地址、可選的端口號(hào)和資源的名稱。端口號(hào)和資源名稱可以省略。1.2Web前端技術(shù)1.2.1HTMLHTML(HyperTextMarkupLanguage)稱為超文本標(biāo)記語(yǔ)言,是一種用來(lái)創(chuàng)建超文本文檔的標(biāo)記語(yǔ)言。所謂超文本是指用HTML編寫的文檔中可以包含指向其他文檔或資源的鏈接,該鏈接也稱為超鏈接(hyperlink)。通過(guò)超鏈接,用戶可以很容易訪問(wèn)所鏈接的資源。HTML文檔一般包含兩類信息:一類是標(biāo)記信息,包含在標(biāo)簽中,由一對(duì)尖括號(hào)(<和>)作為定界符,其中是元素名和屬性。另一類信息是文檔的字符數(shù)據(jù),它們位于標(biāo)簽的外部,一般是需要瀏覽器顯示的信息。下面是一個(gè)簡(jiǎn)單超鏈接標(biāo)簽。1.2.2CSS瀏覽器對(duì)HTML頁(yè)面的各種元素都有一種默認(rèn)的呈現(xiàn)樣式(如,顏色和字體等),也可以使用CSS重新設(shè)置元素的樣式。CSS(CascadingStyleSheets)是層疊樣式表的意思,它是一種用來(lái)表現(xiàn)HTML或XML等文件樣式的語(yǔ)言。CSS是能夠真正做到網(wǎng)頁(yè)表現(xiàn)與內(nèi)容分離的一種樣式設(shè)計(jì)語(yǔ)言。相對(duì)于傳統(tǒng)HTML的表現(xiàn)而言,CSS能夠?qū)W(wǎng)頁(yè)中的對(duì)象的位置進(jìn)行像素級(jí)的精確控制,支持幾乎所有的字體字號(hào)樣式,擁有對(duì)網(wǎng)頁(yè)對(duì)象和模型樣式編輯能力,并能夠進(jìn)行初步交互設(shè)計(jì)。樣式表有三個(gè)層次,按照從底層到高層的順序,分別為內(nèi)聯(lián)樣式表、文檔樣式表以及外部樣式表。1.3Web后端技術(shù)Web后端也稱Web服務(wù)器端,Web應(yīng)用程序運(yùn)行在Web服務(wù)器上,是可通過(guò)瀏覽器訪問(wèn)的各種Web組件的集合。在實(shí)際應(yīng)用中,Web應(yīng)用程序是由多個(gè)Servlet程序、JSP頁(yè)面、HTML文件以及圖像文件等資源組成。所有這些組件相互協(xié)調(diào)為用戶提供一組完整的服務(wù)。1.3.1服務(wù)器端編程技術(shù)1、傳統(tǒng)技術(shù)標(biāo)準(zhǔn)—CGI技術(shù)公共網(wǎng)關(guān)接口(CommonGatewayInterface,CGI)技術(shù)是在服務(wù)器端生成動(dòng)態(tài)Web文檔的傳統(tǒng)方法。CGI是一種標(biāo)準(zhǔn)化的接口,允許Web服務(wù)器與后臺(tái)程序和腳本通信,這些后臺(tái)程序和腳本能夠接受輸入信息(例如,來(lái)自表單),訪問(wèn)數(shù)據(jù)庫(kù),最后生成HTML頁(yè)面作為響應(yīng)。2、Java解決方案—Servlet技術(shù)在Java平臺(tái)上,服務(wù)器擴(kuò)展是使用ServletAPI編寫的,服務(wù)器擴(kuò)展模塊叫做Servlet容器(container),或稱Web容器。Tomcat就是一個(gè)Web容器,它在整個(gè)Web應(yīng)用系統(tǒng)中處于中間層的地位,如圖所示。3、動(dòng)態(tài)Web頁(yè)面技術(shù)在服務(wù)器端動(dòng)態(tài)生成Web文檔有多種方法。一種常見(jiàn)的實(shí)現(xiàn)動(dòng)態(tài)文檔技術(shù)是在Web頁(yè)面中嵌入某種語(yǔ)言的腳本,然后讓服務(wù)器來(lái)執(zhí)行這些腳本以便生成最終發(fā)送給客戶的頁(yè)面。目前比較流行的技術(shù)有PHP技術(shù)、ASP.NET技術(shù)和JSP技術(shù)。1.3.2靜態(tài)與動(dòng)態(tài)Web資源可以把Web資源分為靜態(tài)的和動(dòng)態(tài)的。如果資源本身沒(méi)有任何處理功能它就是靜態(tài)的,如果資源有自己的處理能力,它就是動(dòng)態(tài)的。Web應(yīng)用程序通常是靜態(tài)資源和動(dòng)態(tài)資源的混合。例如,當(dāng)瀏覽器向/myfile.html發(fā)送一個(gè)請(qǐng)求,Web服務(wù)器就在上查找myfile.html文件,找到后把該文件內(nèi)容發(fā)送給瀏覽器,它是靜態(tài)資源。當(dāng)瀏覽器向/product-report發(fā)送一個(gè)請(qǐng)求,Web服務(wù)器就將請(qǐng)求轉(zhuǎn)發(fā)給product-report程序,該程序?qū)?zhí)行生成HTML文檔并把它發(fā)送給瀏覽器,該程序就是一個(gè)動(dòng)態(tài)資源。1.3.3后端數(shù)據(jù)庫(kù)技術(shù)目前有多種數(shù)據(jù)庫(kù)可以使用,包括關(guān)系數(shù)據(jù)庫(kù)、文本數(shù)據(jù)庫(kù)以及圖數(shù)據(jù)庫(kù)等,最常用的是關(guān)系數(shù)據(jù)庫(kù)。典型的關(guān)系數(shù)據(jù)庫(kù)包括Oracle數(shù)據(jù)庫(kù)、SQLServer數(shù)據(jù)庫(kù)、MySQL數(shù)據(jù)庫(kù)以及PostgreSQL數(shù)據(jù)庫(kù)等。1.3.4全棧與全棧開(kāi)發(fā)員一名開(kāi)發(fā)人員,如果能同時(shí)勝任前端和后端的開(kāi)發(fā),一般稱為全棧開(kāi)發(fā)員(fullstackdeveloper)。一些中小企業(yè)更喜歡聘用全棧開(kāi)發(fā)員,因?yàn)樗麄兛梢蕴幚砬岸撕秃蠖碎_(kāi)發(fā)任務(wù),從而減少開(kāi)發(fā)時(shí)間和成本。多年來(lái),一些技術(shù)棧在所有應(yīng)用程序項(xiàng)目中獲得了前所未有的普及和吸引力,每一種技術(shù)都有自己的優(yōu)勢(shì)。演示或觀看教學(xué)視頻1.4Tomcat服務(wù)器1.4.1Tomcat下載與安裝可以到/網(wǎng)站下載Tomcat服務(wù)器。Tomcat服務(wù)器的最新版本Tomcat10.1.01,實(shí)現(xiàn)了Servlet5.0和JSP3.0的規(guī)范??梢韵螺dTomcat的安裝版和解壓版。解壓版是一個(gè)ZIP文件,下載后解壓到某個(gè)目錄即完成安裝。安裝板是一個(gè)可執(zhí)行文件,本書下載的是Windows平臺(tái)上64位的安裝版,文件名為apache-tomcat-10.1.01.exe,下面介紹Tomcat服務(wù)器安裝、配置的方法。1.4.2Tomcat的目錄結(jié)構(gòu)目錄說(shuō)明/bin存放啟動(dòng)和關(guān)閉Tomcat的腳本文件/conf存放Tomcat服務(wù)器的各種配置文件,其中包括servler.xml、tomcat-users.xml和web.xml等文件/lib存放Tomcat服務(wù)器及所有Web應(yīng)用程序都可以訪問(wèn)的庫(kù)文件/logs存放Tomcat的日志文件/temp存放Tomcat運(yùn)行時(shí)產(chǎn)生的臨時(shí)文件/webapps存放所有Web應(yīng)用程序的根目錄/work存放JSP頁(yè)面生成的Servlet源文件和字節(jié)碼文件1.4.3Tomcat的啟動(dòng)和停止1.4.4Web應(yīng)用程序結(jié)構(gòu)1.4.5Tomcat的配置文件講授內(nèi)容1.5IntelliJIDEA開(kāi)發(fā)工具1.5.1安裝IntelliJIDEA1.5.2在IDEA中創(chuàng)建Web項(xiàng)目1.5.3配置Tomcat服務(wù)器1.5.4在Tomcat中部署項(xiàng)目1.6Maven入門1.6.1Maven的項(xiàng)目結(jié)構(gòu)1.6.2在IntelliJIDEA中使用Maven使用Maven管理項(xiàng)目可以在命令提示符通過(guò)命令完成,在IDE中也可以通過(guò)命令完成。在IntelliJIDEA中提供一個(gè)Maven操作窗口,如圖1-24所示。圖1-24IDEA中Maven操作界面在該窗口中可以方便的執(zhí)行Maven命令,例如,單擊按鈕打開(kāi)一個(gè)命令列表,從中選擇要執(zhí)行的Maven命令(見(jiàn)圖1-25)。演示1.5.5啟動(dòng)Tomcat并訪問(wèn)應(yīng)用在IntelliJ界面的右上角有一個(gè)服務(wù)器工具欄,使用這里的工具可以啟動(dòng)和停止Tomcat服務(wù)器、部署應(yīng)用程序等。在該工具欄中,單擊按鈕用于啟動(dòng)Tomcat服務(wù)器,該按鈕變成時(shí)可重新部署項(xiàng)目。單擊按鈕可以停止Tomcat服務(wù)器。在服務(wù)器啟動(dòng)或重新部署項(xiàng)目,或執(zhí)行Maven命令都將在輸出窗口輸出有關(guān)信息。如果發(fā)生啟動(dòng)或部署錯(cuò)誤,也將在輸出窗口輸出。程序員可根據(jù)輸出窗口信息判斷操作結(jié)果是否正常。服務(wù)器啟動(dòng)或重新部署后,打開(kāi)瀏覽器,在地址欄中輸入要訪問(wèn)的資源URL地址即可訪問(wèn)Web應(yīng)用程序。在使用IDEA新建JavaEnterprise項(xiàng)目時(shí),它自動(dòng)創(chuàng)建一個(gè)HelloServlet和一個(gè)index.jsp頁(yè)面,使用下面URL訪問(wèn)index.jsp頁(yè)面。http://localhost:8080/helloweb/index.jsp結(jié)果如圖所示。單擊頁(yè)面中“HelloServlet”鏈接可訪問(wèn)HelloServlet,運(yùn)行結(jié)果如圖所示。1.7Servlet和JSP簡(jiǎn)介JavaServlet是使用ServletAPI以及相關(guān)的類編寫的Java程序,JSP(JavaServerPages)是嵌入了Java代碼的動(dòng)態(tài)頁(yè)面,文件的擴(kuò)展名是.jsp。它們都是運(yùn)行在服務(wù)器上的組件技術(shù)。本節(jié)簡(jiǎn)單介紹這兩種技術(shù),使讀者熟悉一下有關(guān)的概念,在后面章節(jié)還會(huì)詳細(xì)討論。1.7.1JavaServletJavaServlet也叫服務(wù)器端小程序,,這種程序運(yùn)行在Web容器中,它可以處理用戶的請(qǐng)求,主要用來(lái)實(shí)現(xiàn)動(dòng)態(tài)Web項(xiàng)目。在IntelliIDEA中新建一個(gè)JavaEnterprise項(xiàng)目時(shí),IDEA就在項(xiàng)目中默認(rèn)創(chuàng)建一個(gè)名為HelloServlet的Servlet程序和一個(gè)index.jsp的頁(yè)面。清單1.6HelloServlet.javapackagecom.boda.helloweb;importjava.io.*;importjakarta.servlet.http.*;importjakarta.servlet.annotation.*;@WebServlet(name="helloServlet",value="/hello-servlet")??publicclassHelloServletextendsHttpServlet{???privateStringmessage;?publicvoidinit(){message="HelloWorld!";?}?publicvoiddoGet(HttpServletRequestrequest,?HttpServletResponseresponse)throwsIOException{?response.setContentType("text/html");?//Hello?PrintWriterout=response.getWriter();out.println("<html><body>");?out.println("<h1>"+message+"</h1>");?out.println("</body></html>");}publicvoiddestroy(){?}?}1.7.2JSP頁(yè)面使用Servlet可以實(shí)現(xiàn)Web應(yīng)用程序的所有功能,但它的一大缺點(diǎn)是業(yè)務(wù)邏輯和表示邏輯不分,這對(duì)涉及大量HTML內(nèi)容的應(yīng)用編寫Servlet非常復(fù)雜,程序的修改困難,代碼的可重用性也較差。因此,要實(shí)現(xiàn)表示邏輯,應(yīng)該使用JSP頁(yè)面技術(shù)??梢园袹SP看成是含有Java代碼的HTML頁(yè)面。JSP頁(yè)面本質(zhì)上也是Servlet,它可以完成Servlet能夠完成的所有任務(wù)。JSP(JavaServerPages)頁(yè)面是在HTML頁(yè)面中嵌入JSP元素的頁(yè)面,這些元素稱為JSP標(biāo)簽。在IDEA中新建的JavaEnterprise項(xiàng)目中,默認(rèn)創(chuàng)建了一個(gè)index.jsp頁(yè)面,它是應(yīng)用的首頁(yè),代碼如清單1.6所示。清單1.6index.jsp?<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>?<!DOCTYPEhtml><html><head><title>JSP-HelloWorld</title></head><body>?<h1><%="HelloWorld!"%>?</h1><br/><ahref="hello-servlet">HelloServlet</a></body></html>頁(yè)面的第1行是JSP的page指令?,之后是標(biāo)準(zhǔn)的HTML頁(yè)面標(biāo)記,包括<html>、<head>、<body>以及超鏈接<a>等標(biāo)記,此外頁(yè)面中還包含一個(gè)JSP表達(dá)式?(以<%=開(kāi)頭,以%>結(jié)束),該JSP表達(dá)式輸出一個(gè)字符串。要運(yùn)行JSP頁(yè)面,在JSP頁(yè)面編輯窗口中單擊瀏覽器圖標(biāo),則直接打開(kāi)瀏覽器運(yùn)行頁(yè)面。也可以打開(kāi)瀏覽器,在地址欄中輸入下面URL:http://localhost:8080/chapter01/index.jsp創(chuàng)建項(xiàng)目后,程序員可以根據(jù)需要?jiǎng)?chuàng)建自己的Servlet和JSP頁(yè)面。這里要注意,Servlet程序要保存在src/main/java目錄中,并且要存放到某個(gè)包中。而JSP頁(yè)面通常要存放在src/main/webapp目錄或其子目錄中。課堂討論與互動(dòng)一、關(guān)于Servlet程序,回答下面問(wèn)題。1、說(shuō)明doGet()方法的含義。2、Servlet類是哪個(gè)類的子類?3、JSP的page指令,標(biāo)準(zhǔn)的HTML頁(yè)面標(biāo)記,包括<html>、<head>、<body>以及超鏈接<a>等標(biāo)記都是什么含義?二、哪些資源應(yīng)該存放在Web應(yīng)用程序的WEB-INF目錄中?總結(jié)課后作業(yè)課程交流QQ群:830954046或691865367一、知識(shí)點(diǎn)總結(jié)1、在服務(wù)器端要實(shí)現(xiàn)Web應(yīng)用的動(dòng)態(tài)功能,需要服務(wù)器端編程技術(shù)。目前,在服務(wù)器端技術(shù)有多種,包括CGI技術(shù)、Servlet技術(shù)以及動(dòng)態(tài)頁(yè)面技術(shù)。2、JavaWeb應(yīng)用程序都涉及數(shù)據(jù)管理與存儲(chǔ),數(shù)據(jù)存儲(chǔ)最好的技術(shù)是使用數(shù)據(jù)庫(kù)。目前有多種數(shù)據(jù)庫(kù)可以使用,包括關(guān)系數(shù)據(jù)庫(kù)、文本數(shù)據(jù)庫(kù)以及圖數(shù)據(jù)庫(kù)等,最常用的是關(guān)系數(shù)據(jù)庫(kù)。3、Tomcat是服務(wù)器,為了加快JavaWeb應(yīng)用開(kāi)發(fā),通常使用集成開(kāi)發(fā)環(huán)境IntelliJIDEA。二、課后作業(yè)1.登錄本書在線作業(yè)網(wǎng)站,完成本章作業(yè)題目。地址:/2.編寫一個(gè)名為myfirst.jsp的頁(yè)面,當(dāng)請(qǐng)求該JSP頁(yè)面時(shí),瀏覽器輸出一句話和當(dāng)前的日期,如圖所示。教學(xué)反思《JavaWeb編程技術(shù)》教案第02講Servlet生命周期2學(xué)時(shí)110分鐘章節(jié)內(nèi)容第2章JavaServlet技術(shù)2.1Servlet概述2.1.1ServletAPI2.1.2Servlet接口2.1.3HttpServlet類2.1.4HttpServletRequest接口和HttpServletResponse接口 2.2Servlet生命周期2.2.1加載和實(shí)例化Servlet2.2.2初始化Servlet2.2.3為客戶提供服務(wù)2.2.4銷毀和卸載Servlet教學(xué)目標(biāo)了解ServletAPI掌握Servlet生命周期重點(diǎn)難點(diǎn)重點(diǎn):掌握Servlet生命周期。難點(diǎn):Servlet生命周期。教學(xué)環(huán)節(jié)教學(xué)方法及其它說(shuō)明事項(xiàng)1.采用講授法、演示法、討論法。2.案例+項(xiàng)目式教學(xué)。3.采用線上線下混合教學(xué)模式。配套線上課程地址:/detail/2182465434.軟件環(huán)境:Windows10,JDK16以上,Eclipse2020以上。導(dǎo)言或復(fù)習(xí)JavaServlet(Java服務(wù)器端程序)是JavaWeb技術(shù)的核心基礎(chǔ),它實(shí)際是CGI技術(shù)的一種替代,這種程序運(yùn)行在Web容器中,主要用來(lái)實(shí)現(xiàn)動(dòng)態(tài)Web項(xiàng)目,它是Java企業(yè)應(yīng)用開(kāi)發(fā)的關(guān)鍵組件。講授內(nèi)容2.1Servlet概述2.1.1ServletAPIServlet是使用ServletAPI以及相關(guān)的類編寫的Java程序,ServletAPI是JavaWeb應(yīng)用開(kāi)發(fā)的基礎(chǔ),ServletAPI定義了若干接口和類。目前ServletAPI的最新版本是Servlet5.0,它由下面4個(gè)包組成。jakarta.servlet包,定義了開(kāi)發(fā)與協(xié)議無(wú)關(guān)的Servlet的接口和類。jakarta.servlet.http包,定義了開(kāi)發(fā)采用HTTP協(xié)議通信的Servlet的接口和類。jakarta.servlet.annotation包,定義9個(gè)注解類型和2個(gè)枚舉類型。jakarta.servlet.descriptor包,定義了以編程方式訪問(wèn)Web應(yīng)用程序配置信息的類型。這4個(gè)包中的接口和類是開(kāi)發(fā)Servlet需要了解的全部?jī)?nèi)容。下面重點(diǎn)介紹jakarta.servlet包jakarta.servlet.http包中一些常用的接口和類。下面是幾個(gè)比較重要的接口。Servlet接口,是所有Servlet的根接口。ServletConfig接口,是Servlet配置對(duì)象。GenericServlet抽象類,它實(shí)現(xiàn)了Servlet接口。HttpServlet抽象類,它用于創(chuàng)建支持HTTP協(xié)議的Servlet。HttpServletRequest接口,是基于HTTP協(xié)議的請(qǐng)求對(duì)象,它繼承了ServletRequest接口。HttpServletResponse接口,是基于HTTP協(xié)議的響應(yīng)對(duì)象,它繼承了ServletResponse接口。2.1.2Servlet接口jakarta.servlet.Servlet接口是ServletAPI中的基本接口,每個(gè)Servlet必須直接或間接實(shí)現(xiàn)該接口。該接口定義了如下5個(gè)方法。publicvoidinit(ServletConfigconfig):該方法由容器調(diào)用,完成Servlet初始化并準(zhǔn)備提供服務(wù)。容器傳遞給該方法一個(gè)ServletConfig類型的參數(shù)。publicvoidservice(ServletRequestrequest,ServletResponseresponse):對(duì)每個(gè)客戶請(qǐng)求容器調(diào)用一次該方法,它允許Servlet為請(qǐng)求提供響應(yīng)。publicvoiddestroy():該方法由容器調(diào)用,指示Servlet清除本身、釋放請(qǐng)求的資源并準(zhǔn)備結(jié)束服務(wù)。publicServletConfiggetServletConfig():返回關(guān)于Servlet的配置信息,如傳遞給init()的參數(shù)。publicStringgetServletInfo():返回關(guān)于Servlet的信息,如作者、版本及版權(quán)信息。在默認(rèn)情況下,這個(gè)方法返回空串。開(kāi)發(fā)人員可以覆蓋這個(gè)方法來(lái)返回有意義的信息。觀看教學(xué)視頻2.1.3HttpServlet類jakarta.servlet.http包中定義了使用HTTP協(xié)議創(chuàng)建的Servlet所需要的接口和類,其中HttpServlet抽象類用來(lái)實(shí)現(xiàn)針對(duì)HTTP協(xié)議的Servlet,在HttpServlet中針對(duì)不同的HTTP請(qǐng)求方法定義了不同的處理方法,如處理GET請(qǐng)求的doGet()方法格式如下。protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException通常,我們編寫的Servlet需要繼承HttpServlet類并覆蓋doGet()或doPost()方法。這些方法都帶兩個(gè)參數(shù),HttpServletRequest類型的參數(shù)request表示請(qǐng)求對(duì)象,HttpServletResponse類型的參數(shù)response表示響應(yīng)對(duì)象,它們用來(lái)處理請(qǐng)求和響應(yīng)。2.1.4HttpServletRequest接口和HttpServletResponse接口在HttpServlet類的doGet()方法和其他請(qǐng)求處理方法中都帶兩個(gè)參數(shù),一個(gè)是請(qǐng)求對(duì)象,它是HttpServletRequest的實(shí)例,另一個(gè)是響應(yīng)對(duì)象,它是HttpServletResponse的實(shí)例。它們用來(lái)處理請(qǐng)求和響應(yīng)。HttpServletRequest接口提供了針對(duì)HTTP請(qǐng)求操作方法,如定義了從請(qǐng)求對(duì)象中獲取HTTP請(qǐng)求頭、Cookie等信息的方法。HttpServletResponse接口提供了針對(duì)HTTP的發(fā)送響應(yīng)的方法。它定義了為響應(yīng)設(shè)置如HTTP頭、Cookie信息的方法。講授內(nèi)容2.2.1加載和實(shí)例化Servlet對(duì)客戶請(qǐng)求Servlet時(shí),Web容器使用Class.forName()方法將其加載到內(nèi)存?并將其實(shí)例化?。因此,Servlet類應(yīng)有一個(gè)不帶參數(shù)的構(gòu)造方法。若沒(méi)有為Servlet類中定義構(gòu)造方法,Java編譯器將添加默認(rèn)構(gòu)造方法。容器創(chuàng)建了Servlet實(shí)例后就進(jìn)入生命周期階段,Servlet生命周期方法包括init()、service()和destroy()。?加載到內(nèi)存?加載到內(nèi)存Web容器HelloServletHelloServletHelloServletHelloServlet?實(shí)例化?實(shí)例化HelloServletHelloServletWebHelloServletHelloServletWeb瀏覽器?初始化?初始化?提供服務(wù)??銷毀回收回收2.2.2初始化Servlet容器創(chuàng)建Servlet實(shí)例后,調(diào)用init(ServletConfig)方法初始化Servlet?,容器為該方法傳遞一個(gè)ServletConfig參數(shù),它包含Servlet初始化參數(shù)。之后,容器調(diào)用無(wú)參數(shù)的init(),完成初始化。init()在Servlet生命周期中僅被調(diào)用一次。可以在Web容器啟動(dòng)時(shí)將Servlet加載到容器中并初始化,這稱為預(yù)初始化??梢允褂聾WebServlet注解的loadOnStartup屬性或web.xml文件的<load-on-startup>元素指定當(dāng)容器啟動(dòng)時(shí)加載并初始化Servlet。有時(shí),不在容器啟動(dòng)時(shí)對(duì)Servlet初始化,而是當(dāng)容器接收到對(duì)該Servlet第一次請(qǐng)求時(shí)才對(duì)它初始化,這稱為延遲加載(lazyloading)。這種初始化的優(yōu)點(diǎn)是可以大大加快容器的啟動(dòng)速度。但缺點(diǎn)是,如果在Servlet初始化時(shí)要完成很多任務(wù)(如從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)),則發(fā)送第一個(gè)請(qǐng)求的客戶等待時(shí)間會(huì)很長(zhǎng)。演示或觀看教學(xué)視頻2.2.3為客戶提供服務(wù)在Servlet實(shí)例正常初始化后,它就準(zhǔn)備為客戶提供服務(wù)?。用戶通過(guò)單擊超鏈接或提交表單向容器請(qǐng)求訪問(wèn)Servlet。當(dāng)容器接收到對(duì)Servlet的請(qǐng)求時(shí),容器根據(jù)請(qǐng)求中的URL找到正確的Servlet,首先創(chuàng)建兩個(gè)對(duì)象,一個(gè)是HttpServletRequest請(qǐng)求對(duì)象,一個(gè)是HttpServletResponse響應(yīng)對(duì)象。然后創(chuàng)建一個(gè)新的線程,在該線程中調(diào)用service(),同時(shí)將請(qǐng)求對(duì)象和響應(yīng)對(duì)象作為參數(shù)傳遞給該方法。顯然,有多少個(gè)請(qǐng)求,容器將創(chuàng)建多少個(gè)線程。接下來(lái)service()將檢查HTTP請(qǐng)求的類型(GET,POST等)來(lái)決定調(diào)用Servlet的doGet()或doPost()方法。Servlet使用響應(yīng)對(duì)象(response)獲得輸出流對(duì)象,調(diào)用有關(guān)方法將響應(yīng)發(fā)送給客戶瀏覽器。之后,線程將被銷毀或者返回到容器管理的線程池。請(qǐng)求和響應(yīng)對(duì)象已經(jīng)離開(kāi)其作用域,也將被銷毀。最后客戶得到響應(yīng)。2.2.4銷毀和卸載Servlet當(dāng)容器決定不再需要Servlet實(shí)例時(shí),它將在Servlet實(shí)例上調(diào)用destroy()方法,Servlet在該方法中釋放資源?,如它在init()中獲得的數(shù)據(jù)庫(kù)連接。一旦該方法被調(diào)用,Servlet實(shí)例不能再提供服務(wù)。Servlet實(shí)例從該狀態(tài)僅能進(jìn)入卸載狀態(tài)。在調(diào)用destroy()之前,容器會(huì)等待其他執(zhí)行Servlet的service()的線程結(jié)束。一旦Servlet實(shí)例被銷毀,它將作為垃圾被回收。如果Web容器關(guān)閉,Servlet也將被銷毀和卸載。課堂互動(dòng)與討論1、下面不屬于Servlet生命周期方法的是()。A.publicvoiddestroy()B.publicvoidservice()C.publicServletConfiggetServletConfig()D.publicvoidinit()2、要使向服務(wù)器發(fā)送的數(shù)據(jù)不在瀏覽器的地址欄中顯示,應(yīng)該使用()方法。A.POSTB.GETC.PUTD.HEAD3、GET請(qǐng)求和POST請(qǐng)求有什么異同?作業(yè)預(yù)習(xí)一、知識(shí)點(diǎn)總結(jié)1.Servlet的執(zhí)行過(guò)程和生命周期。2.能夠創(chuàng)建并運(yùn)行Servlet類。二、課后作業(yè)1.登錄本書在線作業(yè)網(wǎng)站,完成本章作業(yè)題目。地址:/2.編寫一個(gè)名為MyFirstServlet的Servlet,覆蓋它的doGet()方法,當(dāng)請(qǐng)求該Servlet時(shí),瀏覽器輸出一句話和當(dāng)前的日期,如圖所示。教學(xué)反思《JavaWeb編程技術(shù)》教案第03講處理請(qǐng)求和發(fā)送響應(yīng)2學(xué)時(shí)110分鐘章節(jié)內(nèi)容第2章JavaServlet技術(shù)2.3處理請(qǐng)求2.3.1HTTP請(qǐng)求結(jié)構(gòu)2.3.2發(fā)送HTTP請(qǐng)求2.3.3處理HTTP請(qǐng)求2.3.4請(qǐng)求參數(shù)傳遞與獲取2.3.5請(qǐng)求轉(zhuǎn)發(fā)2.3.6用請(qǐng)求對(duì)象共享數(shù)據(jù)2.3.7檢索客戶端信息2.3.8檢索請(qǐng)求頭信息教學(xué)目標(biāo)了解請(qǐng)求的協(xié)議。掌握請(qǐng)求消息。重點(diǎn)掌握請(qǐng)求參數(shù)傳遞與獲取。重點(diǎn)難點(diǎn)重點(diǎn):掌握請(qǐng)求參數(shù)傳遞與獲取。難點(diǎn):請(qǐng)求參數(shù)傳遞與獲取,請(qǐng)求轉(zhuǎn)發(fā)。教學(xué)環(huán)節(jié)教學(xué)方法及其它說(shuō)明事項(xiàng)1.采用講授法、演示法、討論法。2.案例+項(xiàng)目式教學(xué)。3.采用線上線下混合教學(xué)模式。配套線上課程地址:/detail/2182465434.軟件環(huán)境:Windows10,JDK16以上,Eclipse2020以上。導(dǎo)言或復(fù)習(xí)HTTP是基于請(qǐng)求和響應(yīng)的協(xié)議。請(qǐng)求和響應(yīng)是HTTP最重要的內(nèi)容。HTTP消息是客戶向服務(wù)器的請(qǐng)求或者服務(wù)器向客戶的響應(yīng)。請(qǐng)求消息和響應(yīng)消息的格式是類似的。在服務(wù)器端,Servlet對(duì)請(qǐng)求處理完后,通常需要向客戶發(fā)回響應(yīng)。如果需要直接向客戶發(fā)送響應(yīng),需要使用輸出流對(duì)象。也可以將響應(yīng)重定向到其他資源。講授內(nèi)容2.3處理請(qǐng)求2.3.1HTTP請(qǐng)求結(jié)構(gòu)由客戶向服務(wù)器發(fā)出的消息稱HTTP請(qǐng)求(HTTPrequest),一個(gè)HTTP請(qǐng)求通常包括請(qǐng)求行、請(qǐng)求頭和請(qǐng)求數(shù)據(jù)。下圖是一個(gè)典型的POST請(qǐng)求。2.3.2發(fā)送HTTP請(qǐng)求在客戶端發(fā)生下面的事件,瀏覽器就向Web服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求。(1)用戶在瀏覽器的地址欄中輸入U(xiǎn)RL并按回車鍵。(2)用戶點(diǎn)擊了HTML頁(yè)面中的超鏈接。(3)用戶在HTML頁(yè)面中填寫一個(gè)表單并提交。在上面的三種方法中,前兩種方法向Web服務(wù)器發(fā)送的都是GET請(qǐng)求。如果使用頁(yè)面表單發(fā)送請(qǐng)求可以通過(guò)method屬性指定使用GET請(qǐng)求或POST請(qǐng)求。2.3.3處理HTTP請(qǐng)求在HttpServlet類中,針對(duì)每個(gè)HTTP方法定義了相應(yīng)的請(qǐng)求處理方法,比如要處理GET請(qǐng)求,應(yīng)該覆蓋下面的doGet()方法,格式如下:protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException;所有的請(qǐng)求處理方法都有兩個(gè)參數(shù):HttpServletRequest對(duì)象和HttpServletResponse對(duì)象。處理不同的HTTP請(qǐng)求應(yīng)使用不同的方法,它們的對(duì)應(yīng)關(guān)系如表2-3所示。表2-3HTTP方法及相應(yīng)的處理方法HTTP方法HttpServlet方法HTTP方法HttpServlet方法GETdoGet()DELETEdoDelete()POSTdoPost()OPTIONSdoOptions()HEADdoHead()TRACEdoTrace()PUTdoPut()演示2.3.4請(qǐng)求參數(shù)傳遞與獲取請(qǐng)求參數(shù)(requestparameter)是隨請(qǐng)求一起發(fā)送到服務(wù)器的數(shù)據(jù),它們是以“名/值”對(duì)的形式發(fā)送。從客戶端向服務(wù)器端傳遞請(qǐng)求參數(shù)一般有下面兩種方法。1、通過(guò)查詢串傳遞請(qǐng)求參數(shù)查詢串(querystring)是附加在請(qǐng)求URL后面的數(shù)據(jù),使用一個(gè)問(wèn)號(hào)(?)分隔,問(wèn)號(hào)后面為請(qǐng)求參數(shù)名和參數(shù)值對(duì),參數(shù)名和參數(shù)值之間用等號(hào)(=)分隔。2.通過(guò)表單域傳遞請(qǐng)求參數(shù)通過(guò)表單域指定請(qǐng)求參數(shù),每個(gè)表單域可以傳遞一個(gè)請(qǐng)求參數(shù),這種方法適用于GET請(qǐng)求和POST請(qǐng)求。下面是一個(gè)登錄頁(yè)面,通過(guò)表單提供用戶名(username)和密碼(password)兩個(gè)請(qǐng)求參數(shù),然后在Servlet中檢索參數(shù)并驗(yàn)證,最后向用戶發(fā)送驗(yàn)證消息。清單2.1login.html<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>登錄頁(yè)面</title>?</head>?<body><formaction="user-login"method="post"><fieldset>?<legend>用戶登錄</legend>?<p><label>用戶名:<inputtype="text"name="username"/></label>?</p>?<p><label>密 碼:<inputtype="password"name="password"/></label></p><p><label><inputtype="submit"value="登錄"/><inputtype="reset"value="取消"/></label></p></fieldset></form></body></html>客戶發(fā)送給服務(wù)器的請(qǐng)求信息被封裝在HttpServletRequest對(duì)象中,其中包含了由瀏覽器發(fā)送給服務(wù)器的數(shù)據(jù),這些數(shù)據(jù)包括請(qǐng)求參數(shù)、客戶端有關(guān)信息等??梢允褂肧ervletRequest接口中定義的方法檢索這些參數(shù),下面是與檢索請(qǐng)求參數(shù)有關(guān)的方法。publicStringgetParameter(String
name):返回由name指定的請(qǐng)求參數(shù)值,如果指定的參數(shù)不存在,則返回null值。若指定的參數(shù)存在,用戶沒(méi)有提供值,則返回空字符串。使用該方法必須保證指定的參數(shù)值只有一個(gè)。publicString[]getParameterValues(String
name):返回指定參數(shù)name所包含的所有值,返回值是一個(gè)String數(shù)組。如果指定的參數(shù)不存在,則返回null值。該方法適用于參數(shù)有多個(gè)值的情況。如果參數(shù)只有一個(gè)值,則返回的數(shù)組的長(zhǎng)度為1。除上述兩個(gè)方法外,ServletRequest接口還定義了getParameterNames()方法,它返回一個(gè)包含所有請(qǐng)求參數(shù)名的Enumeration枚舉對(duì)象,還有一個(gè)getParameterMap()方法,返回一個(gè)包含所有請(qǐng)求參數(shù)的Map對(duì)象。清單2.2的LoginServlet.java檢索表單提交的數(shù)據(jù)(請(qǐng)求參數(shù)),驗(yàn)證數(shù)據(jù)并向用戶發(fā)回響應(yīng)消息。清單2.2LoginServlet.javapackagecom.boda.xy;importjava.io.*;importjakarta.servlet.*;importjakarta.servlet.http.*;importjakarta.servlet.annotation.WebServlet;@WebServlet(name="loginServlet",value={"/user-login"})publicclassLoginServletextendsHttpServlet{publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)?throwsServletException,IOException{?Stringusername=request.getParameter("username");Stringpassword=request.getParameter("password");response.setContentType("text/html;charset=UTF-8");PrintWriterout=response.getWriter();out.println("<!DOCTYPEhtml>");out.println("<html><head><title>用戶登錄</title>");out.println("</head><body>");if("admin".equals(username)&&"123456".equals(password)){?out.println("登錄成功!歡迎您,"+username);?}else{out.println("對(duì)不起!您的用戶名或密碼不正確.");}out.println("</body></html>");}}程序首先通過(guò)請(qǐng)求對(duì)象request的getParameter()方法獲取用戶輸入的用戶名(username)和口令(password)?。為了方便假設(shè)用戶輸入的用戶名為“admin”、口令為“123456”時(shí)認(rèn)為驗(yàn)證成功,顯示登錄成功的消息?。在實(shí)際應(yīng)用中,用戶名和口令信息通常需要從數(shù)據(jù)庫(kù)中讀取。訪問(wèn)login.html頁(yè)面,顯示結(jié)果如圖2-6所示。輸入用戶名和口令,提交表單,請(qǐng)求將由LoginServlet處理,它從請(qǐng)求對(duì)象(request)中讀取兩個(gè)參數(shù)值,并顯示有關(guān)結(jié)果。圖2-6login.html頁(yè)面運(yùn)行結(jié)果在LoginServlet類中僅覆蓋了doPost(),這樣該Servlet只能處理POST請(qǐng)求,不能處理GET請(qǐng)求。如果將login.html中form元素的method屬性修改為“get”,該程序不能正常運(yùn)行。如果希望該Servlet既能處理POST請(qǐng)求,又能處理GET請(qǐng)求,可以添加下面的doGet(),并在其中調(diào)用doPost(),如下所示。publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doPost(request,response);講授內(nèi)容2.3.5請(qǐng)求轉(zhuǎn)發(fā)在實(shí)際應(yīng)用中Servlet對(duì)請(qǐng)求處理后可能不直接向客戶發(fā)回響應(yīng),而是根據(jù)需要將控制轉(zhuǎn)到其他資源(Servlet或JSP/HTML頁(yè)面)。例如,對(duì)于一個(gè)登錄系統(tǒng),如果用戶輸入了正確的用戶名和口令,LoginServlet應(yīng)該將請(qǐng)求轉(zhuǎn)發(fā)到歡迎頁(yè)面,否則應(yīng)將請(qǐng)求轉(zhuǎn)發(fā)到登錄頁(yè)面或錯(cuò)誤頁(yè)面。這就是請(qǐng)求轉(zhuǎn)發(fā)(requestforward)。為實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā),需要用請(qǐng)求對(duì)象的getRequestDispatcher()得到RequestDispatcher對(duì)象,該對(duì)象稱為請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象,該方法的格式如下。RequestDispatchergetRequestDispatcher(Stringpath)參數(shù)path用來(lái)指定要轉(zhuǎn)發(fā)到的資源路徑。它可以是絕對(duì)路徑,即以“/”開(kāi)頭,它被解釋為相對(duì)于當(dāng)前應(yīng)用程序的文檔根目錄,也可以是相對(duì)路徑,即不以“/”開(kāi)頭,它被解釋為相對(duì)于當(dāng)前資源所在的目錄。RequestDispatcher接口定義了下面兩個(gè)方法:publicvoidforward(ServletRequestrequest,ServletResponseresponse):將請(qǐng)求轉(zhuǎn)發(fā)到服務(wù)器上的另一個(gè)動(dòng)態(tài)或靜態(tài)資源(如Servlet、JSP頁(yè)面或HTML頁(yè)面)。該方法只能在響應(yīng)沒(méi)有被提交情況下調(diào)用,否則將拋出IllegalStateException異常。publicvoidinclude(ServletRequestrequest,ServletResponseresponse):將控制轉(zhuǎn)發(fā)到指定的資源,并將其輸出包含到當(dāng)前輸出中。這種控制的轉(zhuǎn)移是“暫時(shí)”的,目標(biāo)資源執(zhí)行完后,控制再轉(zhuǎn)回當(dāng)前資源接著處理請(qǐng)求完成服務(wù)。下面代碼創(chuàng)建轉(zhuǎn)發(fā)器RequestDispatcher對(duì)象,并將控制轉(zhuǎn)發(fā)到welcome.jsp頁(yè)面。RequestDispatcherrd=request.getRequestDispatcher("/welcome.jsp");rd.forward(request,response);2.3.6用請(qǐng)求對(duì)象共享數(shù)據(jù)可以使用請(qǐng)求對(duì)象共享數(shù)據(jù)。請(qǐng)求對(duì)象是一個(gè)作用域(scope)對(duì)象,可以在其上存儲(chǔ)屬性實(shí)現(xiàn)數(shù)據(jù)共享。屬性(attribute)包括屬性名和屬性值。屬性名是一個(gè)字符串,屬性值是一個(gè)對(duì)象。有關(guān)屬性存儲(chǔ)的方法有4個(gè),它們定義在ServletRequest接口中。publicvoidsetAttribute(Stringname,Objectobj):將指定名稱name的對(duì)象obj作為屬性值存儲(chǔ)到請(qǐng)求對(duì)象中。publicObjectgetAttribute(Stringname):返回請(qǐng)求對(duì)象中存儲(chǔ)的指定名稱的屬性值,如果指定名稱的屬性不存在,返回null。使用該方法在必要時(shí)需要作類型轉(zhuǎn)換。publicEnumerationgetAttributeNames():返回一個(gè)Enumeration對(duì)象,它是請(qǐng)求對(duì)象中包含的所有屬性名的枚舉。publicvoidremoveAttribute(Stringname):從請(qǐng)求對(duì)象中刪除指定名稱的屬性。演示清單2.3修改后的LoginServlet.javapackagecom.boda.xy;importjava.io.*;importjakarta.servlet.*;importjakarta.servlet.http.*;importjakarta.servlet.annotation.WebServlet;@WebServlet(name="loginServlet",value={"/user-login"})publicclassLoginServletextendsHttpServlet{publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringusername=request.getParameter("username");Stringpassword=request.getParameter("password");//用戶名和口令正確,認(rèn)為登錄成功StringdispatchUrl=null;if(username.equals("admin")&&password.equals("123456")){request.setAttribute("username",username);??dispatchUrl="/welcome.jsp";??}else{?dispatchUrl="/error.jsp";?}RequestDispatcherrd=request.getRequestDispatcher(dispatchUrl);rd.forward(request,response);}}該程序仍然使用清單2.3的login.html頁(yè)面輸入用戶名和口令,單擊“登錄”按鈕,將請(qǐng)求發(fā)送到LoginServlet,如果輸入的用戶名和口令正確,則將用戶名存儲(chǔ)到請(qǐng)求對(duì)象request中?,然后指定將請(qǐng)求轉(zhuǎn)發(fā)到的資源welcome.jsp頁(yè)面?,如果用戶名或口令不正確,則將請(qǐng)求轉(zhuǎn)發(fā)到error.jsp頁(yè)面?。下面是welcome.jsp頁(yè)面的代碼。清單2.4welcome.jsp<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>登錄成功</title></head><body><h4>登錄成功!歡迎您,${username}!</h4></body></html>該頁(yè)面使用了JSP表達(dá)式語(yǔ)言(${username})檢索請(qǐng)求對(duì)象中關(guān)聯(lián)的屬性(username)。關(guān)于JSP表達(dá)式語(yǔ)言將在第4章討論。下面是error.jsp頁(yè)面的代碼。清單2.5error.jsp<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>錯(cuò)誤頁(yè)面</title></head><body><imgalt=""src="images\error.png"><p>對(duì)不起,您的用戶名或口令錯(cuò)誤!</p><ahref="login.html">返回登錄頁(yè)面</a></body></html>自學(xué),觀看視頻2.3.7檢索客戶端信息在HttpServletRequest接口中還定義了下面常用的方法用來(lái)檢索客戶端有關(guān)信息:publicStringgetMethod():返回請(qǐng)求使用的HTTP方法名,如GET、POST或PUT等。publicStringgetRemoteHost():返回客戶端的主機(jī)名。如果容器不能解析主機(jī)名,將返回點(diǎn)分十進(jìn)制形式的IP地址。publicStringgetRemoteAddr():返回客戶端的IP地址。publicintgetRemotePort():返回客戶端IP地址的端口號(hào)。publicStringgetProtocol():返回客戶使用的請(qǐng)求協(xié)議名和版本,如HTTP/1.1。publicStringgetRequestURI():返回請(qǐng)求行中URL的查詢串前面的部分。publicStringgetContentPath():返回請(qǐng)求的上下文路徑。publicStringgetQueryString():返回請(qǐng)求行中URL的查詢串的內(nèi)容。publicStringgetContentType():返回請(qǐng)求體的MIME類型。publicStringgetCharacterEncoding():返回客戶請(qǐng)求的編碼方式。如圖2-7所示。圖2-7ClientInfoServlet的運(yùn)行結(jié)果2.3.8檢索請(qǐng)求頭信息HTTP請(qǐng)求頭是隨請(qǐng)求一起發(fā)送到服務(wù)器的信息,它是以“名/值”對(duì)的形式發(fā)送。例如,關(guān)于瀏覽器的信息就是通過(guò)User-Agent請(qǐng)求頭發(fā)送的。在服務(wù)器端可以調(diào)用請(qǐng)求對(duì)象的getHeader("User-Agent")得到瀏覽器的信息。表2-4中列出了常用的請(qǐng)求頭名。表2-4HTTP的常用請(qǐng)求頭請(qǐng)求頭內(nèi)容User-Agent關(guān)于瀏覽器和它的平臺(tái)的信息Accept客戶能接受并處理的MIME類型Accept-Charset客戶可以接受的字符集Accept-Encoding客戶能處理的頁(yè)面編碼的方法Accept–Language客戶能處理的語(yǔ)言Host服務(wù)器的DNS名字Authorization訪問(wèn)密碼保護(hù)的Web頁(yè)面時(shí),客戶用這個(gè)請(qǐng)求頭來(lái)標(biāo)識(shí)自己的身份Cookie將一個(gè)以前設(shè)置的Cookie送回服務(wù)器Date消息被發(fā)送的日期和時(shí)間Connection指示連接是否支持持續(xù)連接,值Keep-Alive表示支持持續(xù)連接結(jié)果如圖2-8所示。圖2-8ShowHeadersServlet的運(yùn)行結(jié)果課堂互動(dòng)與討論1、有一個(gè)URL,/hello-servlet?username=Smith,問(wèn)號(hào)后面的內(nèi)容稱為()。A.請(qǐng)求參數(shù)B.查詢串C.請(qǐng)求URID.響應(yīng)數(shù)據(jù)2、將一個(gè)Student類的對(duì)象student用名稱studobj存儲(chǔ)到請(qǐng)求作用域中,下面代碼正確的是()。A.request.setAttribute("student",studobj)B.request.addAttribute("student",studobj)C.request.setAttribute("studobj",student)D.request.getAttribute("studobj",student)3、在Servlet中如果需要獲得一個(gè)頁(yè)面的表單中的請(qǐng)求參數(shù),又不知道參數(shù)名時(shí)如何做?總結(jié)課后作業(yè)知識(shí)點(diǎn)總結(jié)、1、HTTP請(qǐng)求結(jié)構(gòu)、發(fā)送HTTP請(qǐng)求、處理HTTP請(qǐng)求、請(qǐng)求參數(shù)傳遞與獲取、請(qǐng)求轉(zhuǎn)發(fā)。2、用請(qǐng)求對(duì)象共享數(shù)據(jù)、檢索客戶端信息、檢索請(qǐng)求頭信息。二、課后作業(yè)1.登錄本書在線作業(yè)網(wǎng)站,完成本章作業(yè)題目。地址:/2.完成下面的綜合應(yīng)用,其運(yùn)行結(jié)果如圖2-18和2-19所示。(1)創(chuàng)建JSP頁(yè)面input.jsp,其中包括一個(gè)表單,表單中包含兩個(gè)文本域,分別供用戶輸入學(xué)號(hào)和姓名,該頁(yè)面也包含提交和重置按鈕。(2)定義com.boda.xy.Student類,其中包括學(xué)號(hào)id和姓名name兩個(gè)private的成員變量,為id和name定義訪問(wèn)方法和修改方法。(3)編寫名為FirstServlet的Servlet,要求當(dāng)用戶在input.jsp中輸入信息后點(diǎn)擊“登錄”按鈕,請(qǐng)求FirstServlet對(duì)其處理。在FirstServlet中使用表單傳遞的參數(shù)(學(xué)號(hào)和姓名)創(chuàng)建一個(gè)Student對(duì)象并將其作為屬性存儲(chǔ)在請(qǐng)求對(duì)象中,然后通過(guò)請(qǐng)求對(duì)象的getRequestDispatcher()獲得RequestDispatcher對(duì)象,將請(qǐng)求轉(zhuǎn)發(fā)到SecondServlet。(4)在SecondServlet中取出請(qǐng)求對(duì)象上存儲(chǔ)的Student對(duì)象,并顯示輸出該學(xué)生的學(xué)號(hào)和姓名。在SecondServlet的輸出中應(yīng)該包含一個(gè)超鏈接,點(diǎn)擊該連接可以返回input.jsp頁(yè)面。圖2-18input.jsp頁(yè)面顯示結(jié)果圖2-19SecondServlet顯示結(jié)果教學(xué)反思
《JavaWeb編程技術(shù)》教案第04講發(fā)送響應(yīng)2學(xué)時(shí)110分鐘章節(jié)內(nèi)容第2章JavaServlet技術(shù)2.4發(fā)送響應(yīng)2.5案例學(xué)習(xí):表單數(shù)據(jù)處理教學(xué)目標(biāo)重點(diǎn)掌握發(fā)送響應(yīng)掌握表單數(shù)據(jù)處理重點(diǎn)難點(diǎn)重點(diǎn):掌握發(fā)送響應(yīng)。難點(diǎn):發(fā)送響應(yīng)。教學(xué)環(huán)節(jié)教學(xué)方法及其它說(shuō)明事項(xiàng)1.采用講授法、演示法、討論法。2.案例+項(xiàng)目式教學(xué)。3.采用線上線下混合教學(xué)模式。配套線上課程地址:/detail/2182465434.軟件環(huán)境:Windows10,JDK16以上,Eclipse2020以上。導(dǎo)言或復(fù)習(xí)在服務(wù)器端,Servlet對(duì)請(qǐng)求處理完后,通常需要向客戶發(fā)回響應(yīng)。如果需要直接向客戶發(fā)送響應(yīng),需要使用輸出流對(duì)象。也可以將響應(yīng)重定向到其他資源。講授內(nèi)容2.4發(fā)送響應(yīng)2.4.1HTTP響應(yīng)結(jié)構(gòu)由服務(wù)器向客戶發(fā)送的HTTP消息稱為HTTP響應(yīng)(HTTPresponse),圖2-11所示為一個(gè)典型的HTTP響應(yīng)消息。從圖中可以看到,HTTP響應(yīng)也由三部分組成:狀態(tài)行、響應(yīng)頭和響應(yīng)的數(shù)據(jù)。2.4.2輸出流與內(nèi)容類型Servlet使用輸出流向客戶發(fā)送響應(yīng)。調(diào)用響應(yīng)對(duì)象的getWriter()可以得到PrintWriter對(duì)象,使用它可向客戶發(fā)送文本數(shù)據(jù)。通常,在發(fā)送響應(yīng)數(shù)據(jù)之前還需通過(guò)響應(yīng)對(duì)象的setContentType()設(shè)置響應(yīng)的內(nèi)容類型。publicPrintWritergetWriter():返回一個(gè)PrintWriter對(duì)象用于向客戶發(fā)送文本數(shù)據(jù)。publicServletOutputStreamgetOutputStream()throwsIOException:返回一個(gè)輸出流對(duì)象,它用來(lái)向客戶發(fā)送二進(jìn)制數(shù)據(jù)。publicvoidsetContentType(Stringtype):設(shè)置發(fā)送到客戶端響應(yīng)的MIME內(nèi)容類型。演示2.4.3響應(yīng)重定向Servlet在對(duì)請(qǐng)求進(jìn)行分析后,可能不直接向?yàn)g覽器發(fā)送響應(yīng),而是向?yàn)g覽器發(fā)送一個(gè)Location響應(yīng)頭,告訴瀏覽器訪問(wèn)其他資源,這稱為響應(yīng)重定向。響應(yīng)重定向是通過(guò)響應(yīng)對(duì)象的sendRedirect()實(shí)現(xiàn),格式如下:publicvoidsendRedirect(Stringlocation)該方法向客戶發(fā)送一個(gè)重定向的響應(yīng),參數(shù)location為新的資源的URL,該URL可以是絕對(duì)URL(如),也可以是相對(duì)URL。若相對(duì)路徑以“/”開(kāi)頭,則相對(duì)于服務(wù)器根目錄(如,/helloweb/login.html),若不以“/”開(kāi)頭,則相對(duì)于Web應(yīng)用程序的文檔根目錄(如,login.jsp)。下面程序是一個(gè)使用sendRedirect()重定向請(qǐng)求的例子。清單2.9RedirectServlet.javapackagecom.boda.xy;importjava.io.*;importjakarta.servlet.*;importjakarta.servlet.http.*;importjakarta.servlet.annotation.*;@WebServlet(name="sendRedirect",value={"/send-redirect"})publicclassRedirectServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse) throwsIOException,ServletException{StringuserAgent=request.getHeader("User-Agent"); //在請(qǐng)求對(duì)象上存儲(chǔ)一個(gè)屬性request.setAttribute("param1","請(qǐng)求作用域?qū)傩?); //在會(huì)話對(duì)象上存儲(chǔ)一個(gè)屬性 HttpSessionsession=request.getSession();session.setAttribute("param2","會(huì)話作用域?qū)傩?); if((userAgent!=null)&&(userAgent.indexOf("Chrome")!=-1)){ response.sendRedirect("welcome.jsp");}else{response.sendRedirect("/"); } }}自學(xué)或觀看視頻2.4.4設(shè)置響應(yīng)頭響應(yīng)頭是隨響應(yīng)數(shù)據(jù)一起發(fā)送到瀏覽器的附加信息。每個(gè)響應(yīng)頭通過(guò)“名/值”對(duì)的形式發(fā)送到客戶端。例如,可以使用一個(gè)響應(yīng)頭告訴瀏覽器每隔一定時(shí)間重新裝載一次頁(yè)面,或者指定瀏覽器對(duì)頁(yè)面緩存多長(zhǎng)時(shí)間。在HttpServletResponse接口中定義了如下有關(guān)響應(yīng)頭管理的方法。publicvoidsetHeader(Stringname,Stringvalue):將指定名稱的響應(yīng)頭設(shè)置為指定的值。publicvoidsetIntHeader(Stringname,intvalue):用給定的名稱和整數(shù)值設(shè)置響應(yīng)頭。publicvoidsetDateHeader(Stringname,longdate):用給定的名稱和日期值設(shè)置響應(yīng)頭。publicvoidaddHeader(Stringname,Stringvalue):用給定的名稱和值添加響應(yīng)頭。publicvoidaddIntHeader(Stringname,intvalue):用給定的名稱和整數(shù)值添加響應(yīng)頭。publicvoidaddDateHeader(Stringname,longdate):用給定的名稱和日期值添加響應(yīng)頭。publicbooleancontainsHeader(Stringname):返回是否已經(jīng)設(shè)置指定的響應(yīng)頭。2.4.5發(fā)送狀態(tài)碼服務(wù)器向客戶發(fā)送的響應(yīng)的第一行是狀態(tài)行,它由三部分組成:HTTP版本、狀態(tài)碼和狀態(tài)碼的描述信息。表2-7狀態(tài)碼的分類狀態(tài)碼范圍含義示例100~199表示信息100表示服務(wù)器同意處理客戶的請(qǐng)求200~299表示請(qǐng)求成功200表示請(qǐng)求成功,204表示內(nèi)容不存在300~399表示重定向301表示頁(yè)面移走了,304表示緩存的頁(yè)面仍然有效400~499表示客戶的錯(cuò)誤403表示禁止的頁(yè)面,404表示頁(yè)面沒(méi)有找到500~599表示服務(wù)器的錯(cuò)誤500表示服務(wù)器內(nèi)部錯(cuò)誤,503表示以后再試案例2.5案例學(xué)習(xí):表單數(shù)據(jù)處理2.5.1常用表單控件元素表單使用<form>元素創(chuàng)建,一般格式如下:<formaction="user-register"method="post">…</form>action屬性指定處理表單數(shù)據(jù)的服務(wù)器端程序。如果Servlet或JSP頁(yè)面和HTML表單位于同一服務(wù)器上,那么在action屬性中應(yīng)使用相對(duì)URL。method屬性指定數(shù)據(jù)如何傳輸?shù)椒?wù)器,它的取值可為“post”或“get”。在使用“get”時(shí)發(fā)送GET請(qǐng)求,使用“post”發(fā)送POST請(qǐng)求。1.文本控件2.按鈕控件3.單選按鈕和復(fù)選框4.組合框和列表框5.HTML5新增的字段2.5.2表單數(shù)據(jù)處理本節(jié)創(chuàng)建一個(gè)名為register.html頁(yè)面,其中包含多種表單控件,訪問(wèn)該頁(yè)面運(yùn)行結(jié)果如圖2-9所示。圖2-9register.html頁(yè)面運(yùn)行結(jié)果清單2.12register.html<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>用戶注冊(cè)頁(yè)面</title></head><body><h4>用戶注冊(cè)頁(yè)面</h4><formaction="user-register"method="post"><table><tr><td>用戶名:</td><td><inputtype="text"name="username"size="15"></td></tr><tr><td>密碼:</td><td><inputtype="password"name="password"size="16"></td></tr><tr><td>性別:</td><td><inputtype="radio"name="sex"value="male">男<inputtype="radio"name="sex"value="female">女</td></tr><tr><td>年齡:</td><td><inputtype="number"name="age"size="5"></td></tr><tr><td>興趣:</td><td><inputtype="checkbox"name="hobby"value="read">文學(xué)<inputtype="checkbox"name="hobby"value="sport">體育<inputtype="checkbox"name="hobby"value="computer">電腦</td></tr><tr><td>學(xué)歷:</td><td><selectname="education"><optionvalue="bachelor">學(xué)士</option><optionvalue="master">碩士</option><optionvalue="doctor">博士</option></select></td></tr><tr><td>郵件地址:</td><td><inputtype="email"name="email"size="20"></td></tr><tr><td>簡(jiǎn)歷:</td><td><textareaname="resume"rows="5"cols="30"></textarea></td></tr><tr><td><inputtype="submit"name="submit"value="提交"></td><td><inputtype="reset"name="reset"value="重置"></td></tr></table></form></body></html>表單數(shù)據(jù)作為請(qǐng)求參數(shù)傳遞到服務(wù)器端,在服務(wù)器端的Servlet中通常使用請(qǐng)求對(duì)象的getParameter()方法和getParameterValues()方法獲取表單數(shù)據(jù)。當(dāng)控件只有一個(gè)值時(shí),使用getParameter()方法,當(dāng)控件有多個(gè)值時(shí)使用getParameterValues()方法。下面的FormServlet讀取register.html頁(yè)面?zhèn)鬟f來(lái)的請(qǐng)求參數(shù)并顯示用戶輸入信息。清單2.13FormServlet.javapackagecom.boda.xy;importjava.io.IOException;importjava.io.PrintWriter;importjakarta.servlet.ServletException;importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.HttpServlet;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;@WebServlet(name="formServlet",value={"/user-register"})publicclassFormServletextendsHttpServlet{privatestaticfinallongserialVersionUID=54L;privatestaticfinalStringTITLE="用戶信息";@OverridepublicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=UTF-8");PrintWriterout=response.getWriter();out.println("<!DOCTYPEhtml>");out.println("<html><head>");out.println("<metacharset=\"UTF-8\">");out.println("<title>"+TITLE+"</title></head>");out.println("</head>");out.println("<body><h4>"+TITLE+"</h4>");out.println("<table>");out.println("<tr><td>用戶名</td>");Stringusername=request.getParameter("username");out.println("<td>"+username+"</td></tr>");out.println("<tr><td>密碼:</td>");out.println("<td>"+request.getParameter("password")+"</td></tr>");out.println("<tr><td>性別:</td>");out.println("<td>"+request.getParameter("sex")+"</td></tr>");out.println("<tr><td>年齡:</td>");out.println("<td>"+request.getParameter("age")+"</td></tr>");
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026重慶兩江新區(qū)人民醫(yī)院招聘4人考試參考題庫(kù)及答案解析
- 2026遂寧大英農(nóng)商銀行寒假實(shí)習(xí)生招聘考試參考試題及答案解析
- 2026江蘇蘇州張家港農(nóng)商銀行寒假實(shí)習(xí)招募考試備考題庫(kù)及答案解析
- 2026云南西雙版納州中級(jí)人民法院第一次招聘聘用制審判輔助人員1人考試備考題庫(kù)及答案解析
- 2026江蘇中國(guó)藥科大學(xué)智能藥學(xué)交叉研究院工作人員招聘5人考試備考試題及答案解析
- 2026年甘肅省天水市清水縣秦亭鎮(zhèn)中心衛(wèi)生院編外人員招錄考試備考題庫(kù)及答案解析
- 2026年齊齊哈爾訥河市人民醫(yī)院招聘3人考試備考題庫(kù)及答案解析
- 2026陸軍工程大學(xué)社會(huì)招聘8人考試參考題庫(kù)及答案解析
- 2026年甘肅省承仁中醫(yī)藥研究所誠(chéng)聘醫(yī)護(hù)20人考試備考題庫(kù)及答案解析
- 2026湖南岳陽(yáng)市屈原管理區(qū)數(shù)據(jù)局編外人員招聘2人考試參考試題及答案解析
- 種雞免疫工作總結(jié)
- 河南省商丘市柘城縣2024-2025學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)試題(含答案)
- 教育機(jī)構(gòu)財(cái)務(wù)管理制度及報(bào)銷流程指南
- 給女朋友申請(qǐng)書
- 2023-2024學(xué)年北京市海淀區(qū)八年級(jí)上學(xué)期期末考試物理試卷含詳解
- 2024版房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)內(nèi)容解讀
- GB 21258-2024燃煤發(fā)電機(jī)組單位產(chǎn)品能源消耗限額
- 智能法理學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- JB∕T 13026-2017 熱處理用油基淬火介質(zhì)
- 人教版高一化學(xué)方程式大全
- 長(zhǎng)護(hù)險(xiǎn)護(hù)理培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論