Servlet學(xué)習(xí)筆記(一)

Servlet生命周期

init() :進(jìn)行初始化工作

service():提供服務(wù)響應(yīng)請(qǐng)求

destory():Servlet被銷毀的時(shí)候調(diào)用

調(diào)用順序:構(gòu)造器->init()->service()->destory()

Servlet第一次訪問時(shí),首先調(diào)用構(gòu)造函數(shù),再init(),再service(),再destory();

第二次訪問時(shí),只有service()會(huì)被調(diào)用,其他方法不再被調(diào)用

destory(),調(diào)用情況:

  • 服務(wù)器正常關(guān)閉
  • 服務(wù)器重啟

總結(jié):

  • 實(shí)際開發(fā)中直接繼承HttpServlet
  • 實(shí)際開發(fā)中只需覆蓋doGet和doPost方法
  • 如果需要初始化,直接覆蓋init()方法,無需覆蓋init(config),因?yàn)閕nit(Config)調(diào)用了init()方法
  • 當(dāng)doGet和doPost代碼邏輯相同時(shí)系瓢,可以相互調(diào)用溶浴,簡(jiǎn)化編程

注意事項(xiàng):

<servlet>
    <servlet-name></servlet-name>
    <servlet-class></servlet-class>
    <!--表示Servlet跟隨服務(wù)器啟動(dòng)而初始化,通常用來加載配置文件-->
    <!--中間的數(shù)值代表優(yōu)先級(jí),取值范圍從0-9,0代表最高優(yōu)先級(jí)-->
    <load-on-startup></load-on-startup>
</servlet>

Url-pattern的三種方式

  • 完全路徑匹配
<servlet-mapping>
  <servlet-name>AServlet</servlet-name>
  <url-pattern>/servlet/abc/</url-pattern>
