国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Servlet、Filter、Listener總結

2019-11-14 22:43:20
字體:
來源:轉載
供稿:網友
Servlet、Filter、Listener總結

servlet規范提供了一組標準的servlet api。servlet容器就是servlet規范的實現。

1、In Action

(1)寫一個類繼承HttpServlet;

(2)重寫其中的方法。

1、TipS

(1)Servlet生命周期

每個Servlet都有自己的生命周期。Servlet的生命周期由web服務器維護。

服務器在啟動時(配置了load-on-startup,且值不為0)或第一次請求servlet時(若沒有設置load-on-startup,或值為0)初始化一個Servlet對象,然后用這個Servlet對象處理所有客戶端請求。服務器關閉時才銷毀這個Servlet對象。

無論請求多少次Servlet,最多只有一個Servlet實例。多個客戶端并發請求Servlet時,服務器會啟動多個線程分別執行該Servlet的service()方法。service()方法里通過請求的方法來決定是調用doGet()還是doPost()方法。

java EE 5開始,servlet增加了兩個影響servlet生命周期的注解:@PostConstruct和@PReDestroy。這兩個注解用來修飾非靜態的void()方法,且此方法不能拋出異常聲明。

PreDestroy中的Destroy指的是servlet的銷毀,而不是destroy()方法。

servlet的生命周期:

服務器加載servlet——servlet構造函數——@PostConstruct修飾的方法——init()方法——service()方法——destroy()方法——@PreDestroy修飾的方法——服務器卸載servlet完畢。

支持@PostConstruct和@PreDestroy注解的服務器要支持到servlet2.5及以上規范。Tomcat 5僅支持到servlet2.4規范。

服務器啟動時,會遍歷web應用的WEB-INF/classes下的所有class文件與WEB-INF/lib下的所有jar文件,以檢查哪些類使用了注解。不支持注解的服務器不會這樣做。若應用程序中沒有使用任何注解,可在web.xml中設置<web-app>的metadata-complete屬性為true來關閉服務器啟動時例行的注解檢查。

(2)servlet之間的跳轉

servlet之間可以相互跳轉,從一個servlet程序跳轉到另一個servlet。servlet的跳轉可以實現程序模塊化。MVC框架中都使用了servlet跳轉。

轉向(Forward)是通過RequestDispatcher對象的forward()方法實現的。RequestDispatcher通過HttpServletRequest(或者ServletContext對象)的getRequestDispatcher()方法獲得,其中的參數必須以/開始,/表示本webApp的根目錄。可以Forward到servlet、jsp頁面,甚至可以跳轉到另外一個文件或WEB-INF文件夾下的文件。

重定向(Redirect):重定向是利用服務器返回的狀態碼實現的。客戶端瀏覽器請求服務器時,服務器端會返回一個狀態碼。服務器端通過response的setStatus()方法設置狀態碼。

狀態碼:

200表示一切正確; 301、302表示該資源已不存在或換了地址,客戶端需重定向到一個新的資源,服務器響應中會附帶這個新資源地址;401表示沒有權限訪問;404表示資源不存在;

HttpServletResponse把setStatus()和setHeader()方法封裝成sendRedirect()方法;

如:response.setStatus(302);

response.setHeader("Location","http://www.baidu.com");

現在可以直接調用response.sendRedirect("http://www.baidu.com");

自動刷新(Refresh):

不僅可以實現一段時間后自動跳轉到另一個頁面,還可以實現一段時間后自動刷新本頁面。如:

response.setHeader("Refresh", "1000; URL=http://www.baidu.com" );

URL指定的網址是1s后跳轉的頁面。當URL設置的路徑為servlet自己的路徑時,就會每隔1s自動刷新本頁面一次。自動實現和重定向原理一樣,當為時間設為0,URL設為一個網址,效果就是重定向。

(3)servlet是線程不安全的。要謹慎使用類的變量。

線程安全:指多線程并發執行時,會不會出現問題。若有問題,則是線程不安全的。

多個用戶同時請求同一個servlet時,Tomcat會派生出多條線程執行servlet的代碼。因此servlet是線程不安全的。

多線程并發的讀寫會導致數據不同步的問題。

多線程并發的讀寫servlet類屬性會導致數據不同步,但若只是并發地讀取屬性而不寫入,則不存在數據不同步問題。因此servlet里的只讀屬性最好定義為final類型。

