Day03筆記(servlet)

一、Servlet概述

1.sun公司提供的動態(tài)web資源開發(fā)技術(shù)或辖。本質(zhì)是上一段java小程序拇勃,要求這個(gè)小程序必須實(shí)現(xiàn)Servlet接口,以便服務(wù)器能夠調(diào)用孝凌。

2.開發(fā)Servlet的兩個(gè)步驟*實(shí)驗(yàn):

Servlet的快速入門

(1)步驟一:寫一個(gè)java程序?qū)崿F(xiàn)Servlet接口(此處直接繼承了默認(rèn)實(shí)現(xiàn)類GenericServlet)

package cn.itheima; import java.io.*;

import javax.servlet.*;

public class FirstServlet extends GenericServlet{

????public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{ ????????res.getOutputStream().write("My FirstServlet!".getBytes());

????}

}

(2)將編譯好的帶包的.class放到WEB-INF/classes下以外方咆,還要配置web應(yīng)用的 web.xml注冊

二、Servlet的詳述

1.生命周期:一件事物什么時(shí)候生蟀架,什么時(shí)候死瓣赂,在生存期間必然會做的事情,所有這些放在一起就是該事物的聲明周期片拍。

2.Servlet的生命周期:通常情況下煌集,servlet第一次被訪問的時(shí)候在內(nèi)存中創(chuàng)建對象,在創(chuàng)建后立即調(diào)用init()方法進(jìn)行初始化捌省。對于每一次請求都掉用service(req,resp)方法處理請求苫纤,此時(shí)會用Request對象封裝請求信息,并用Response對象(最初是空的)代表響應(yīng)消息纲缓,傳入到service方法里供使用卷拘。當(dāng)service方法處理完成后,返回服務(wù)器服務(wù)器根據(jù)Response中的信息組織稱響應(yīng)消息返回給瀏覽器祝高。響應(yīng)結(jié)束后servlet并不銷毀栗弟,一直駐留在內(nèi)存中等待下一次請求。直到服務(wù)器關(guān)閉或web應(yīng)用被移除出虛擬主機(jī)工闺,servlet對象銷毀并在銷毀前調(diào)用destroy()方法做一些善后的事情乍赫。

3.Servlet接口的繼承結(jié)構(gòu)

Servlet接口:定義了一個(gè)servlet應(yīng)該具有的方法,所有的Servlet都應(yīng)該直接或間接實(shí)現(xiàn)此接口

????|

????|----GenericServlet:對Servlet接口的默認(rèn)實(shí)現(xiàn)陆蟆,通用Servlet雷厂,這是一個(gè)抽象類,其中的大部分方法都做了默認(rèn)實(shí)現(xiàn)叠殷,只有service方法是一抽????象方法需要繼承者自己實(shí)現(xiàn)

????????????????????|

? ? ? ? ? ? ? ? ? ? |----HttpServlet:對HTTP協(xié)議進(jìn)行了優(yōu)化的Servlet改鲫,繼承自GenericServlet類,并且實(shí)現(xiàn)了其中的service抽象方法溪猿,默認(rèn)的實(shí)現(xiàn)中判斷了請求的請求方式钩杰,并根據(jù)請求方式的不同分別調(diào)用不同的doXXX()方法。通常我們直接繼承HttpServlet即可


4.6servlet的線程安全問題

4.6.1由于通常情況下诊县,一個(gè)servlet在內(nèi)存只有一個(gè)實(shí)例處理請求,當(dāng)多個(gè)請求發(fā)送過來的時(shí)候就會有多個(gè)線程操作該servlet對象措左,此時(shí)可能導(dǎo)致線程安全問題依痊。

(1)serlvet的成員變量可能存在線程安全問題

*實(shí)驗(yàn):定義一個(gè)成員變量 int i = 0;在doXXX()方法中進(jìn)行i++操作并輸出i值到客戶端,此時(shí)由于延遲可能導(dǎo)致線程安全問題

(2)serlvet操作資源文件時(shí)胸嘁,多個(gè)線程操作同一文件引發(fā)線程安全問題

*實(shí)驗(yàn):請求帶著一個(gè)參數(shù)過來瓶摆,servlet將請求參數(shù)寫入到一個(gè)文件,再讀取該文件性宏,將讀取到的值打印到客戶端上群井,有可能有線程安全問題

4.6.2解決方法

(1)利用同步代碼塊解決問題。缺陷是毫胜,同一時(shí)間同步代碼塊只能處理一個(gè) 請求书斜,效率很低下,所以同步代碼塊中盡量只包含核心的導(dǎo)致線程安全問題的代碼酵使。

(2)為該servlet實(shí)現(xiàn)SingleThreadModel接口荐吉,此為一個(gè)標(biāo)記接口,被標(biāo)記的servlet將會在內(nèi)存中保存一個(gè)servlet池口渔,如果一個(gè)線程來了而池中沒有servlet對象處理样屠,則創(chuàng)建一個(gè)新的。如果池中有空閑的servlet則直接使用缺脉。這并不能真的解決線程安全問題痪欲。此接口已經(jīng)被廢棄。

(3)兩種解決方案都不夠完美攻礼,所以盡量不要在servlet中出現(xiàn)成員變量勤揩。

三、ServletConfig

????????????1.代表servlet配置的對象秘蛔,可以在web.xml中<servlet>中配置


?? ? ? <servlet>

????????????<servlet-name>Demo5Servlet</servlet-name>

<servlet-class>cn.it.Demo5SErvlet</servlet-class>

? ? <init-param>

? ? ? ? <param-name>data1</param-name>

? ? ? ? <param-value>value1</param-value>

