摘要:當(dāng)后繼請(qǐng)求相同的頁(yè)面時(shí),容器加載之前生成的類(lèi),并且通知去執(zhí)行已經(jīng)存在的字節(jié)碼,從而省去了轉(zhuǎn)換的過(guò)程,這也是第一次執(zhí)行頁(yè)面時(shí)間較長(zhǎng)的原因。
以往學(xué)習(xí)的時(shí)候大多是看完書(shū)或者看完視頻,動(dòng)手實(shí)踐一下就OK了。然而過(guò)了一段時(shí)間我發(fā)現(xiàn)東西都忘差不多了,需要復(fù)習(xí)才能重新掌握。現(xiàn)在開(kāi)始學(xué)習(xí)JavaWeb了,我將在這里記錄自己的學(xué)習(xí)的一點(diǎn)一滴,不僅便于自己以后回顧知識(shí)點(diǎn),也希望能對(duì)JavaWeb初學(xué)者有所幫助。文章的內(nèi)容主要是我對(duì)李剛老師的《輕量級(jí)JavaEE企業(yè)應(yīng)用實(shí)戰(zhàn)》一書(shū)的學(xué)習(xí)總結(jié)。本系列文章為Java新手的學(xué)習(xí)總結(jié),大神請(qǐng)自動(dòng)路過(guò)。
JSP/Servlet是Java EE規(guī)范的兩個(gè)基礎(chǔ)成員,也是Java EE開(kāi)發(fā)的基礎(chǔ)知識(shí),同時(shí)也是Java Web開(kāi)發(fā)的重點(diǎn)知識(shí)。JSP與Servlet的本質(zhì)相同,JSP最終必須編譯成Servlet才能運(yùn)行。JSP的特點(diǎn)就是在HTML代碼中嵌入Java代碼或者使用各種JSP標(biāo)簽,動(dòng)態(tài)的提供頁(yè)面內(nèi)容。
(一)創(chuàng)建第一個(gè)Web應(yīng)用在開(kāi)始學(xué)習(xí)之前首先需要搭建Tomcat服務(wù)器,關(guān)于服務(wù)器的搭建請(qǐng)自行百度。我選擇的集成開(kāi)發(fā)環(huán)境是Idea。下面我將手動(dòng)建立一個(gè)Web應(yīng)用:
在任一目錄下新建名為myFirstWebApp的文件夾
在myFirstWebApp文件夾內(nèi)新建一個(gè)名為WEB-INF的文件夾(注意區(qū)分大小寫(xiě))
在WEB-INF文件夾下新建一個(gè)名為class和一個(gè)名為lib的文件夾
打開(kāi)Tomcat的webapps文件夾,將任一示例的Web應(yīng)用的WEB-INF下的web.xml文件復(fù)制到WEB-INF目錄下
將該文件根元素
在myFirstWebApp目錄下新建一個(gè)index.jsp文件,注意是jsp格式,使用記事本打開(kāi)該文件添加以下內(nèi)容:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>我的第一個(gè)Web應(yīng)用 Hello,my first WebApp!
這個(gè)文件實(shí)際上就是一個(gè)靜態(tài)HTML頁(yè)面但與之略有不同,項(xiàng)目部署成功以后,我們可以通過(guò)瀏覽器訪問(wèn)這個(gè)頁(yè)面。
至此,我們就構(gòu)建完成了一個(gè)基本的Web應(yīng)用。myFirstWebApp是Web項(xiàng)目對(duì)應(yīng)文件夾的名字。classes與lib文件夾的作用一致,都是用于保存Web應(yīng)用所需要的Java類(lèi)文件,其中classes文件夾用于保存單個(gè)的.class文件,lib文件夾用于保存打包的JAR文件。web-xml文件被稱(chēng)為配置描述符,它的作用將在下面作詳細(xì)介紹。index.jsp是Web項(xiàng)目在有多個(gè)JSP頁(yè)面時(shí)首先訪問(wèn)的頁(yè)面,它其實(shí)就是一個(gè)靜態(tài)頁(yè)面,我們可以通過(guò)瀏覽器訪問(wèn)它。
下面我們將在Tomcat服務(wù)器上部署這個(gè)這個(gè)應(yīng)用:
將該Web應(yīng)用復(fù)制到Tomcat的webapps路徑下,這樣Web應(yīng)用就可以自動(dòng)部署到Tomcat服務(wù)器中。
啟動(dòng)Tomcat,對(duì)于Windows平臺(tái),只需要雙擊Tomcat安裝路徑下bin目錄中的startup.bat文件即可啟動(dòng)Tomcat。
使用瀏覽器訪問(wèn)http://localhost:8080/myFirst...。
你會(huì)看到剛才那個(gè)HTML代碼被瀏覽器渲染了
如果看到如下顯示則表示我們的已經(jīng)成功把Web應(yīng)用部署到Tomcat上了。
(二)配置描述符web.xmlweb.xml文件對(duì)于整個(gè)項(xiàng)目十分重要。在servlet2.5之前,每個(gè)Java Web應(yīng)用必須包含一個(gè)web.xml文件且必須是在WEB-INF目錄下。但是從servlet3.0開(kāi)始,此文件夾不再是必須的,但是為了同一性,通常我們還是保留這個(gè)文件。web.xml有很多配置管理作用,以后會(huì)逐步學(xué)到。
web.xml文件的根元素是
在web.xml文件中配置首頁(yè)使用welcome-file-list元素,該元素包含多個(gè)welcome-file子元素,每個(gè)元素匹配一個(gè)首頁(yè)。
index.html index.htm index.jsp
依次匹配每個(gè)頁(yè)面,不存在就使用下一個(gè),以此類(lèi)推。
其實(shí)每個(gè)Web容器都會(huì)提供一個(gè)系統(tǒng)的web.xml文件,用于描述所有Web應(yīng)用共同的配置屬性。在Tomcat中,web.xml文件放在了conf路徑下。
(三)JSP的基本原理JSP的本質(zhì)就是Servlet。當(dāng)用戶向指定的Servlet發(fā)送請(qǐng)求時(shí),Servlet利用輸出流動(dòng)態(tài)的生成HTML頁(yè)面。其實(shí),在每次的輸出流中存在大量的靜態(tài)文本,這些都極大的拖累了Servlet的開(kāi)發(fā)效率。隨著JSP的出現(xiàn),JavaWeb的開(kāi)發(fā)效率大大提高:JSP通過(guò)在HTML代碼中嵌套java代碼,從而使靜態(tài)的部分不再需要Java程序控制,Java只控制那些需要從數(shù)據(jù)庫(kù)讀取或者需要?jiǎng)討B(tài)生成的內(nèi)容頁(yè)面。
所以,一個(gè)JSP頁(yè)面內(nèi)容一般由靜態(tài)和動(dòng)態(tài)兩個(gè)部分組成。靜態(tài)的部分就是一般的HTML代碼,動(dòng)態(tài)的就是<% %>包裹的Java代碼,看起來(lái)JSP頁(yè)面與Java類(lèi)沒(méi)有任何關(guān)系,其實(shí)JSP的本質(zhì)依然是Servlet(一個(gè)特殊的類(lèi))。JSP頁(yè)面由系統(tǒng)編譯成Servlet,由Servlet響應(yīng)用戶的請(qǐng)求。由此可見(jiàn),每個(gè)JSP頁(yè)面就是一個(gè)Servlet實(shí)例,是Servlet的簡(jiǎn)化,因?yàn)槊總€(gè)頁(yè)面都會(huì)被Servlet容器生成對(duì)應(yīng)的Servlet類(lèi)。
JSP頁(yè)面的基本工作原理如下:
首先由客戶端發(fā)起請(qǐng)求,JSP服務(wù)器判斷被請(qǐng)求的頁(yè)面是否是第一次收到請(qǐng)求,如果是,則先編譯JSP文件,生成對(duì)應(yīng)的Servlet來(lái)響應(yīng)請(qǐng)求,返回標(biāo)準(zhǔn)的HTML頁(yè)面。如果不是,那么表示該JSP頁(yè)面已有對(duì)應(yīng)的Servlet,則會(huì)根據(jù)請(qǐng)求動(dòng)態(tài)的生成HTML代碼返回給客戶端。
下面深入學(xué)習(xí)一下JSP的運(yùn)行原理:
一個(gè)JSP運(yùn)行體系至少包括Web服務(wù)器、JSP引擎和JVM三個(gè)部分,其運(yùn)行過(guò)程如下圖所示:
用戶從客戶端向Web服務(wù)器發(fā)送請(qǐng)求時(shí),服務(wù)器端首先判斷該請(qǐng)求是否包含JSP內(nèi)容,如果只是請(qǐng)求HTML頁(yè)面,則直接把結(jié)果返回給客戶端,完成服務(wù)器端的響應(yīng)工作。如果請(qǐng)求還包含JSP內(nèi)容,那么先傳遞給JSP/Servlet引擎,該引擎解釋請(qǐng)求頁(yè)面中的JSP標(biāo)記和腳本,把源代碼轉(zhuǎn)換為以".java"為后綴的Servlet代碼,并且傳送給JVM;JVM把這些Servlet代碼編譯成以".class"為后綴的可執(zhí)行字節(jié)碼文件,并且存放在服務(wù)器上,接著執(zhí)行字節(jié)碼,然后把結(jié)果傳送給JSP引擎,JSP引擎再把結(jié)果傳遞給Web服務(wù)器,最后Web服務(wù)器把結(jié)果以HTML頁(yè)面的形式傳送給客戶端,完成服務(wù)器端的響應(yīng)工作。
當(dāng)后繼請(qǐng)求相同的JSP頁(yè)面時(shí),JSP容器加載之前生成的Servlet類(lèi),并且通知JVM去執(zhí)行已經(jīng)存在的字節(jié)碼,從而省去了轉(zhuǎn)換的過(guò)程,這也是第一次執(zhí)行JSP頁(yè)面時(shí)間較長(zhǎng)的原因。在JSP執(zhí)行期間,JSP容器會(huì)檢查JSP文件,看是否有更新,如果有更新,JSP容器會(huì)再次編譯JSP或Servlet。
現(xiàn)在我們學(xué)會(huì)了如何建立一個(gè)web項(xiàng)目和了解了JSP的基本工作原理,接下來(lái)我們將學(xué)習(xí)JSP的基本語(yǔ)法和編譯指令。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/66754.html
摘要:下面我們?cè)俅蜷_(kāi)對(duì)應(yīng)的文件,我們會(huì)看到如下部分內(nèi)容靜態(tài)測(cè)試調(diào)用我是文件,我被文件調(diào)用了我們發(fā)現(xiàn),在該包含文件被引入處那條語(yǔ)句被執(zhí)行了。 在上一節(jié)中我們學(xué)習(xí)了如何搭建一個(gè)簡(jiǎn)單的Web應(yīng)用,并且已經(jīng)知曉了一個(gè)JSP頁(yè)面主要由靜態(tài)的HTML內(nèi)容和動(dòng)態(tài)的Java腳本共同組成。JSP的基本語(yǔ)法共有JSP注釋、JSP聲明、輸出JSP表達(dá)式與JSP程序片段四種,用來(lái)控制動(dòng)態(tài)向頁(yè)面輸出內(nèi)容的。現(xiàn)在我們就...
摘要:我沒(méi)有什么本事,人也丑,也不會(huì)忽悠,只能硬著頭皮學(xué)習(xí)了。最近計(jì)劃學(xué)習(xí)后臺(tái),因?yàn)樽罱恿怂交畹膯?wèn)題,好多都要后臺(tái)和前端一起做。 我沒(méi)有什么本事,人也丑,也不會(huì)忽悠,只能硬著頭皮學(xué)習(xí)了。最近計(jì)劃學(xué)習(xí)Java后臺(tái),因?yàn)樽罱恿怂交畹膯?wèn)題,好多都要Java后臺(tái)和前端一起做。平常我在做什么,當(dāng)然是忙著賺錢(qián)了 除了敲代碼,你還有什么副業(yè)嗎?接了活自己還要找開(kāi)發(fā)Java后臺(tái)開(kāi)發(fā)的,為什么我自己不會(huì)呢...
摘要:我沒(méi)有什么本事,人也丑,也不會(huì)忽悠,只能硬著頭皮學(xué)習(xí)了。最近計(jì)劃學(xué)習(xí)后臺(tái),因?yàn)樽罱恿怂交畹膯?wèn)題,好多都要后臺(tái)和前端一起做。 我沒(méi)有什么本事,人也丑,也不會(huì)忽悠,只能硬著頭皮學(xué)習(xí)了。最近計(jì)劃學(xué)習(xí)Java后臺(tái),因?yàn)樽罱恿怂交畹膯?wèn)題,好多都要Java后臺(tái)和前端一起做。平常我在做什么,當(dāng)然是忙著賺錢(qián)了 除了敲代碼,你還有什么副業(yè)嗎?接了活自己還要找開(kāi)發(fā)Java后臺(tái)開(kāi)發(fā)的,為什么我自己不會(huì)呢...
摘要:我沒(méi)有什么本事,人也丑,也不會(huì)忽悠,只能硬著頭皮學(xué)習(xí)了。最近計(jì)劃學(xué)習(xí)后臺(tái),因?yàn)樽罱恿怂交畹膯?wèn)題,好多都要后臺(tái)和前端一起做。 我沒(méi)有什么本事,人也丑,也不會(huì)忽悠,只能硬著頭皮學(xué)習(xí)了。最近計(jì)劃學(xué)習(xí)Java后臺(tái),因?yàn)樽罱恿怂交畹膯?wèn)題,好多都要Java后臺(tái)和前端一起做。平常我在做什么,當(dāng)然是忙著賺錢(qián)了 除了敲代碼,你還有什么副業(yè)嗎?接了活自己還要找開(kāi)發(fā)Java后臺(tái)開(kāi)發(fā)的,為什么我自己不會(huì)呢...
摘要:系列文章請(qǐng)查看超詳細(xì)的面試題總結(jié)一之基礎(chǔ)知識(shí)篇超詳細(xì)的面試題總結(jié)二之基礎(chǔ)知識(shí)篇超詳細(xì)的面試題總結(jié)三之集合篇常見(jiàn)問(wèn)題下面的都是自己之前在學(xué)習(xí)的時(shí)候總結(jié)的,對(duì)于鞏固的基礎(chǔ)知識(shí)應(yīng)該有很大幫助。注意多線程的并發(fā)的讀寫(xiě)類(lèi)屬性會(huì)導(dǎo)致數(shù)據(jù)不同步。 系列文章請(qǐng)查看: 超詳細(xì)的Java面試題總結(jié)(一)之Java基礎(chǔ)知識(shí)篇 超詳細(xì)的Java面試題總結(jié)(二)之Java基礎(chǔ)知識(shí)篇 超詳細(xì)的Java面試題總結(jié)(...
閱讀 2538·2021-07-26 23:38
閱讀 3437·2019-08-30 13:10
閱讀 2324·2019-08-29 18:33
閱讀 2326·2019-08-29 16:12
閱讀 993·2019-08-29 10:59
閱讀 1803·2019-08-26 17:40
閱讀 775·2019-08-26 11:59
閱讀 817·2019-08-26 11:41