(4)一個servlet類只會有一個實例。

(5)Filter

Filter、Listener是servlet規范里德兩個高級特性。不同于servlet,它們不用于處理客戶端請求,只用于對request、response進行修改或者對context、session、request事件進行監聽。

多個Filter就組成了一個FilterChain。

一個Filter必須實現javax.servlet.Filter接口。Filter需要配置在web.xml中才能生效。其中<dispatcher>配置到達servlet的方式。默認為request。

request:表示僅當直接請求servlet時才生效。

forward:表示僅當某servlet通過forward到該servlet時才生效。

多個Filter的執行有先后順序,規則是<filter-mapping>配置在前面的Filter執行要早于配置在后面的Filter。

頁面編碼方式與Filter編碼方式必須一致。此外,若表單是get方式提交的,需要修改Tomcat的/conf/server.xml文件,指定URIEncoding,默認為ISO-8859-1,否則依然會亂碼。

Filter中,若在chain.doFilter()上加一個try....catch語句,就能捕捉servlet中拋出的異常,然后根據不同的異常進行不同的異常處理。

Filter和特定的URL關聯,只有當客戶請求訪問此URL時,才會觸發過濾器調用doFilter方法!

過濾器的初始化,即被調用init()方法是webApp應用被Tomcat加載就執行。

Filter配置多個url-pattern:

http://weidongke123-126-com.VEvb.com/blog/1032546

(6)Listener

Listener用于監聽Java Web程序中的事件,如創建、屬性修改、刪除session、request、context等,并觸發相應的事件。Servlet2.5規范中共有8種Listener,分別完成對不同事件的監聽。其中兩個Listener能監聽存放在session中的對象。共有6種Event。

Java web程序只要記住該類事件觸發時一定會調用相應的Listener相應方法,并傳回一個Event對象。觸發時,服務器會順次執行各個Listener的相應方法。

HttpSessionListener接口、ServletContextListener、ServletRequestListener分別用于監控session、context、request的創建和銷毀。

HttpSessionListener:監聽session的創建和銷毀。創建session時執行sessionCreated()方法。超時或執行session.invalidate()時執行sessionDestroyed()方法。

ServletContextListener:監聽context的創建和銷毀。context代表當前的web應用程序。服務器啟動或熱部署war包時執行contextInitialized()方法。服務器關閉或只關閉該web時會執行contextDestroyed()方法。該listener可用于啟動時獲取web.xml里配置的初始化參數。

ServletRequestListener:監聽request的創建和銷毀。用戶每次請求request都會執行requestInitialized()方法。request處理完畢自動銷毀前執行requestDestroyed()方法。

HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener用于監聽session、context、request的屬性變化。當向被監聽對象中添加、修改、刪除屬性時,會分別執行對應的方法。

HttpSessionBindingListener和HttpSessionActivationListener用于監控session內的對象。此兩個Listener不需要在web.xml中聲明。

HttpSessionBindingListener:當對象被放到session里時,執行valueBound()方法。當對象被從session里移除時,執行valueUnbound()方法。對象必須實現該Listener接口。

HttpSessionActivationListener:服務器關閉時,會將session里的內容保存到硬盤上。服務器重新啟動時,會將session內容從硬盤上重新加載。當session里的對象被鈍化時,執行sessionWillPassivate()方法。當對象被重新加載時,執行sessionDidActtivate()。對象必須實現該Listener接口。

<listener>標簽一般配置在<servlet>標簽的前面。

四個session監聽器接口和與之關聯的兩個session事件。

(7)ServletContext

servlet容器在啟動時會加載web應用,并為每個web應用創建唯一的ServletContext對象,被同一個web應用中所有組件共享。 在web運行期間,ServletContext設置的屬性一直存在。當web應用被關閉時(如關閉Tomcat),servlet容器銷毀ServletContext對象。

(8)cookie

通過cookie的setMaxAge()方法設置cookie的有效期。

(9)filter、listener、servlet啟動順序

http://m.survivalescaperooms.com/topic/1133753

2、PS (1) servlet

init() service() destroy()

其中init()、destroy()方法只會被服務器執行一次。

(2) ServletContext Listener

contextInitialized() contextDestroyed()

(3) Filter

