Servlets & JSP 學(xué)習(xí)筆記(二)

1.會(huì)話管理基本原理

web應(yīng)用程序的請(qǐng)求與響應(yīng)是基于HTTP的,為無狀態(tài)的通信協(xié)議。服務(wù)器不會(huì)記得這次請(qǐng)求與下次請(qǐng)求之間的關(guān)系,然而有些功能必須多次請(qǐng)求來完成,例如購(gòu)物車。這種記得兩次請(qǐng)求之間關(guān)系的方式,就稱為會(huì)話管理。

2.幾種實(shí)現(xiàn)會(huì)話管理的基本方式

使用隱藏域:即將前一頁(yè)的答案以隱藏域的方式響應(yīng)給瀏覽器,以便下一次再發(fā)送給服務(wù)器。

使用Cookie:cookie是在瀏覽器存儲(chǔ)信息的一種方式

使用url重寫:其實(shí)就是GET請(qǐng)求參數(shù)的應(yīng)用

使用HttpSession進(jìn)行會(huì)話管理:

getSession()方法取得session對(duì)象,setAttribute()和getAttribute()方法來設(shè)置和獲取對(duì)應(yīng)屬性。

invalidate():銷毀回收HttpSession對(duì)象

使用HttpSession與url重寫相結(jié)合

因?yàn)镠ttpSession默認(rèn)使用Cookie存儲(chǔ)Session ID,如果用戶關(guān)掉Cookie,就需要用HttpSession與URL重寫的方式來進(jìn)行會(huì)話管理。

encodeURL方法:當(dāng)Cookie被禁用時(shí),該方法自動(dòng)產(chǎn)生帶有Session的URL重寫。

3.servlet進(jìn)階API

一些基本概念

每個(gè)servlet都必須由web容器讀取servlet的設(shè)置信息、初始化等。對(duì)于每個(gè)servlet設(shè)置信息,web容器會(huì)為其生成一個(gè)servletConfig作為代表對(duì)象,可以從該對(duì)象取得servlet基本參數(shù),以及代表整個(gè)web應(yīng)用程序的ServletContext對(duì)象。

在web容器啟動(dòng)后,會(huì)讀取servlet設(shè)置信息,將servlet類加載并實(shí)例化,并為每個(gè)servlet設(shè)置信息產(chǎn)生一個(gè)ServletConfig對(duì)象,而后調(diào)用Servlet接口的init方法,并將ServletConfig對(duì)象當(dāng)作參數(shù)傳入,之后的每次請(qǐng)求都會(huì)調(diào)用Servlet對(duì)象的service方法。

GenericServlet主要的目的,就是將初始的Servlet調(diào)用init方法傳入ServletConfig封裝起來。

4.ServletConfig的使用

對(duì)象中定義了getInitParameter()、getInitParameterNames()方法,可以取得設(shè)置servlet的初始參數(shù)。

若要使用標(biāo)注設(shè)置個(gè)別Servlet的初始參數(shù),@WebInitParam設(shè)置initparams屬性。

getServletConfig().getInitParameter() = getInitParameter()? 因?yàn)镚enericServlet定義了一些方法,將servletConfig封裝起來,便于取得一些信息。

5.ServletContext的使用

當(dāng)整個(gè)web容器加載完web容器之后,容器會(huì)生成一個(gè)servletContext對(duì)象作為整個(gè)應(yīng)用程序的代表,并設(shè)置給servletConfig,只要通過servletConfig的getServletContext方法就可以取得servletContext對(duì)象。

一些需要注意的方法:

context.getRequestDispatcher("/pages/some.jsp").forward(request,response)? ?注意:使用時(shí)必須以“/”開頭,這個(gè)斜杠代表應(yīng)用程序環(huán)境根目錄。

和之前request調(diào)用的getRequestDispatcher的聯(lián)系:

context.getResourcePaths("/")? ? 可以知道web應(yīng)用程序的某個(gè)目錄里有哪些文件

context.getResourceAsStream()? ?如果想在web容器中讀取某個(gè)文件的內(nèi)容,則可以使用該方法,運(yùn)行結(jié)果返回一個(gè)InputStream實(shí)例

6.ServletContext事件、監(jiān)聽器

ServletContextListener監(jiān)聽器

是生命周期監(jiān)聽器,監(jiān)聽web程序何時(shí)初始化以及即將結(jié)束銷毀。web應(yīng)用程序初始化后調(diào)用contextInitialised()方法,即將銷毀前調(diào)用contextDestoryed()方法。例如,在程序初始化時(shí)可以準(zhǔn)備好數(shù)據(jù)連接對(duì)象、讀取應(yīng)用程序設(shè)置等操作。

實(shí)現(xiàn)方法:webListener標(biāo)注、實(shí)現(xiàn)ServletContextListener接口

當(dāng)容器調(diào)用上面兩個(gè)方法時(shí),會(huì)傳入ServletContextEvent對(duì)象,可以通過該對(duì)象調(diào)用getServletContext來得到對(duì)象。

ServletContextAttributeListener監(jiān)聽器

是監(jiān)聽屬性改變的監(jiān)聽器,監(jiān)聽servletContext屬性被設(shè)置、移除和替換,相對(duì)的被調(diào)用的方法為attributeAdded()、attributeRemoved()、attributeReplaced()。

實(shí)現(xiàn)方法:webListener標(biāo)注、實(shí)現(xiàn)ServletContextAttributeListener接口

7.HttpSession事件、監(jiān)聽器

HttpSessionListener監(jiān)聽器