</servlet-mapping>
  • 目錄匹配,例如:/* /abc/*
<servlet-mapping>
  <servlet-name>AServlet</servlet-name>
  <url-pattern>/servlet/abc/*</url-pattern>
</servlet-mapping>
  • 擴(kuò)展名匹配
<servlet-mapping>
  <servlet-name>AServlet</servlet-name>
  <url-pattern>/servlet/abc/</url-pattern>
  <url-pattern>*.do</url-pattern>
  <url-pattern>*.action</url-pattern>
</servlet-mapping>

優(yōu)先級(jí):完全路徑匹配>目錄匹配>擴(kuò)展名匹配

相對(duì)路徑與絕對(duì)路徑

相對(duì)路徑:相對(duì)當(dāng)前文件的路徑,例如:HelloServlet ./HelloServlet ../HelloServlet

  • 例如http://localhost/test/aa.html頁面提交一個(gè)form表單,action="HelloServlet",那么直接將url最后地址換成相對(duì)路徑,我們的完整請(qǐng)求路徑為: http://localhost/test/HelloServlet
  • ./代表當(dāng)前目錄,用于相對(duì)路徑,但是可以省略
  • ../代表上一級(jí)目錄
  • / 代表根目錄

絕對(duì)路徑:以/開始, /訪問服務(wù)器根目錄,例如/test/HelloServlet

ServletConfig獲得局部初始化參數(shù),ServletContext()獲得全局初始化參數(shù)

配置方法:

在web.xml文件中的<servlet>標(biāo)簽內(nèi)添加<init-param>標(biāo)簽,為Servlet配置初始化參數(shù)

 <servlet>
        <servlet-name>CServlet</servlet-name>
        <servlet-class>org.luoluo.CServlet</servlet-class>
        <init-param>
          <!--name代表名字,value代表值-->
            <param-name>dd</param-name>
            <param-value>DDDD</param-value>
        </init-param>
    </servlet>
public class CServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //通過getServletConfig來獲取config對(duì)象,然后通過getInitParameter獲取對(duì)應(yīng)的值,getInitParameterNames來獲取對(duì)應(yīng)的key值
        ServletConfig config = getServletConfig();
        String value =config.getInitParameter("dd");
        Enumeration<String> en = config.getInitParameterNames();
        while (en.hasMoreElements()) {
            System.out.println(en.nextElement());
        }
    }
}

全局初始化參數(shù)的設(shè)置:在web.xml中進(jìn)行配置

<context-param>
    <param-name>aa</param-name>
    <param-value>AA</param-value>
</context-param>

在servlet中,通過getServletContext()這個(gè)方法來調(diào)用全局的參數(shù)信息

重定向與轉(zhuǎn)發(fā)

  • 轉(zhuǎn)發(fā) : 如果服務(wù)器在處理客戶請(qǐng)求的時(shí)候,需要多個(gè)服務(wù)器程序進(jìn)行同時(shí)處理,這時(shí)候就需要使用轉(zhuǎn)發(fā).
  • 重定向 : 服務(wù)器收到請(qǐng)求后,通知客戶端需要訪問下一個(gè)目標(biāo)程序進(jìn)行后續(xù)處理

轉(zhuǎn)發(fā)和重定向的區(qū)別

  • 轉(zhuǎn)發(fā)產(chǎn)生一次請(qǐng)求一次響應(yīng),重定向產(chǎn)生兩次請(qǐng)求兩次響應(yīng),因此轉(zhuǎn)發(fā)性能更高
  • 轉(zhuǎn)發(fā)會(huì)客戶端來講是透明的(無感),重定向?qū)蛻舳藖碇v是可察覺的
  • 轉(zhuǎn)發(fā)時(shí),瀏覽器地址欄的路徑不會(huì)發(fā)生改變
  • 重定向時(shí),瀏覽器地址欄的路徑會(huì)發(fā)生改變

轉(zhuǎn)發(fā)方法:

getRequestDispatcher("/").forward(request,response);//"/"代表當(dāng)前路徑

重定向方法:

sendRedirect();//里面要寫絕對(duì)路徑

TomCat項(xiàng)目部署路徑的問題:

在一個(gè)項(xiàng)目中,只有src和WEB-INF目錄下的內(nèi)容會(huì)被加載到TomCat中,而且必須使用絕對(duì)磁盤路徑(帶有盤符的路徑)讀取

方法一:通過ServletContext.getRealPath(String path)

獲取Web應(yīng)用中的資源的絕對(duì)磁盤路徑,獲取的是WEB-INF在tomcat中的磁盤絕對(duì)路徑

在WebContnet中的文件可以直接"/文件名"來訪問,但是在src目錄下的文件,需要訪問classes字節(jié)碼中的文件,即文件名要寫為"/WEB-INF/classes/(文件名)"來獲取文件

getServletContext().getRealPath("/WEB-INF/classes/b.txt");//訪問WEB-INF
getServletContext().getRealPath("a.txt");//直接訪問的是WebContnet中的文件

方法二:通過字節(jié)碼來獲取src目錄下的文件

Class clazz = AServlet.class;
//fileName所獲取到的位置也是src的文件路徑,即字節(jié)碼文件的路徑
String fileName = clazz.getResource("/c.txt").getFile();

課后問題:

  1. 通過字節(jié)碼文件來讀取文件,是否與相對(duì)應(yīng)的字節(jié)碼文件的位置有關(guān)?

    答:這個(gè)路徑是和getRealpath是一樣的效果,所得到的路徑都是WEB-INF下的路徑,并且與字節(jié)碼文件GServlet的位置無關(guān)

  2. 同getRealPath()來獲取src目錄文件時(shí),能不能通過"/classes/a.txt"來訪問?

    答:getRealPath()所定位到的文件夾是直接是web下的文件夾的內(nèi)容,如果需要指定src下的文件內(nèi)容的話是需要在getRealPath()里面加上/WEB-INF/classes的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚪腋,一起剝皮案震驚了整個(gè)濱河市痪蝇,隨后出現(xiàn)的幾起案子荆忍,更是在濱河造成了極大的恐慌禁灼,老刑警劉巖昵仅,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件退渗,死亡現(xiàn)場(chǎng)離奇詭異导绷,居然都是意外死亡犀勒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門诵次,熙熙樓的掌柜王于貴愁眉苦臉地迎上來账蓉,“玉大人,你說我怎么就攤上這事逾一≈荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵遵堵,是天一觀的道長箱玷。 經(jīng)常有香客問我,道長陌宿,這世上最難降的妖魔是什么锡足? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮壳坪,結(jié)果婚禮上舶得,老公的妹妹穿的比我還像新娘。我一直安慰自己爽蝴,他們只是感情好沐批,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝎亚,像睡著了一般九孩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上发框,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天躺彬,我揣著相機(jī)與錄音,去河邊找鬼。 笑死宪拥,一個(gè)胖子當(dāng)著我的面吹牛仿野,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播江解,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼设预,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了犁河?” 一聲冷哼從身側(cè)響起鳖枕,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桨螺,沒想到半個(gè)月后宾符,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灭翔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年魏烫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肝箱。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哄褒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出煌张,到底是詐尸還是另有隱情呐赡,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布骏融,位于F島的核電站链嘀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏档玻。R本人自食惡果不足惜怀泊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望误趴。 院中可真熱鬧霹琼,春花似錦、人聲如沸凉当。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纤怒。三九已至,卻和暖如春天通,著一層夾襖步出監(jiān)牢的瞬間泊窘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烘豹,地道東北人瓜贾。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像携悯,于是被迫代替她去往敵國和親祭芦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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