init() doFilter() destroy()

其中init()是web程序啟動時調用此方法,用于初始化該Filter;

chain.doFilter()將請求傳給下一個Filter或servlet;因此,在doFilter()方法中一定要執行chain.doFilter(),否則reqeust不會交給后面的Filter或servlet。

web程序關閉時調用destroy()方法;

init()和destroy()方法只會被調用一次,doFilter()方法每次有客戶端請求都會被調用一次。

(4)

所有HTTP頭數據都可以通過request相應的方法得到。

servlet規范是建立在HTTP規范基礎上的。

servlet有一個方法getLastModified(),返回該文檔的最后修改時間,默認為-1,表示該文檔永遠是最新的。

(5)Java web目錄結構

web程序部署在Tomcat的/webapps下面。如webapps/web1、webapps/web2。

這兩個不同的web應用分別稱為兩個context,路徑/web1、/web2稱為上下文路徑(ContextPath)。

若不使用上下文路徑,web程序需放到webapps/ROOT下面,ROOT文件夾下的程序使用http://localhost:8080/訪問。

根據servlet規范,web程序有自己特定的結構,部署時必須按照這樣的結構部署。WEB-INF文件夾,里面有classes和lib文件夾,web.xml文件。

Java web應用程序的WEB-INF有個特性:任何人都不能通過瀏覽器直接獲取其文件夾下面的文件。WEB-INF下的文件是受保護的,這保證了文件的安全性。WEB-INF下的文件不能通過瀏覽器直接獲取到,但可以通過程序讀取到。

(6)以get方式訪問時,會執行doGet方法,但執行前會先執行getLastModified方法,若瀏覽器發現此方法返回的值與上次訪問時返回的值相同,則認為此文檔沒有更新,瀏覽器采用緩存而不執行doGet方法。若此方法返回-1,則認為是時刻更新的,總是執行doGet方法。

以post方式訪問時,會執行doPost方法,執行前不會執行getLastModified方法。

(7)在web.xml中,<servlet>標簽里可以使用<init-param>標簽配置初始化參數,

包括一個參數名稱<param-name>和一個參數值<param-value>。

servlet中可使用getServletContext().getInitParameter()取得配置的初始化參數值。

在servlet中,通過getInitParameter()來獲取初始化參數值。

還可以使用getInitParameterNames()方法返回所有的參數名稱。

這些初始化的參數,也可由ServletConfig對象取得。Servlet提供getServletConfig()返回ServletConfig對象。

(8)上下文參數(context-param)

由于init-param是配置在<servlet>標簽里的,只能由這個servlet來讀取。它不是全局的參數,不能被其它的servlet讀取。若要配置一個所有servlet都能讀取的參數,需要用到上下文參數。使用標簽<context-param>配置。如:

<context-param>

<param-name>name</param-name>

<param-value>aaa</param-value>

</context-param>

獲取context-param可使用ServletContext對象。Servlet中通過getServletConfig().getServletContext()來獲取一個ServletContext對象。使用ServletContext的getInitParameter()方法來獲取指定名稱的全局初始化參數,通過getInitParameterNames()獲取所有的context-param參數名稱。

servletContext.getRealPath();返回web應用程序內相對網址對應的絕對路徑;

(9)從Java EE 5開始,<servlet-mapping>標簽可以配置多個<url-pattern>。*表示任意長度的字符串。

web編程的過程就是通過請求分析客戶需要什么信息或者進行了什么操作,然后進行一系列的處理,最后通過響應結果顯示給客戶。

客戶端瀏覽器發出的請求被封裝成為一個HttpServletRequest對象。

服務器對客戶端瀏覽器做出的響應被封裝成了一個HttpServletResponse對象。

response.getWriter()用于寫字符型數據,response.getOutputStream()用于寫二進制數據。

不同的輸出類型需要聲明不同的ContentType屬性。

(10)圖片驗證碼的原理:

服務器生成一個包含隨機的字符串的圖片發給客戶端,客戶端提交數據時需要填寫字符串作為驗證。由于字符串保存在圖片中,機器很難識別,從而可防止有人使用計算機程序惡意發送信息的目的。

<img src=""/>顯示圖片驗證碼,如:<img src="servlet/IdentityServlet"/>。

(11)資源注射(@Resource):是Java EE5規范,Tomcat6開始支持的功能。

