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é)