? ? </init-param>

</servlet>

然后在servlet中利用this.getServletConfig()獲取ServletConfig對象陨亡,該對象提供了getInitParameter()和getInitParameterNames()方法,可以遍歷出配置中的配置項(xiàng)深员。 不想在servlet中寫死的內(nèi)容可以配置到此處负蠕。

四、ServletContext

1.代表當(dāng)前web應(yīng)用的對象倦畅。

2.作為域?qū)ο笫褂谜谔牵诓煌瑂ervlet之間傳遞數(shù)據(jù),作用范圍是整個(gè)web應(yīng)用生命周期:當(dāng)web應(yīng)用被加載進(jìn)容器時(shí)創(chuàng)建代表整個(gè)web應(yīng)用的ServletContext對象。

當(dāng)服務(wù)器關(guān)閉或web應(yīng)用被移除出容器時(shí)叠赐,ServletContext對象跟著銷毀欲账。~域:一個(gè)域就理解為一個(gè)框,這里面可以放置數(shù)據(jù)芭概,一個(gè)域既然稱作域赛不,他就有一個(gè)可以被看見的范圍,這個(gè)范圍內(nèi)都可以對這個(gè)域中的數(shù)據(jù)進(jìn)行操作罢洲,那這樣的對象就叫做域?qū)ο蟆?/p>

3.在web.xml可以配置整個(gè)web應(yīng)用的初始化參數(shù)踢故,利用ServletContext去獲得param1pvalue1this.getServletContext().getInitParameter("param1")this.getServletContext().getInitParameterNames()

4.在不同servlet之間進(jìn)行轉(zhuǎn)發(fā)this.getServletContext().getRequestDispatcher("/servlet/Demo10Servlet").forward(request, response);方法執(zhí)行結(jié)束,service就會返回到服務(wù)器,再有服務(wù)器去調(diào)用目標(biāo)servlet殿较,其中request會重新創(chuàng)建耸峭,并將之前的request的數(shù)據(jù)拷貝進(jìn)去。

5.讀取資源文件5.1由于相對路徑默認(rèn)相對的是java虛擬機(jī)啟動的目錄淋纲,所以我們直接寫相對路徑將會是相對于tomcat/bin目錄劳闹,所以是拿不到資源的。如果寫成絕對路徑洽瞬,當(dāng)項(xiàng)目發(fā)布到其他環(huán)境時(shí)本涕,絕對路徑就錯(cuò)了。

5.2為了解決這個(gè)問題ServletContext提供了this.getServletContext().getRealPath("/1.properties")片任,給進(jìn)一個(gè)資源的虛擬路徑偏友,將會返回該資源在當(dāng)前環(huán)境下的真實(shí)路徑。this.getServletContext().getResourceAsStream("/1.properties")对供,給一個(gè)資源的虛擬路徑返回到該資源真實(shí)路徑的流位他。5.3當(dāng)在非servlet下獲取資源文件時(shí),就沒有ServletContext對象用了产场,此時(shí)只能用類加載器classLoader.getResourceAsStream("../../1.properties")鹅髓,此方法利用類加載器直接將資源加載到內(nèi)存中,有更新延遲的問題京景,以及如果文件太大窿冯,占用內(nèi)存過大。classLoader.getResource("../1.properties").getPath()确徙,直接返回資源的真實(shí)路徑醒串,沒有更新延遲的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鄙皇,一起剝皮案震驚了整個(gè)濱河市芜赌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伴逸,老刑警劉巖缠沈,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異错蝴,居然都是意外死亡洲愤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門顷锰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柬赐,“玉大人,你說我怎么就攤上這事馍惹√陕剩” “怎么了玛界?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵万矾,是天一觀的道長悼吱。 經(jīng)常有香客問我,道長良狈,這世上最難降的妖魔是什么后添? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮薪丁,結(jié)果婚禮上遇西,老公的妹妹穿的比我還像新娘。我一直安慰自己严嗜,他們只是感情好粱檀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漫玄,像睡著了一般茄蚯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睦优,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天渗常,我揣著相機(jī)與錄音,去河邊找鬼汗盘。 笑死皱碘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隐孽。 我是一名探鬼主播癌椿,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菱阵!你這毒婦竟也來了踢俄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤送粱,失蹤者是張志新(化名)和其女友劉穎褪贵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抗俄,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脆丁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了动雹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槽卫。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胰蝠,靈堂內(nèi)的尸體忽然破棺而出歼培,到底是詐尸還是另有隱情震蒋,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布躲庄,位于F島的核電站查剖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏噪窘。R本人自食惡果不足惜笋庄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倔监。 院中可真熱鬧直砂,春花似錦、人聲如沸浩习。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谱秽。三九已至洽蛀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弯院,已是汗流浹背辱士。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留听绳,地道東北人颂碘。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像椅挣,于是被迫代替她去往敵國和親头岔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在鼠证,面了一些公司峡竣,掛了不少,但最終還是拿到小米量九、百度适掰、阿里、京東荠列、新浪类浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,255評論 11 349
  • 本文包括: Servlet簡介關(guān)于Servlet的一些類 Servlet生命周期 ServletConfig獲得初...
    廖少少閱讀 3,866評論 1 67
  • Servlet學(xué)習(xí)的大綱 servlet概念及相關(guān)接口簡介 servet 執(zhí)行過程 servlet映射路徑 缺省s...
    奮斗的老王閱讀 1,194評論 1 51
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題肌似。 96费就、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,408評論 0 10
  • Servlet Interface 是Java Servlet API的核心抽象。所有的servlets都直接或者...
    Lucky_Micky閱讀 1,699評論 2 2