即不需要servlet主動去讀取資源,Tomcat啟動時會把web.xml里配置的信息主動注射到servlet里。

注解是一種特殊的接口。

如:

@Resource(name="messageNameInWebXml")

private String message;

表示message的值會在servlet運行時動態注入。web.xml中配置一個名為messageNameInWexXml的參數。在web.xml中使用標簽<env-entry>配置。

(12)get提交時URL總長度不能超過255個字符。

(13)解析二進制數據流比較麻煩,有很多類庫以及完成了這項工作。如Apache Commons Fileupload類庫。因此使用Apache的commons-fileupload實現文件上傳。commons-fileupload從1.2版本開始支持上傳監聽器,能實時監聽上傳情況。

(14)實時顯示上傳進度的原理

服務器在處理上傳文件的同時,將上傳文件的信息如文件總長度、已上傳多少、傳輸速率等寫入session。客戶端瀏覽器利用Ajax技術新開一個獨立的線程從session中獲取上傳進度信息,并實時顯示。ajax技術能不刷新頁面獲取服務器數據。

commons-fileupload1.2版本支持上傳監聽。監聽器需要實現ProgressListener接口。并需要把監聽器添加到上傳組件上。

添加了監聽器后,上傳組件在上傳文件時,會不斷回調方法,回傳數據。

上傳文件時,若不對表單做特別處理,提交表單后會轉到另一個頁面,造成頁面的刷新。在新頁面顯示之前,瀏覽器會因等待而顯示白屏。可以對表單做一些處理,使提交表單后原頁面內容不變,同時顯示進度條,直到文件上傳結束。方法是更改form的target屬性。target屬性默認為_self。若target為默認值,則提交后的新頁面會在當前窗口顯示,造成當前窗口短暫白屏。在頁面內添加一個隱藏的iframe(指定iframe的寬高為0實現隱藏),把target屬性指定為該iframe,則提交后的新頁面會在iframe內顯示。故上傳文件時當前頁面看不出任何變化。

(15)內容替換Filter

內容替換Filter的工作原理是:在servlet將內容輸出到response時,response將內容緩存起來,在Filter中進行替換,然后再輸出到客戶端瀏覽器。由于默認的response不能嚴格緩存輸出內容,因此需要自定義一個具備緩存功能的response。可以通過繼承javax.servlet.http.HttpServletResponseWrapper類實現。該類覆蓋了getWriter()方法,當Servlet中使用該response對象調用getWriter()來輸出內容時,內容將被輸出到CharArrayWriter對象(字符數組Writer)中,達到緩存的效果。

自定義的response重寫getWriter()方法:

public PrintWriter getWriter() throws IOException {

return new PrintWriter(charArrayWriter);

}

Filter中將自定義的response傳進servlet中。如:

HttpCharacterResponseWrapper response = new HttpCharacterResponseWrapper((HttpServletResponse)res);

chain.doFilter(req, response);

String output = response.getCharArrayWriter().toString();

//對output進行處理

PrintWriter out = res.getWriter();

out.write(output);

(16)GZIP壓縮Filter

網站常使用GZIP壓縮算法對網頁內容進行壓縮,然后傳給瀏覽器,以減少數據傳輸量、提高響應速度。瀏覽器收到GZIP壓縮數據后會自動解壓并正確顯示。GZIP加速常用來解決網速慢的瓶頸。

判斷瀏覽器是否支持GZIP自動解壓的依據是瀏覽器提供的Header信息(Accept-Encoding),

(17)使用Filter在圖像上動態加上一個Logo

工作原理和GZIP類似,先把圖像數據緩存起來,然后對圖像數據進行水印處理后輸出到瀏覽器。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遂昌县| 顺昌县| 宾川县| 衡东县| 中阳县| 高阳县| 南皮县| 申扎县| 永新县| 永年县| 玉门市| 磴口县| 静海县| 巴楚县| 丘北县| 象山县| 昌图县| 泸水县| 永年县| 霞浦县| 孝昌县| 昆山市| 名山县| 滦平县| 五河县| 防城港市| 望江县| 隆尧县| 兰坪| 合阳县| 衡南县| 二连浩特市| 江城| 奉贤区| 平山县| 龙海市| 天水市| 福泉市| 建湖县| 阳新县| 遵义市|