您好,登錄后才能下訂單哦!
Filter、Servlet與Listener在Java的功能各有哪些?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
1、Filter的功能
filter功能,它使用戶可以改變一個(gè) request和修改一個(gè)response. Filter 不是一個(gè)servlet,它不能產(chǎn)生一個(gè)response,它能夠在一個(gè)request到達(dá)servlet之前預(yù)處理request,也可以在離開 servlet時(shí)處理response.換種說(shuō)法,filter其實(shí)是一個(gè)”servlet chaining”(servlet 鏈).
一個(gè)Filter包括:
1)、在servlet被調(diào)用之前截獲;
2)、在servlet被調(diào)用之前檢查servlet request;
3)、根據(jù)需要修改request頭和request數(shù)據(jù);
4)、根據(jù)需要修改response頭和response數(shù)據(jù);
5)、在servlet被調(diào)用之后截獲.
服務(wù)器每次只調(diào)用setFilterConfig方法一次準(zhǔn)備filter 的處理;調(diào)用doFilter方法多次以處理不同的請(qǐng)求.FilterConfig接口有方法可以找到filter名字及初始化參數(shù)信息.服務(wù)器可以設(shè)置 FilterConfig為空來(lái)指明filter已經(jīng)終結(jié)。
每一個(gè)filter從doFilter()方法中得到當(dāng)前的request及response.在這個(gè)方法里,可以進(jìn)行任何的針對(duì)request及 response的操作.(包括收集數(shù)據(jù),包裝數(shù)據(jù)等).filter調(diào)用chain.doFilter()方法把控制權(quán)交給下一個(gè)filter.一個(gè) filter在doFilter()方法中結(jié)束.如果一個(gè)filter想停止request處理而獲得對(duì)response的完全的控制,那它可以不調(diào)用下 一個(gè)filter
例子:
首先新建一個(gè)Filter
/** * */ package com.ee.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * @author Administrator * */ public class LogFilter implements Filter { private FilterConfig filterConfig; public FilterConfig getFilterConfig() { System.err.println("...getFilterConfig..."); return filterConfig; } public void setFilterConfig(FilterConfig filterConfig) { System.err.println("...setFilterConfig..."); this.filterConfig = filterConfig; } /* (non-Javadoc) * @see javax.servlet.Filter#destroy() */ @Override public void destroy() { System.err.println("...filter destroy..."); } /* (non-Javadoc) * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.err.println("...doFilter..."); chain.doFilter(request, response);//看到這沒(méi),這只要是傳遞下一個(gè)Filter } /* (non-Javadoc) * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ @Override public void init(FilterConfig filterConfig) throws ServletException { System.err.println("...init Filter..."); this.filterConfig = filterConfig; } }
在web.xml里配置
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.ee.filter.LogFilter</filter-class> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
啟動(dòng)運(yùn)行
可以看到...init Filter...首先在TOMCAT啟動(dòng)時(shí)即被打印,然后在運(yùn)行里面再看到...doFilter...被打印。
2、servlet功能
1).Servlet 是什么?
Servlet是使用Java Servlet 應(yīng)用程序設(shè)計(jì)接口(API)及相關(guān)類和方法的 Java 程序。除了 Java Servlet API,Servlet 還可以使用用以擴(kuò)展和添加到 API 的 Java 類軟件包。Servlet 在啟用 Java 的 Web 服務(wù)器上或應(yīng)用服務(wù)器上運(yùn)行并擴(kuò)展了該服務(wù)器的能力。Java servlet對(duì)于Web服務(wù)器就好象Java applet對(duì)于Web瀏覽器。Servlet裝入Web服務(wù)器并在Web服務(wù)器內(nèi)執(zhí)行,而applet裝入Web瀏覽器并在Web瀏覽器內(nèi)執(zhí)行。Java Servlet API 定義了一個(gè)servlet 和Java使能的服務(wù)器之間的一個(gè)標(biāo)準(zhǔn)接口,這使得Servlets具有跨服務(wù)器平臺(tái)的特性。
Servlet 通過(guò)創(chuàng)建一個(gè)框架來(lái)擴(kuò)展服務(wù)器的能力,以提供在 Web 上進(jìn)行請(qǐng)求和響應(yīng)服務(wù)。當(dāng)客戶機(jī)發(fā)送請(qǐng)求至服務(wù)器時(shí),服務(wù)器可以將請(qǐng)求信息發(fā)送給 Servlet,并讓 Servlet 建立起服務(wù)器返回給客戶機(jī)的響應(yīng)。 當(dāng)啟動(dòng) Web 服務(wù)器或客戶機(jī)第一次請(qǐng)求服務(wù)時(shí),可以自動(dòng)裝入 Servlet。裝入后, Servlet 繼續(xù)運(yùn)行直到其它客戶機(jī)發(fā)出請(qǐng)求。Servlet 的功能涉及范圍很廣。例如,Servlet 可完成如下功能:
(1) 創(chuàng)建并返回一個(gè)包含基于客戶請(qǐng)求性質(zhì)的動(dòng)態(tài)內(nèi)容的完整的 HTML頁(yè)面。
(2) 創(chuàng)建可嵌入到現(xiàn)有 HTML 頁(yè)面中的一部分 HTML 頁(yè)面(HTML 片段)。
(3) 與其它服務(wù)器資源(包括數(shù)據(jù)庫(kù)和基于 Java 的應(yīng)用程序)進(jìn)行通信。
(4) 用多個(gè)客戶機(jī)處理連接,接收多個(gè)客戶機(jī)的輸入,并將結(jié)果廣播到多個(gè)客戶機(jī)上。例如,Servlet 可以是多參與者的游戲服務(wù)器。
(5) 當(dāng)允許在單連接方式下傳送數(shù)據(jù)的情況下,在瀏覽器上打開服務(wù)器至applet的新連接,并將該連
接保持在打開狀態(tài)。當(dāng)允許客戶機(jī)和服務(wù)器簡(jiǎn)單、高效地執(zhí)行會(huì)話的情況下,applet也可以啟動(dòng)客戶瀏覽器和服務(wù)器之間的連接??梢酝ㄟ^(guò)定制協(xié)議或標(biāo)準(zhǔn)(如 IIOP)進(jìn)行通信。
(6) 對(duì)特殊的處理采用 MIME 類型過(guò)濾數(shù)據(jù),例如圖像轉(zhuǎn)換和服務(wù)器端包括(SSI)。
(7) 將定制的處理提供給所有服務(wù)器的標(biāo)準(zhǔn)例行程序。例如,Servlet 可以修改如何認(rèn)證用戶。
2).Servlet 的生命周期
Servlet 的生命周期始于將它裝入 Web 服務(wù)器的內(nèi)存時(shí),并在終止或重新裝入 Servlet 時(shí)結(jié)束。
(1) 初始化
在下列時(shí)刻裝入 Servlet:
如果已配置自動(dòng)裝入選項(xiàng),則在啟動(dòng)服務(wù)器時(shí)自動(dòng)裝入
在服務(wù)器啟動(dòng)后,客戶機(jī)首次向 Servlet 發(fā)出請(qǐng)求時(shí)
重新裝入 Servlet 時(shí)裝入 Servlet 后,服務(wù)器創(chuàng)建一個(gè) Servlet 實(shí)例并且調(diào)用 Servlet 的 init() 方法。在初始化階段,Servlet 初始化參數(shù)被傳遞給 Servlet 配置對(duì)象。
(2) 請(qǐng)求處理
對(duì)于到達(dá)服務(wù)器的客戶機(jī)請(qǐng)求,服務(wù)器創(chuàng)建特定于請(qǐng)求的一個(gè)“請(qǐng)求”對(duì)象和一個(gè)“響應(yīng)”對(duì)象。服務(wù)器調(diào)用 Servlet 的 service() 方法,該方法用于傳遞“請(qǐng)求”和“響應(yīng)”對(duì)象。service() 方法從“請(qǐng)求”對(duì)象獲得請(qǐng)求信息、處理該請(qǐng)求并用“響應(yīng)”對(duì)象的方法以將響應(yīng)傳回客戶機(jī)。service() 方法可以調(diào)用其它方法來(lái)處理請(qǐng)求,例如 doGet()、doPost() 或其它的方法。
(3) 終止
當(dāng)服務(wù)器不再需要 Servlet, 或重新裝入 Servlet 的新實(shí)例時(shí),服務(wù)器會(huì)調(diào)用 Servlet 的 destroy() 方法。
3). Java Servlet API
Java Servlet 開發(fā)工具(JSDK)提供了多個(gè)軟件包,在編寫 Servlet 時(shí)需要用到這些軟件包。其中包括兩個(gè)用于所有 Servlet 的基本軟件包:javax.servlet 和 javax.servlet.http??蓮膕un公司的Web站點(diǎn)下載 Java Servlet 開發(fā)工具。 下面主要介紹javax.servlet.http提供的HTTP Servlet應(yīng)用編程接口。
HTTP Servlet 使用一個(gè) HTML 表格來(lái)發(fā)送和接收數(shù)據(jù)。要?jiǎng)?chuàng)建一個(gè) HTTP Servlet,請(qǐng)擴(kuò)展 HttpServlet 類, 該類是用專門的方法來(lái)處理 HTML 表格的 GenericServlet 的一個(gè)子類。 HTML 表單是由 <FORM> 和 </FORM> 標(biāo)記定義的。表單中典型地包含輸入字段(如文本輸入字段、復(fù)選框、單選按鈕和選擇列表)和用于提交數(shù)據(jù)的按鈕。當(dāng)提交信息時(shí),它們還指定服務(wù)器應(yīng)執(zhí)行哪一個(gè)Servlet(或其它的程序)。 HttpServlet 類包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是繼承的。
(1) init() 方法
在 Servlet 的生命期中,僅執(zhí)行一次 init() 方法。它是在服務(wù)器裝入 Servlet 時(shí)執(zhí)行的。 可以配置服務(wù)器,以在啟動(dòng)服務(wù)器或客戶機(jī)首次訪問(wèn) Servlet 時(shí)裝入 Servlet。 無(wú)論有多少客戶機(jī)訪問(wèn) Servlet,都不會(huì)重復(fù)執(zhí)行 init() 。
缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法來(lái)覆蓋它,典型的是管理服務(wù)器端資源。 例如,可能編寫一個(gè)定制 init() 來(lái)只用于一次裝入 GIF 圖像,改進(jìn) Servlet 返回 GIF 圖像和含有多個(gè)客戶機(jī)請(qǐng)求的性能。另一個(gè)示例是初始化數(shù)據(jù)庫(kù)連接。缺省的 init() 方法設(shè)置了 Servlet 的初始化參數(shù),并用它的 ServletConfig 對(duì)象參數(shù)來(lái)啟動(dòng)配置, 因此所有覆蓋 init() 方法的 Servlet 應(yīng)調(diào)用 super.init() 以確保仍然執(zhí)行這些任務(wù)。在調(diào)用 service() 方法之前,應(yīng)確保已完成了 init() 方法。
(2) service() 方法
service() 方法是 Servlet 的核心。每當(dāng)一個(gè)客戶請(qǐng)求一個(gè)HttpServlet 對(duì)象,該對(duì)象的service() 方法就要被調(diào)用,而且傳遞給這個(gè)方法一個(gè)“請(qǐng)求”(ServletRequest)對(duì)象和一個(gè)“響應(yīng)”(ServletResponse)對(duì)象作為參數(shù)。 在 HttpServlet 中已存在 service() 方法。缺省的服務(wù)功能是調(diào)用與 HTTP 請(qǐng)求的方法相應(yīng)的 do 功能。例如, 如果 HTTP 請(qǐng)求方法為 GET,則缺省情況下就調(diào)用 doGet() 。Servlet 應(yīng)該為 Servlet 支持的 HTTP 方法覆蓋 do 功能。因?yàn)?HttpServlet.service() 方法會(huì)檢查請(qǐng)求方法是否調(diào)用了適當(dāng)?shù)奶幚矸椒?,不必要覆蓋 service() 方法。只需覆蓋相應(yīng)的 do 方法就可以了。
當(dāng)一個(gè)客戶通過(guò)HTML 表單發(fā)出一個(gè)HTTP POST請(qǐng)求時(shí),doPost()方法被調(diào)用。與POST請(qǐng)求相關(guān)的參數(shù)作為一個(gè)單獨(dú)的HTTP 請(qǐng)求從瀏覽器發(fā)送到服務(wù)器。當(dāng)需要修改服務(wù)器端的數(shù)據(jù)時(shí),應(yīng)該使用doPost()方法。
當(dāng)一個(gè)客戶通過(guò)HTML 表單發(fā)出一個(gè)HTTP GET請(qǐng)求或直接請(qǐng)求一個(gè)URL時(shí),doGet()方法被調(diào)用。與GET請(qǐng)求相關(guān)的參數(shù)添加到URL的后面,并與這個(gè)請(qǐng)求一起發(fā)送。當(dāng)不會(huì)修改服務(wù)器端的數(shù)據(jù)時(shí),應(yīng)該使用doGet()方法。
Servlet的響應(yīng)可以是下列幾種類型:
一個(gè)輸出流,瀏覽器根據(jù)它的內(nèi)容類型(如text/HTML)進(jìn)行解釋。
一個(gè)HTTP錯(cuò)誤響應(yīng), 重定向到另一個(gè)URL、servlet、JSP。
(3) destroy() 方法
destroy() 方法僅執(zhí)行一次,即在服務(wù)器停止且卸裝Servlet 時(shí)執(zhí)行該方法。典型的,將 Servlet 作為服務(wù)器進(jìn)程的一部分來(lái)關(guān)閉。缺省的 destroy() 方法通常是符合要求的,但也可以覆蓋它,典型的是管理服務(wù)器端資源。例如,如果 Servlet 在運(yùn)行時(shí)會(huì)累計(jì)統(tǒng)計(jì)數(shù)據(jù),則可以編寫一個(gè) destroy() 方法,該方法用于在未裝入 Servlet 時(shí)將統(tǒng)計(jì)數(shù)字保存在文件中。另一個(gè)示例是關(guān)閉數(shù)據(jù)庫(kù)連接。
當(dāng)服務(wù)器卸裝 Servlet 時(shí),將在所有 service() 方法調(diào)用完成后,或在指定的時(shí)間間隔過(guò)后調(diào)用 destroy() 方法。一個(gè)Servlet 在運(yùn)行service() 方法時(shí)可能會(huì)產(chǎn)生其它的線程,因此請(qǐng)確認(rèn)在調(diào)用 destroy() 方法時(shí),這些線程已終止或完成。
(4) GetServletConfig()方法
GetServletConfig()方法返回一個(gè) ServletConfig 對(duì)象,該對(duì)象用來(lái)返回初始化參數(shù)和 ServletContext。ServletContext 接口提供有關(guān)servlet 的環(huán)境信息。
(5) GetServletInfo()方法
GetServletInfo()方法是一個(gè)可選的方法,它提供有關(guān)servlet 的信息,如作者、版本、版權(quán)。
當(dāng)服務(wù)器調(diào)用sevlet 的Service()、doGet()和doPost()這三個(gè)方法時(shí),均需要 “請(qǐng)求”和“響應(yīng)”對(duì)象作為參數(shù)?!罢?qǐng)求”對(duì)象提供有關(guān)請(qǐng)求的信息,而“響應(yīng)”對(duì)象提供了一個(gè)將響應(yīng)信息返回給瀏覽器的一個(gè)通信途徑。javax.servlet 軟件包中的相關(guān)類為ServletResponse和ServletRequest,而javax.servlet.http 軟件包中的相關(guān)類為HttpServletRequest 和 HttpServletResponse。Servlet 通過(guò)這些對(duì)象與服務(wù)器通信并最終與客戶機(jī)通信。Servlet 能通過(guò)調(diào)用“請(qǐng)求”對(duì)象的方法獲知客戶機(jī)環(huán)境,服務(wù)器環(huán)境的信息和所有由客戶機(jī)提供的信息。Servlet 可以調(diào)用“響應(yīng)”對(duì)象的方法發(fā)送響應(yīng),該響應(yīng)是準(zhǔn)備發(fā)回客戶機(jī)的。
例子:
創(chuàng)建一個(gè)servlet
/** * */ package com.ee.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author Administrator * */ public class LogServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.err.println("...doPost(req, resp)..."); } }
在web.xml中的配置:
<servlet> <servlet-name>LogServlet</servlet-name> <servlet-class>com.ee.servlet.LogServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogServlet</servlet-name> <url-pattern>/*</url-pattern><!-- 看到此沒(méi)有,這個(gè)攔截所有路徑 --> </servlet-mapping>
它的攔截規(guī)則:
當(dāng)一個(gè)請(qǐng)求發(fā)送到servlet容器的時(shí)候,容器先會(huì)將請(qǐng)求的url減去當(dāng)前應(yīng)用上下文的路徑作為servlet的映射url,比如我訪問(wèn)的是http://localhost/test/aaa.html,我的應(yīng)用上下文是test,容器會(huì)將http://localhost/test去掉,剩下的/aaa.html部分拿來(lái)做servlet的映射匹配。這個(gè)映射匹配過(guò)程是有順序的,而且當(dāng)有一個(gè)servlet匹配成功以后,就不會(huì)去理會(huì)剩下的servlet了(filter不同,后文會(huì)提到)。其匹配規(guī)則和順序如下:
1.精確路徑匹配。例子:比如servletA 的url-pattern為 /test,servletB的url-pattern為 /* ,這個(gè)時(shí)候,如果我訪問(wèn)的url為http://localhost/test ,這個(gè)時(shí)候容器就會(huì)先 進(jìn)行精確路徑匹配,發(fā)現(xiàn)/test正好被servletA精確匹配,那么就去調(diào)用servletA,也不會(huì)去理會(huì)其他的servlet了。
2.最長(zhǎng)路徑匹配。例子:servletA的url-pattern為/test/*,而servletB的url-pattern為/test/a/*,此時(shí)訪問(wèn)http://localhost/test/a時(shí),容器會(huì)選擇路徑最長(zhǎng)的servlet來(lái)匹配,也就是這里的servletB。
3.擴(kuò)展匹配,如果url最后一段包含擴(kuò)展,容器將會(huì)根據(jù)擴(kuò)展選擇合適的servlet。例子:servletA的url-pattern:*.action
4.如果前面三條規(guī)則都沒(méi)有找到一個(gè)servlet,容器會(huì)根據(jù)url選擇對(duì)應(yīng)的請(qǐng)求資源。如果應(yīng)用定義了一個(gè)default servlet,則容器會(huì)將請(qǐng)求丟給default servlet
3、Listener功能
它是基于觀察者模式設(shè)計(jì)的,Listener 的設(shè)計(jì)對(duì)開發(fā) Servlet 應(yīng)用程序提供了一種快捷的手段,能夠方便的從另一個(gè)縱向維度控制程序和數(shù)據(jù)。目前 Servlet 中提供了 5 種兩類事件的觀察者接口,它們分別是:4 個(gè) EventListeners 類型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 個(gè) LifecycleListeners 類型的,ServletContextListener、HttpSessionListener。如下圖所示:
Listener是Servlet的監(jiān)聽器,它可以監(jiān)聽客戶端的請(qǐng)求、服務(wù)端的操作等。通過(guò)監(jiān)聽器,可以自動(dòng)激發(fā)一些操作,比如監(jiān)聽在線的用戶的數(shù)量。當(dāng)增加一個(gè)HttpSession時(shí),就激發(fā)sessionCreated(HttpSessionEvent se)方法,這樣就可以給在線人數(shù)加1。常用的監(jiān)聽接口有以下幾個(gè):
ServletContextAttributeListener監(jiān)聽對(duì)ServletContext屬性的操作,比如增加、刪除、修改屬性。
ServletContextListener監(jiān)聽ServletContext。當(dāng)創(chuàng)建ServletContext時(shí),激發(fā)contextInitialized(ServletContextEvent sce)方法;當(dāng)銷毀ServletContext時(shí),激發(fā)contextDestroyed(ServletContextEvent sce)方法。
HttpSessionListener監(jiān)聽HttpSession的操作。當(dāng)創(chuàng)建一個(gè)Session時(shí),激發(fā)session Created(HttpSessionEvent se)方法;當(dāng)銷毀一個(gè)Session時(shí),激發(fā)sessionDestroyed (HttpSessionEvent se)方法。
HttpSessionAttributeListener監(jiān)聽HttpSession中的屬性的操作。當(dāng)在Session增加一個(gè)屬性時(shí),激發(fā)attributeAdded(HttpSessionBindingEvent se) 方法;當(dāng)在Session刪除一個(gè)屬性時(shí),激發(fā)attributeRemoved(HttpSessionBindingEvent se)方法;當(dāng)在Session屬性被重新設(shè)置時(shí),激發(fā)attributeReplaced(HttpSessionBindingEvent se) 方法。
下面我們開發(fā)一個(gè)具體的例子,這個(gè)監(jiān)聽器能夠統(tǒng)計(jì)在線的人數(shù)。在ServletContext初始化和銷毀時(shí),在服務(wù)器控制臺(tái)打印對(duì)應(yīng)的信息。當(dāng)ServletContext里的屬性增加、改變、刪除時(shí),在服務(wù)器控制臺(tái)打印對(duì)應(yīng)的信息。
要獲得以上的功能,監(jiān)聽器必須實(shí)現(xiàn)以下3個(gè)接口:
HttpSessionListener
ServletContextListener
ServletContextAttributeListener
例子:
/** * */ package com.ee.listener; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * @author Administrator * */ public class OnlineUserListener implements HttpSessionListener, ServletContextListener, ServletContextAttributeListener { private long onlineUserCount = 0; public long getOnlineUserCount() { return onlineUserCount; } /* (non-Javadoc) * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent) */ @Override public void attributeAdded(ServletContextAttributeEvent arg0) { } /* (non-Javadoc) * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent) */ @Override public void attributeRemoved(ServletContextAttributeEvent arg0) { } /* (non-Javadoc) * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent) */ @Override public void attributeReplaced(ServletContextAttributeEvent attributeEvent) { System.err.println("...attributeReplaced..."); } /* (non-Javadoc) * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) */ @Override public void contextDestroyed(ServletContextEvent arg0) { } /* (non-Javadoc) * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) */ @Override public void contextInitialized(ServletContextEvent arg0) { } /* (non-Javadoc) * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent) */ @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { onlineUserCount ++; toUpdateCount(httpSessionEvent); } /* (non-Javadoc) * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent) */ @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { onlineUserCount --; toUpdateCount(httpSessionEvent); } private void toUpdateCount(HttpSessionEvent httpSessionEvent){ httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount); } }
Web.xml
<listener> <listener-class>com.ee.listener.OnlineUserListener</listener-class> </listener>
JSP頁(yè)面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>主頁(yè)</title> </head> <body> <h5>你好!</h5> 在線人數(shù):<h2><%=request.getSession().getAttribute("onlineUserCount") %></h2> </body> </html>
看完上述內(nèi)容,你們掌握Filter、Servlet與Listener在Java的功能各有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。