是生命周期監(jiān)聽器,監(jiān)聽HttpSession對(duì)象的創(chuàng)建和結(jié)束,分別調(diào)用sessionCreated()方法以及sessionDestoryed()方法。通過傳入的HttpSessionEvent對(duì)象的getSession方法獲得HttpSession對(duì)象。例如可以用于防止用戶在兩個(gè)瀏覽器之間重復(fù)登錄。

疑問:ServletContext對(duì)象與HttpSession對(duì)象何時(shí)產(chǎn)生和消亡,有什么區(qū)別

實(shí)現(xiàn)方法:略

HttpSessionAttributeListener監(jiān)聽器

屬性改變監(jiān)聽器,監(jiān)聽HttpSession屬性被設(shè)置、移除和替換,相對(duì)的被調(diào)用的方法為attributeAdded()、attributeRemoved()、attributeReplaced()。并傳入HttpSessionBindingEvent對(duì)象,該對(duì)象調(diào)用getName方法可以得到改變的屬性名,getValue方法可以得到改變的屬性對(duì)象。

HttpSessionBindingListener監(jiān)聽器

對(duì)象綁定監(jiān)聽器,當(dāng)有屬性加入或者移除HttpSession時(shí),會(huì)調(diào)用對(duì)應(yīng)的valueBound方法以及valueUnbound方法,并傳入HttpSessionBindingEvent對(duì)象,該對(duì)象調(diào)用getSession方法取得HttpSession對(duì)象。

問題:上面兩個(gè)監(jiān)聽器功能是不是有些重復(fù)。

HttpSessionActivationListener監(jiān)聽器

8.HttpServletRequest事件、監(jiān)聽器

ServletRequestListener監(jiān)聽器

生命周期監(jiān)聽器,初始化后以及銷毀前調(diào)用

ServletRequestAttributeListener監(jiān)聽器

屬性改變監(jiān)聽器

AsyncListener監(jiān)聽器

與異步有關(guān),下面會(huì)講解

9.過濾器概念

介于servlet之前,可攔截過濾瀏覽器對(duì)servlet的請(qǐng)求,也可改變servlet對(duì)瀏覽器的響應(yīng)。常用于性能測(cè)評(píng)、用戶驗(yàn)證、字符替換、編碼設(shè)置等需求。

10.實(shí)現(xiàn)與設(shè)置過濾器

過濾器的基本方法及其代表含義

過濾器的設(shè)置

filename設(shè)置過濾器名稱,urlPatterns設(shè)置哪些url請(qǐng)求必須調(diào)用該過濾器

粗體部分代表觸發(fā)過濾器的時(shí)機(jī)。

11.舉例說明請(qǐng)求封裝器

實(shí)現(xiàn)字符替換過濾器

目標(biāo):將html語(yǔ)言直接出現(xiàn)在頁(yè)面中而被瀏覽器當(dāng)作html的一部分

實(shí)現(xiàn)編碼設(shè)置過濾器

目標(biāo):設(shè)置請(qǐng)求編碼,不像之前一樣在單個(gè)servlet中實(shí)現(xiàn),而是在過濾器中實(shí)現(xiàn)。request的setCharacterEncoding方法是針對(duì)請(qǐng)求body內(nèi)容,對(duì)于GET請(qǐng)求,必須取得請(qǐng)求參數(shù)的字節(jié)矩陣,重新指定編碼構(gòu)建字符串。

12.響應(yīng)封裝器

繼承HttpServletResponseWrapper類來對(duì)HttpServletResponse對(duì)象進(jìn)行封裝,使其具備能對(duì)響應(yīng)的內(nèi)容進(jìn)行壓縮處理。

13.異步處理

14.AsyncContext簡(jiǎn)介

servletrequest上提供了startAsync方法,有兩種形式,一種無參,一種參數(shù)為Servletrequest和Servletresponse。該方法可以取得AsyncContext對(duì)象,然后此次請(qǐng)求的響應(yīng)會(huì)被延后,并釋放容器分配的線程。此次對(duì)客戶端的響應(yīng)暫緩至調(diào)用AsyncContext的complete方法以及dispatch方法,前者表示響應(yīng)完成,后者表示指派特定的url進(jìn)行響應(yīng)。

使用時(shí)必須使用webServlet來標(biāo)注,可以設(shè)置其asyncSupported為true。

如果servlet前端有過濾器,則過濾器也需標(biāo)識(shí)其支持異步處理。將webFilter中的asyncSupported屬性設(shè)置為true。

15.模擬服務(wù)器推播

16.更多AsyncContext細(xì)節(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目標(biāo) servlet的生命周期 servletConfig與ServletContext定義,及其二者的區(qū)別 監(jiān)聽...
    arkulo閱讀 1,058評(píng)論 0 5
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,502評(píng)論 0 10
  • 經(jīng)典的Java面試題(第二部分),這部分主要是與Java Web和Web Service相關(guān)的面試題。 96、闡述...
    nnngu閱讀 737評(píng)論 0 8
  • IOC 控制反轉(zhuǎn)容器控制程序?qū)ο笾g的關(guān)系,而不是傳統(tǒng)實(shí)現(xiàn)中,有程序代碼之間控制,又名依賴注入。All 類的創(chuàng)建,...
    irckwk1閱讀 1,093評(píng)論 0 0
  • 廣告也屬于App創(chuàng)收的一種方式, 你在App內(nèi)展示廣告, 蘋果會(huì)付一些廣告費(fèi)給你, 并且還會(huì)減少一些對(duì)你App內(nèi)購(gòu)...
    面糊閱讀 606評(píng)論 0 51

友情鏈接更多精彩內(nèi)容