教程揭秘 | 動(dòng)力節(jié)點(diǎn)內(nèi)部Java零基礎(chǔ)教學(xué)文檔第七篇:servlet(2)
接上期后續(xù)
本期分享第七章節(jié)
servlet
第二篇章
已經(jīng)分享過(guò)半了,你們都跟上了嗎?
每天都在學(xué)習(xí)嘛?
有什么不會(huì)的嘛?
今日教學(xué)文檔分享來(lái)了?

今日新篇章
【Servlet】
1.?工程結(jié)構(gòu)

2.?J2EE平臺(tái)
Java EE,Java平臺(tái)企業(yè)版(Java Platform Enterprise Edition),之前稱為Java 2 Platform, Enterprise Edition (J2EE),2018年3月更名為Jakarta EE。是Sun公司為企業(yè)級(jí)應(yīng)用推出的標(biāo)準(zhǔn)平臺(tái)。Java平臺(tái)共分為三個(gè)主要版本Java EE、Java SE和Java ME。
Sun公司在1998年發(fā)表JDK1.2版本的時(shí)候,使用了新名稱Java 2 Platform,即“Java2平臺(tái)”,修改后的JDK稱為Java 2 Platform Software Developing Kit,即J2SDK。并分為標(biāo)準(zhǔn)版(Standard Edition,J2SE),企業(yè)版(Enterprise Edition,J2EE),微型版(MicroEdition,J2ME)。J2EE便由此誕生。
2005年6月,JavaOne大會(huì)召開(kāi),SUN公司公開(kāi)Java SE 6。此時(shí),Java的各種版本已經(jīng)更名以取消其中的數(shù)字“2”:J2EE更名為Java EE, J2SE更名為Java SE,J2ME更名為Java ME。
隨著Java技術(shù)的發(fā)展,J2EE平臺(tái)得到了迅速的發(fā)展,成為Java語(yǔ)言中最活躍的體系之一?,F(xiàn)如今,J2EE不僅僅是指一種標(biāo)準(zhǔn)平臺(tái),它更多的表達(dá)著一種軟件架構(gòu)和設(shè)計(jì)思想。
?
2.1?J2EE平臺(tái)組件 ??
Java EE是一系列技術(shù)標(biāo)準(zhǔn)所組成的平臺(tái)(一系列規(guī)范),包括:
1.Applet - Java Applet
2.EJB - 企業(yè)級(jí)JavaBean(Enterprise Java Beans)
3.JAAS - Java Authentication and Authorization Service
4.JACC - J2EE Authorization Contract for Containers
5.JAF - Java Beans Activation Framework
6.JAX-RPC - Java API for XML-Based Remote Procedure Calls
7.JAX-WS - Java API for XML Web Services
8.JAXM - Java API for XML Messaging
9.JAXP - Java XML解析API(Java API for XML Processing)
10.JAXR - Java API for XML Registries
11.JCA - J2EE連接器架構(gòu)(J2EE Connector Architecture)
12.JDBC - Java數(shù)據(jù)庫(kù)聯(lián)接(Java Database Connectivity)
13.JMS - Java消息服務(wù)(Java Message Service)
14.JMX - Java Management
15.JNDI - Java名稱與目錄接口(Java Naming and Directory Interface)
16.JSF - Java Server Faces
17.JSP - Java服務(wù)器頁(yè)面(Java Server Pages)
18.JSTL - Java服務(wù)器頁(yè)面標(biāo)準(zhǔn)標(biāo)簽庫(kù)(Java Server Pages Standard Tag Library)
19.JTA - Java事務(wù)API(Java Transaction API)
20.JavaMail
21.Servlet - Java Servlet API
22.StAX - Streaming APIs for XML Parsers
23.WS - Web Services
3.?servlet
Servlet(Server Applet),全稱Java Servlet。是用Java編寫(xiě)的服務(wù)器端程序。其主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài)Web內(nèi)容。狹義的Servlet是指Java語(yǔ)言實(shí)現(xiàn)的一個(gè)接口,廣義的Servlet是指任何實(shí)現(xiàn)了這個(gè)Servlet接口的類,一般情況下,人們將Servlet理解為后者。
Servlet運(yùn)行于支持Java的應(yīng)用服務(wù)器中。從實(shí)現(xiàn)上講,Servlet可以響應(yīng)任何類型的請(qǐng)求,但絕大多數(shù)情況下Servlet只用來(lái)擴(kuò)展基于HTTP協(xié)議的Web服務(wù)器。
最早支持Servlet標(biāo)準(zhǔn)的是JavaSoft的Java Web Server。此后,一些其它的基于Java的Web服務(wù)器開(kāi)始支持標(biāo)準(zhǔn)的Servlet。
3.1?Servlet的作用
Servlet是服務(wù)端的一個(gè)小程序,程序其作用只有2個(gè):
3.1.1?獲取客戶的請(qǐng)求信息
Servlet獲取客戶端的請(qǐng)求信息,基于ServletRequest對(duì)象,ServletRequest的子接口: HttpServletRequest。
HttpServletRequest這個(gè)接口包含:客戶端的請(qǐng)求參數(shù),客戶端的請(qǐng)求頭信息。
3.1.2?向客戶端做出響應(yīng)
Servlet向客戶端做出響應(yīng),基于ServletResponse對(duì)象,ServletResponse的子接口:HttpServletResponse。
HttpServletResponse這個(gè)接口:獲取輸出流(字節(jié)流,字符流),向客戶端返回響應(yīng)頭信息。
3.2?Servlet的使用方式
3.2.1?創(chuàng)建Servlet的3個(gè)步驟
步驟? ? ? ??
導(dǎo)入servlet-api.jar
在tomcat的lib文件夾下也有此jar包,開(kāi)發(fā)過(guò)程中為防止報(bào)錯(cuò)需要導(dǎo)入,實(shí)際運(yùn)行時(shí)需要移除此jar包避免版本沖突。
自定義類繼承HttpServlet? ? ? ? ? ? ? ? ? ? ? ?繼承后,重寫(xiě)doGet、doPost方法。
配置虛擬路徑? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??1)可以通過(guò)注解配置 ???2)通過(guò)xml形式配置
3.2.2?使用注解形式
JavaWeb開(kāi)發(fā)中,Servlet開(kāi)發(fā)配置相對(duì)繁瑣。在web3.0之后,提供一些簡(jiǎn)化web配置的數(shù)據(jù),@WebServlet就可以取代在web.xml中對(duì)servlet的配置。
3.2.3?使用xml形式
?向服務(wù)器注冊(cè)這個(gè)Servlet,servlet是要提供服務(wù)的
?1.聲明/定義servlet類
?2.servlet提供服務(wù)訪問(wèn)方式
3.2.4?兩種配置形式區(qū)別
平時(shí)開(kāi)發(fā)中能用注解形式則用注解形式。但如果類是第3方的,由于我們不能去修改第3方的源代碼,無(wú)法在類上添加注解,則使用xml形式最為合適。例如:后期SpringMVC框架中的核心類DispatcherServlet就是使用的xml形式作為配置。
3.2.5?通過(guò)Servlet輸出html標(biāo)簽等富文本信息
3.3?為什么使用tomcat加載類,而不是使用JDK自帶的加載器加載
JDK自帶的類加載器3個(gè),雙親委派.bootstrap類加載器,加載JDK核心類.Ext 擴(kuò)展類加載器,加載默認(rèn)ext目錄相關(guān)類.application類加載器加載當(dāng)前項(xiàng)目的類.雙親委派加載機(jī)制,避免重復(fù)加載,其次為了安全.因?yàn)殚_(kāi)發(fā)者可以自定義類的包名,如果定義一個(gè)與系統(tǒng)包名同名的類,自定義的類會(huì)覆蓋系統(tǒng)的類,可能到導(dǎo)致系統(tǒng)不安全.但是如果tomcat也使用雙親為加載機(jī)制加載,會(huì)導(dǎo)致如果多個(gè)web項(xiàng)目,其中類的名臣完全相同,但是實(shí)現(xiàn)不同就出現(xiàn)覆蓋.tomcat通過(guò)打破雙親委派加載機(jī)制,做到了類在應(yīng)用級(jí)別隔離.
3.4?Servlet的生命周期(重點(diǎn))
Servlet的生命周期,是指Servlet的實(shí)例的創(chuàng)建到到銷毀的過(guò)程。
代碼示例:
Tomcat服務(wù)器在加載servlet類時(shí),默認(rèn)是不會(huì)創(chuàng)建對(duì)象的.只有在servlet實(shí)際被使用時(shí),才會(huì)去創(chuàng)建對(duì)象,tomcat提供了init方法,供開(kāi)發(fā)者進(jìn)行對(duì)象屬性的設(shè)置,所以該方法被稱之為對(duì)象初始化方法.
每次訪問(wèn)時(shí),具體的訪問(wèn)業(yè)務(wù),tomcat會(huì)將訪問(wèn)的數(shù)據(jù)進(jìn)行封裝,封裝為HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,然后調(diào)用service方法.
當(dāng)tomcat服務(wù)器停止時(shí),又會(huì)去調(diào)用destroy方法.開(kāi)發(fā)者,在這個(gè)方法中釋放資源,留遺書(shū).
init方法執(zhí)行一次,如果在配置中配置load-on-startup,則tomcat在啟動(dòng)時(shí)就會(huì)創(chuàng)建servlet對(duì)象,調(diào)用init方法.
service方法,會(huì)執(zhí)行多次,只有有請(qǐng)求就會(huì)執(zhí)行service方法.請(qǐng)求數(shù)據(jù)會(huì)被封裝到HttpServletRequest對(duì)象中,響應(yīng)數(shù)據(jù)會(huì)被封裝到HttpServletResponse對(duì)象中。
destroy,servlet對(duì)象銷毀方法,當(dāng)tomcat服務(wù)器停止時(shí)調(diào)用.可以釋放資源.
3.5?Servlet線程安全問(wèn)題
Servlet本質(zhì)是單例模式,如果存在多個(gè)并發(fā)請(qǐng)求,所有請(qǐng)求使用同一個(gè)對(duì)象,如果請(qǐng)求中使用了對(duì)象的成員變量,則可能出現(xiàn)數(shù)據(jù)不一致的情況,servlet是非線程安全的.
解決方案:
1.?不要在servlet使用成員變量.
2.?使用ThreadLocal,線程局部變量存儲(chǔ)當(dāng)前線程自己的數(shù)據(jù).
3.6?Servlet初始化參數(shù)配置
3.7?Servlet的Api
3.7.1?Servlet的請(qǐng)求Api
3.7.1.1?獲取請(qǐng)求行數(shù)據(jù)
3.7.1.2?請(qǐng)求頭數(shù)據(jù)
3.7.1.3?獲取網(wǎng)絡(luò)信息
3.7.1.4?請(qǐng)求參數(shù)
3.7.1.5?Servlet內(nèi)部轉(zhuǎn)發(fā)
Servlet內(nèi)部轉(zhuǎn)發(fā)是指當(dāng)前servlet將請(qǐng)求和響應(yīng)信息移交其他的servlet進(jìn)行處理.對(duì)于請(qǐng)求方而言,只需要請(qǐng)求一次,但是實(shí)際上經(jīng)歷多個(gè)具體servlet(具體次數(shù)要看實(shí)際的轉(zhuǎn)發(fā)次數(shù)).瀏覽器的URL地址不會(huì)發(fā)生變化,并且servlet之間可以進(jìn)行參數(shù)傳遞操作.
這種內(nèi)部轉(zhuǎn)發(fā)的方式,由于將請(qǐng)求對(duì)象進(jìn)行了傳遞,在實(shí)際開(kāi)發(fā)中使用的比較多的.但是又由于URL地址沒(méi)有發(fā)生變化,所以一旦瀏覽器進(jìn)行刷新操作,之前所有相關(guān)的程序會(huì)重新執(zhí)行.首先會(huì)導(dǎo)致無(wú)意義資源消耗,其次可能導(dǎo)致臟數(shù)據(jù).
能不使用內(nèi)部轉(zhuǎn)發(fā)就不要使用內(nèi)部轉(zhuǎn)發(fā).
3.7.2?Servlet的響應(yīng)Api
在servlet中,請(qǐng)求對(duì)象和響應(yīng)對(duì)象是成對(duì)出現(xiàn)的.哪怕沒(méi)有數(shù)據(jù)的響應(yīng)數(shù)據(jù),tomcat服務(wù)器會(huì)先為每一個(gè)請(qǐng)求對(duì)象創(chuàng)建相應(yīng)的響應(yīng)對(duì)象,只是響應(yīng)內(nèi)容默認(rèn)空的.在實(shí)際操作中,只需要向響應(yīng)對(duì)象中提供數(shù)據(jù)即可.
3.7.2.1?響應(yīng)對(duì)象的核心Api
HttpServletResponse核心api就是獲取輸出流.由于輸出的數(shù)據(jù)可能是字符串也可能是字節(jié).提供兩個(gè)方法,但是注意,兩個(gè)輸出流實(shí)際使用只能使用其中的一個(gè).
3.7.2.2?重定向和內(nèi)部轉(zhuǎn)發(fā)
3.7.2.3?向響應(yīng)頭添加數(shù)據(jù)
3.8?html與servlet相互跳轉(zhuǎn)總結(jié)
描述
html跳html
a標(biāo)簽、js(location.href=’xxx’)、form表單的action屬性
html跳servlet
a標(biāo)簽、js(location.href=’xxx’)、form表單的action屬性
servlet跳html
重定向:response.sendRedirect("/頁(yè)面路徑");
轉(zhuǎn)發(fā):request.getRequestDispatcher("/views/demo3.jsp").forward(request,response);
servlet跳servlet
推薦重定向
3.8.1?練習(xí)1
demo1.html---->點(diǎn)擊a標(biāo)簽----->demo2.html------>OneServlet------>TwoServlet----->demo3.html
3.8.2?練習(xí)2
demo1.html-------->不做任何點(diǎn)擊跳------->demo2.html------->點(diǎn)擊a標(biāo)簽------>demo3.html----->
不做任何點(diǎn)擊----->OneServlet---------->TwoServlet------->demo4.html----->點(diǎn)擊button按鈕---->跳demo1.html
?
3.9?用戶登錄案例
用戶在界面輸入用戶名和密碼,servlet接收用戶輸入的用戶名和密碼,與數(shù)據(jù)庫(kù)中的用戶信息進(jìn)行對(duì)比,如果用戶名和密碼都正確.跳轉(zhuǎn)到登錄成功頁(yè)面,否則返回登錄頁(yè)面.
3.9.1?技術(shù)點(diǎn)
前端界面:HTML.數(shù)據(jù)存儲(chǔ):mysql.訪問(wèn)數(shù)據(jù)庫(kù)使用JDBC.接收用戶數(shù)據(jù)使用servlet.
3.9.2?前期準(zhǔn)備
3.9.2.1?數(shù)據(jù)庫(kù)準(zhǔn)備
創(chuàng)建數(shù)據(jù)庫(kù)erp
創(chuàng)建用戶表user
?
3.9.3?導(dǎo)入相關(guān)jar包
mysql驅(qū)動(dòng)包
?

3.9.4?引入相關(guān)的工具類
3.9.4.1?數(shù)據(jù)庫(kù)配置文件
3.9.4.2?BaseDao
3.9.4.3?DButil
3.9.4.4?PageInfo
3.9.5?數(shù)據(jù)操作類-dao
3.9.5.1?UserDao
?
3.9.6?數(shù)據(jù)控制類-servlet
3.9.6.1?UserServlet
3.9.7?前端頁(yè)面
3.9.7.1?登錄頁(yè)面-index.html
?
3.9.7.2?登錄成功頁(yè)面-success.html

更多干貨我們下期再說(shuō)!
下期會(huì)分享
第七章節(jié)
servlet
第三篇章
相關(guān)知識(shí)~
下期見(jiàn)!
