作者簡(jiǎn)介:大家好,我是未央;
博客首頁(yè):未央.303
系列專(zhuān)欄:JavaEE進(jìn)階
每日一句:人的一生,可以有所作為的時(shí)機(jī)只有一次,那就是現(xiàn)在!??!
文章目錄
前言
一、前置知識(shí):Maven
1.1???初識(shí)Maven
1.2 ??Maven的使用
?二、Servlet
第一個(gè)Servlet程序:hello world
方法步驟:
2.1 創(chuàng)建maven項(xiàng)目
?2.2 引入依賴
?2.3 創(chuàng)建目錄結(jié)構(gòu)
2.4 編寫(xiě)servlet代碼
2.5 打包操作
?2.6?部署操作
2.7?驗(yàn)證程序
?2.8 一點(diǎn)相關(guān)補(bǔ)充
smart? tomato的使用
三、ServletAPI詳解
3.1?HttpServlet
3.2?HtttpServletRequest
3.3?HttpServletResponse
總結(jié)
前言
今天我們將進(jìn)入到Servlet的認(rèn)識(shí)當(dāng)中,Servlet對(duì)于我們后面項(xiàng)目的創(chuàng)建編寫(xiě)有著非常重要的作用,需要我們能夠非常熟練的掌握他;
一、前置知識(shí):Maven
1.1???初識(shí)Maven
Maven,這是我們?cè)诰帉?xiě)Servlet代碼的時(shí)候,要用到的一個(gè)常見(jiàn)的工具;
maven的介紹:
Maven, 是Java 世界中的一個(gè)非常知名的 “工程管理工具 / 構(gòu)建工具”。
Maven核心功能:
- 1、管理依賴
- 2、構(gòu)建 / 編譯
- 3、打包?
有的人可能會(huì)產(chǎn)生疑問(wèn):編譯,不是編譯器的工作嗎?和 Maven 有什么關(guān)系呢?
其實(shí) Maven 的 構(gòu)建 / 編譯,也是在調(diào)用 JDK 來(lái)去進(jìn)行 編譯 和 打包 的工作。
但是呢,如果你光用 JDK ,就好像是:
執(zhí)行這個(gè)操作,你去進(jìn)行編譯。
執(zhí)行下一個(gè)操作,你去進(jìn)行打包。
而現(xiàn)在Maven 把 這一系列的操作,都給你串起來(lái)了。
用一個(gè)成語(yǔ)來(lái)形容:一氣呵成;
因此,Maven 存在的意義:
就是能夠直接把這些操作(管理依賴,構(gòu)建 / 編譯,打包)串起來(lái)。(一氣呵成)
尤其是一些比較大的程序,它里面有很多模塊。
你要是每一個(gè)模塊,都去手動(dòng)去敲一個(gè)命令去編譯;或者每一個(gè)模塊,都去點(diǎn)一下進(jìn)行打包,這就很麻煩了。但是,我們如果使用 Maven,就可以一鍵式的來(lái)幫我們把這里的這些操作,全部完成。
對(duì)于上面說(shuō)到的構(gòu)建/編譯我們知道。
可是這個(gè)打包和依賴是什么意思?????
打包:就是把Java代碼給構(gòu)造成jar包,或者是war包。
?jar包:其實(shí)就是一個(gè)特殊的壓縮包,類(lèi)似于 rar。里面就是把 各種 .class 文件,放到一起來(lái)。然后,進(jìn)行壓縮得到的包,就是 jar 包。
war包:也是同理。只是與 jar 包,在細(xì)節(jié)上存在差別。?另外,打包,也是 Maven 調(diào)用 JDK 里面的功能來(lái)實(shí)現(xiàn)的。(強(qiáng)調(diào)一下)
依賴:就是你在進(jìn)行一個(gè)A操作之前,先要進(jìn)行一個(gè)B操作。如果沒(méi)有B操作的實(shí)現(xiàn),你A操作就無(wú)法完成。
??舉例說(shuō)明:
要想有老婆,就必須先要有結(jié)婚的對(duì)象。
要想有結(jié)婚的對(duì)象,就必須先要有女朋友。
要想有女朋友,就必須要有自己中意的對(duì)象。
其中 結(jié)婚的對(duì)象,女朋友,中意的對(duì)象,都是進(jìn)行前者操作的必要條件。
兩者之間的關(guān)系,就被稱(chēng)為 “依賴”。?
咱們寫(xiě)代碼的時(shí)候,也是有很多依賴的。
只是當(dāng)前階段,依賴的東西不多。
1、經(jīng)常會(huì)依賴標(biāo)準(zhǔn)庫(kù)(集合類(lèi):Scanner,順序表,鏈表等等…)
但是,更嚴(yán)格來(lái)說(shuō):標(biāo)準(zhǔn)庫(kù)并不算是依賴。
因?yàn)?,你只有安裝了JDK,這些東西就都會(huì)有?!咀詭У摹?br> 但是,要想執(zhí)行 Java 程序,肯定是需要依賴 JDK 的。
因此,Java 程序 和 JDK 是屬于 依賴關(guān)系,
但java程序和標(biāo)準(zhǔn)庫(kù)之間的依賴關(guān)系,太勉強(qiáng)了。
2、經(jīng)常依賴第三方庫(kù)
第三方庫(kù):就是我們寫(xiě)代碼的時(shí)候,需要引入的一些其它的jar包。
就像前面講 JDBC編程 的時(shí)候,當(dāng)時(shí)就下載了一個(gè) mysql 的驅(qū)動(dòng)包。
當(dāng)時(shí),我們要想進(jìn)行 JDBC 編程,這個(gè) 驅(qū)動(dòng)包 是必不可少的!
這也就屬于依賴。
其實(shí)寫(xiě)代碼的時(shí)候,有時(shí)候的依賴也會(huì)非常復(fù)雜。
你引入了一個(gè)第三方庫(kù)A,而這個(gè) A 又依賴于 庫(kù) B,B 由依賴于 C,C又依賴于D,
類(lèi)似這樣的套娃操作,我們要想使用 A,就必要把它前面所依賴的庫(kù),全部引入。
?
如果我們是手動(dòng)去管理這個(gè)依賴,那就會(huì)相當(dāng)?shù)穆闊。?br> 不光你得研究清楚,每個(gè)庫(kù)都依賴哪些其他庫(kù)。
而且,還得要研究清楚,這些依賴之間的版本是否匹配的問(wèn)題。
如果版本不匹配,搭配起來(lái)使用,就會(huì)有很多莫名其妙的bug存在。
為了解決上述的依賴問(wèn)題,很多編程員都引入了自己的包管理工具(自動(dòng)解決依賴)。
Java:Maven,Gradle
Python:pip
JS:npm
各種語(yǔ)言都有著自己的包管理工具。
除了 C++。。。
這就是一個(gè)比較悲傷的故事了。
目前為止,C++官方還沒(méi)有提供這樣的一個(gè)包管理工具。
第三方的包管理工具是有,但是問(wèn)題多。
就沒(méi)有一個(gè)像 Maven 這種這么成熟的工具。
1.2 ??Maven的使用
對(duì)于Maven來(lái)說(shuō),我們不用下載,因?yàn)閕dea中內(nèi)置了線程的Maven,我們之間拿來(lái)用就好。
下面我們主要介紹在Maven在idea中的使用:
?
1、新建一個(gè)Maven項(xiàng)目:
2、Maven的使用
首先我們先了解剛剛我們新創(chuàng)建的Maven項(xiàng)目的組成部分
下面我們以mysql驅(qū)動(dòng)包的引入來(lái)說(shuō)明Maven引入依賴的流程?
?二、Servlet
Servlet 是一種實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的技術(shù). 是一組 Tomcat 提供給程序猿的 API, 幫助程序猿簡(jiǎn)單高效的開(kāi)發(fā)一個(gè) web app(網(wǎng)頁(yè)).
第一個(gè)Servlet程序:hello world
方法步驟:
2.1 創(chuàng)建maven項(xiàng)目
?2.2 引入依賴
因?yàn)镾ervlet這個(gè)API部署JDK內(nèi)置的,而是第三方(Tomcat)提供的,所以我們要想使用,就需要額外的引入Servlet依賴 ;
?我們借助Maven來(lái)引入Servlet依賴——這里我們所導(dǎo)入的第三方庫(kù)都是從Maven中央倉(cāng)庫(kù)中獲取的:
中央倉(cāng)庫(kù)鏈接:https://mvnrepository.com/
圖示說(shuō)明:?
?2.3 創(chuàng)建目錄結(jié)構(gòu)
雖然當(dāng)下 Maven 幫我們創(chuàng)建了一些目錄,但是還不夠。
當(dāng)前這個(gè)目錄還不足以支撐我們寫(xiě)一個(gè) Servlet 項(xiàng)目,我們這個(gè)項(xiàng)目是依賴Tomca服務(wù)器,為了符合Tomcat的格式,我們就需要手動(dòng)創(chuàng)建一些目錄和文件。
?注意:
這些目錄和文件的格式是固定的,不要問(wèn)為啥要?jiǎng)?chuàng)建這樣一個(gè)目錄或者說(shuō)文件,這是為了符合Tomcat而弄出的硬性要求;
圖示示例:
?
其中這個(gè)web.xml文件里的內(nèi)容不能為空,需要放下述代碼:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> </web-app>
?對(duì)上述文件的一些解釋?zhuān)?/span>
webapp 目錄就是未來(lái)部署到 Tomcat 中的一個(gè)重要的目錄. 當(dāng)前我們可以往 webapp 中放一些靜態(tài)資源, 比如 html , css 等.
在這個(gè)目錄中還有一個(gè)重要的文件 web.xml. Tomcat 找到這個(gè)文件才能正確處理 webapp 中的動(dòng)態(tài)資源.
2.4 編寫(xiě)servlet代碼
圖示示例:
?經(jīng)過(guò)上面的分析,我們可以知道,我具體的servlet代碼是要在doGet這個(gè)方法中寫(xiě)的,下面我們深入這個(gè)方法來(lái)看一下
?你以為到了這里就大功告成了嗎?
我們要實(shí)現(xiàn)的是通過(guò)在瀏覽器輸入url(發(fā)一個(gè)HTTP的get請(qǐng)求),進(jìn)而通過(guò)tomcat服務(wù)器來(lái)調(diào)用我們這個(gè)doGet。
當(dāng)我們成功給tomcat發(fā)了一個(gè)get請(qǐng)求,tomcat怎么知道要調(diào)用具體哪個(gè)servlet代碼呢?
這里我們希望調(diào)用我們HelloServlet類(lèi)中的doGet方法,那么我們就需要給我們這個(gè)類(lèi)添加一個(gè)“標(biāo)識(shí)符”,同時(shí)把這個(gè)標(biāo)識(shí)符寫(xiě)到在瀏覽器url中中,這樣tomcat就能夠識(shí)別到這個(gè)請(qǐng)求具體是要調(diào)用哪個(gè)servlet代碼了。
代碼示例:
2.5 打包操作
定義:
剛剛我們編寫(xiě)的servlet代碼是不能單獨(dú)運(yùn)行的;
我們的servlet程序要配合Tomcat才能正確執(zhí)行,這里我們的servlet代碼就相當(dāng)于是一節(jié)節(jié)的車(chē)廂,光有車(chē)廂不能跑起來(lái),還需要車(chē)頭——也就是Tomcat的幫助才能跑起來(lái);
打包就是把你車(chē)廂和車(chē)頭連接起來(lái),讓車(chē)頭Tomcat拖著我們的車(chē)廂Servlet程序來(lái)執(zhí)行;
下面我們看一下打包的具體實(shí)現(xiàn)過(guò)程?
代碼示例:
2.6?部署操作
部署即:把 war 包拷貝到 Tomcat 的 webapps 目錄下;
讓Tomcat(車(chē)頭)拖著war執(zhí)行。
2.7?驗(yàn)證程序
其實(shí)就是看看能不能通過(guò)tomcat服務(wù)器在瀏覽器來(lái)訪問(wèn)我們的servlet代碼;
?2.8 一點(diǎn)相關(guān)補(bǔ)充
與HTML生成頁(yè)面不同,我們當(dāng)前的通過(guò)Servlet生成的頁(yè)面是動(dòng)態(tài)的,根據(jù)用戶輸入的不同,是可以得到不同的顯示效果的。
此外當(dāng)我們修改了servlet代碼后,我們需要重寫(xiě)進(jìn)行打包、部署、然后再驗(yàn)證程序。
注意:我們?cè)?span style="color:#4da8ee;">重新部署時(shí)候,最好重啟一下tomcat;
但是如果每次改了代碼,我們都要重新打包生成一個(gè).war文件,然后再把這個(gè)新的.war文件放到tomcat目錄中的webapps目錄下,然后再找到bin目錄下的startup.bat文件重新啟動(dòng)tomcat。這樣子的確十分的麻煩。
為此我們可以借助第三方工具:smart tomcat來(lái)簡(jiǎn)化我們的打包和部署
- ?smart tomcat這個(gè)idea里的一個(gè)插件,就 保證我們把tomcat服務(wù)器和我們的idea關(guān)聯(lián)起來(lái)。保證我們一鍵式完成打包和部署操作。
- 但是我們要知道idea 和 tomcat是兩個(gè)獨(dú)立的程序?。?/strong>! tomcat部署idea功能的一部分 ,tomcat只是通過(guò)idea插件:smart tomcat,來(lái)和我們的idea建立起來(lái)一個(gè)合作的橋梁。?
為什么要提這一點(diǎn)?
這是因?yàn)楹竺骈_(kāi)發(fā),主要還是通過(guò) idea 調(diào)用 Tomcat的方式來(lái)進(jìn)行。
用的時(shí)間長(zhǎng)了之后,大家就對(duì)于 Tomcat的印象,就開(kāi)始模糊。
甚至?xí)a(chǎn)生 Tomcat 是 idea 功能的一部分,這樣的錯(cuò)覺(jué)!
以后大家在工作中,會(huì)涉及到幾個(gè)不同的環(huán)境。?
smart? tomato的使用
圖示舉例:
?使用 Smart Tomcat 部署的時(shí)候, 我們發(fā)現(xiàn) Tomcat 的 webapps 內(nèi)部并沒(méi)有被拷貝一個(gè) war 包,也沒(méi)有看到解壓縮的內(nèi)容.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Smart Tomcat 相當(dāng)于是在 Tomcat 啟動(dòng)的時(shí)候直接引用了項(xiàng)目中的 webapp 和 target 目錄(@WebServlet()中的內(nèi)容).
三、ServletAPI詳解
3.1?HttpServlet
相信通過(guò)上面我們第一個(gè)hello world程序,大家應(yīng)該已經(jīng)知道了。我們寫(xiě)的servlet代碼總是繼承自HttpServlet這個(gè)類(lèi)——我們就是重寫(xiě)其中的doPost、doGet等相關(guān)方法來(lái)被Tomcat執(zhí)行調(diào)用的;
這個(gè)過(guò)程 和 繼承 有關(guān),就會(huì)涉及到Java中的一個(gè)核心語(yǔ)法 “多態(tài)”。
在我們學(xué)習(xí)Java的時(shí)候,多態(tài)就是我們一個(gè)難啃的骨頭。
如果以后在面試的時(shí)候,被面試官問(wèn)到。
讓你講講對(duì)多態(tài)的理解,最好方式就是 舉例子。
最好舉一些有意義的例子,并且最好是關(guān)于代碼的。
舉例說(shuō)明:
比如:
集合類(lèi): List list = new ArrayList<>();
多線程:class Mythred extends Thread{ 重寫(xiě) run方法 }
像這種平常刷題經(jīng)常會(huì)用到的代碼,用來(lái)舉例是最好的。
另外,Servlet 也是一個(gè)很好的例子!
因?yàn)槲覀?span style="color:#4da8ee;">自己寫(xiě)的代碼也是通過(guò)繼承重寫(xiě)的方式來(lái)實(shí)現(xiàn)的。
因此在執(zhí)行的過(guò)程,是一定會(huì)涉及到 “多態(tài)的”!
HttpServlet的核心方法
我們實(shí)際開(kāi)發(fā)的時(shí)候主要重寫(xiě) doXXX 方法, 很少會(huì)重寫(xiě) init / destory / service;?
這些方法的調(diào)用時(shí)機(jī), 就稱(chēng)為 "Servlet 生命周期". (也就是描述了一個(gè) Servlet 實(shí)例從生到死的過(guò)程)
Servlet生命周期描述的是Servlet創(chuàng)建到銷(xiāo)毀的過(guò)程:
- 第一步:當(dāng)一個(gè)請(qǐng)求從HTTP服務(wù)器轉(zhuǎn)發(fā)給Servlet容器時(shí),容器檢查對(duì)應(yīng)的Servlet是否創(chuàng)建,沒(méi)有創(chuàng)建就實(shí)例化該Servlet,并調(diào)用init()方法,init()方法只調(diào)用一次,之后的請(qǐng)求都從第二步開(kāi)始執(zhí)行;
- 第二步:請(qǐng)求進(jìn)入service()方法,根據(jù)請(qǐng)求類(lèi)型轉(zhuǎn)發(fā)給對(duì)應(yīng)的方法處理,如doGet, doPost, 等等
- 第三步:容器停止前,調(diào)用destroy()方法,進(jìn)行清理操作,該方法只調(diào)用一次,隨后JVM回收資源。
圖示說(shuō)明:
注意:Httpservlet實(shí)例只是在程序
其中的doGet和doPost等doxx方法,是根據(jù)HTTP的請(qǐng)求的不同來(lái)分別執(zhí)行的。
doGet處理get請(qǐng)求,doPost處理post請(qǐng)求,doPut處理put請(qǐng)求;
3.2?HtttpServletRequest
核心方法:
打印請(qǐng)求信息?
代碼示例:
獲取get請(qǐng)求的參數(shù)
方法代碼示例:
的參數(shù)
?獲取post請(qǐng)求的參數(shù)
代碼示例:
3.3?HttpServletResponse
同樣的,HttpServletResponse 對(duì)應(yīng)到 一個(gè) HTTP 響應(yīng)。
HTTP 響應(yīng)中有什么,這里就有什么。Servlet 中的 doXXX 方法的目的就是根據(jù)請(qǐng)求計(jì)算得到相應(yīng), 然后把響應(yīng)的數(shù)據(jù)設(shè)置到
HttpServletResponse 對(duì)象中.
然后 Tomcat 就會(huì)把這個(gè) HttpServletResponse 對(duì)象按照 HTTP 協(xié)議的格式, 轉(zhuǎn)成一個(gè)字符串, 并通過(guò)Socket 寫(xiě)回給瀏覽器
核心方法
?方法使用代碼案例:
自動(dòng)刷新:
方法步驟:
步驟1.實(shí)現(xiàn) Servlet, 設(shè)置 header, 實(shí)現(xiàn)每隔 1s 自動(dòng)刷新頁(yè)面的效果. 頁(yè)面上要顯示當(dāng)前時(shí)間;
步驟2.
讓頁(yè)面上能夠顯示格式化的時(shí)間. 例如 2022-01-19 12:00:00;
步驟 3
重定向:訪問(wèn) /redirect 路徑后, 自動(dòng)重定向到 搜狗主頁(yè) 的代碼.
注意:
光理解了 Servlet API,還不足以支撐我們寫(xiě)出一個(gè)功能完整的網(wǎng)站。
還需要理解一個(gè)網(wǎng)站的開(kāi)發(fā)過(guò)程大概是什么樣子的。
理解這里的一些基本的編程思維 和 設(shè)計(jì)思路。這就需要通過(guò)更多的案例,來(lái)進(jìn)行強(qiáng)化了。
下篇博文就讓我們一起事情一個(gè)服務(wù)器版本的表白墻(注意不只是單單的前端HTML文件哦,還有與之相對(duì)應(yīng)的后端代碼——說(shuō)白了就是一個(gè)簡(jiǎn)單的前后端交互的栗子)
總結(jié)
今天我們對(duì)于servlet有了非常詳細(xì)的認(rèn)識(shí),接下來(lái)我們就將他應(yīng)用到我們的實(shí)戰(zhàn)項(xiàng)目的編寫(xiě)當(dāng)中,讓我們拭目以待吧?。。。。。。。。。。。?!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-612294.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-612294.html
到了這里,關(guān)于【JavaEE初階】——第七節(jié).Servlet入門(mén)學(xué)習(xí)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!