詳細瞭解java監聽器和過濾器
1、介紹:
1)一組來自於Servlet規范下的接口,共有8個接口。在Tomcat中存在於Servlet-api.jar包
2)監聽器接口需要由開發人員親自實現,Http服務器提供的jar中並沒有對應的實現類
3)監聽器接口用於監控【作用域對象生命周期的變化時刻】以及【作用域對象共享數據的變化時刻】
2、作用域對象:
1)在Servlet規范中,認為在服務端內存中可以在某些條件下為兩個Servlet之間提供數據共享方案的對象,被稱為【作用域對象】
2)在Servlet規范下的作用域對象:
ServletContext
:全局作用域對象
HttpSession
:會話作用域對象
HttpServletRequest
:請求作用域對象
3、監聽器接口實現類開發規范:三步
1)根據監聽的實際情況,選擇對應的監聽器接口進行實現
2)重寫監聽器接口中聲明的【監聽事件處理方法】
3)在web.xml文件中將監聽器接口實現類註冊到Http服務器中
4、ServletContextListener
1)作用:通過這個接口合法的檢測全局作用域對象的兩個時刻
被初始化時刻 被銷毀時刻
2)監聽事件處理方法
public void contextInitialized():
在全局作用域對象被Http服務器初始化是調用
public void contextDestroyed():
在全局作用域對象被Http服務器銷毀時調用
5、ServletContextAttributeListener接口:
1)作用:通過這個接口合法的檢測全局作用域對象共享數據變化的時刻
2)監聽事件處理方法:
public void contextAdded():
在全局作用域對象添加共享數據時調用
public void contextReplaced():
在全局作用域對象更新共享數據時調用
public void contextRemoved():
在全局作用域對象刪除共享數據時調用
6、全局作用域對象共享數據變化時刻
ServletContext application=request.getServletContext();
application.setAttribute("key1",100);
//新增共享數據
application.setAttribute("key1",200);
//更新共享數據
application.removeAttribute("key1");
//刪除共享數據
代碼實現
以下就以ServletContextListener接口和ServletContextAttributeListener接口
第一步:選擇ServletContextListener接口進行實現
第二步:重寫監聽器接口聲明的【監聽事件處理方法】
public class OneListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("Initialized............"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("Destroyed............."); } }
第三步:在web.xml中將監聽器接口實現類註冊到Http服務器中
<listener> <listener-class>school.xauat.listener.OneListener</listener-class> </listener>
由於ServletContext【全局作用對象的生命周期】貫穿網站的整個運行期間
Servlet之間數據共享中有具體的ServletContext生命周期
因此在Tomcat服務器啟動過程時,執行contextInitialize()方法
Initialized…………
在Tomcat服務器準備關閉時,執行contextDestroyed()方法
Destroyed………….
第一步:選擇ServletContextAttributeListener接口進行實現
第二步:重寫監聽器接口聲明的【監聽事件處理方法】
public class OneListener implements ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent scae) { System.out.println("ServletContextAttribute is added......"); } @Override public void attributeRemoved(ServletContextAttributeEvent scae){ System.out.println("ServletContextAttribute is removed......"); } @Override public void attributeReplaced(ServletContextAttributeEvent scae){ System.out.println("ServletContextAttribute is replaced......"); } }
第三步:在web.xml文件中將監聽器接口實現類註冊到Tomcat服務器中
<servlet> <servlet-name>OneServlet</servlet-name> <servlet-class>school.xauat.controller.OneServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OneServlet</servlet-name> <url-pattern>/one</url-pattern> </servlet-mapping> <listener> <listener-class>school.xauat.listener.OneListener</listener-class> </listener>
監聽事件
public class OneServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通過請求對象獲取全局作用域對象 ServletContext application=request.getServletContext(); //向全局作用域對象中添加共享數據 application.setAttribute("key",100); //更改全局作用域對象中的共享數據 application.setAttribute("key",500); //刪除全局作用域對象中的共享數據 application.removeAttribute("key"); } }
運行結果
Servt規范擴展———–過濾器接口
1、介紹:
1)來自於Servlet規范下的接口,在Tomcat中存在於servlet-api.jar
包中
2)Filter接口實現類由開發人員負責提供的,Http服務器不負責提供
3)Filter接口會在Http服務器調用資源文件之前,對Http服務器進行攔截
2、具體作用:
1)攔截Http服務器,幫助Http服務器去檢測當前請求的合法性
2)攔截Http服務器,對當前請求進行增強操作
3、Filter接口實現類的開發步驟:三步
1)創建一個java類實現Filter接口
2)重寫Filter接口中的doFilter方法
3)在web.xml文件中將過濾器接口實現類註冊到Http服務器
過濾器檢測請求合法性
第一步:創建一個java類實現Filter接口
第二步:重寫doFilter接口中的doFilter()方法
/** * http://localhost:8080/myWeb/mm.jpg?age=89 */ public class OneFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //通過攔截的請求對象來得到請求包中的參數信息,從而得到來訪用戶的真實年齡 String age=servletRequest.getParameter("age"); //根據這個年齡幫助我們的Http服務器判斷本次請求的合法性 if(Integer.valueOf(age)<70){ //將攔截請求對象和相應對象交換給Tomcat,由Tomcat繼續調用資源文件 filterChain.doFilter(servletRequest,servletResponse); }else{ //過濾器代替Http服務器拒絕本次請求 servletResponse.setContentType("text/html;charset=utf-8"); PrintWriter out=servletResponse.getWriter(); out.print("<center><font style='color:red;font-size:40px'>不合適!!!!</font></center>"); } } }
第三步:在web.xml文件中將過濾器接口實現類註冊到Http服務器
<!--將過濾器類文件交給Tomcat--> <filter> <filter-name>OneFilter</filter-name> <filter-class>school.xauat.filter.OneFilter</filter-class> </filter> <!--通知Tomcat在調用何種資源文件是需要被當前過濾器攔截--> <filter-mapping> <filter-name>OneFilter</filter-name> <url-pattern>/mm.jpg</url-pattern> </filter-mapping>
過濾器對請求對象進行增強服務
當有多個以post的請求訪問服務器時,需要對每個Servlet接口實現類中doPost()方法進行以下操作,增加的開發的難度。
response. setCharacterEncoding(“utf-8”)
以下展示過濾器的作用:
第一步:創建java實現Filter接口
第二步:重寫Filter接口下的doFilter()方法
public class OneFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); filterChain.doFilter(servletRequest,servletResponse); } }
第三步:在web.xml文件中將過濾器接口實現類註冊到Http服務器
<servlet> <servlet-name>OneServlet</servlet-name> <servlet-class>school.xauat.controller.OneServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OneServlet</servlet-name> <url-pattern>/one</url-pattern> </servlet-mapping> <servlet> <servlet-name>TwoServlet</servlet-name> <servlet-class>school.xauat.controller.TwoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TwoServlet</servlet-name> <url-pattern>/two</url-pattern> </servlet-mapping> <!--註冊Filter類--> <filter> <filter-name>OneFilter</filter-name> <filter-class>school.xauat.filter.OneFilter</filter-class> </filter> <filter-mapping> <filter-name>OneFilter</filter-name> <!--通知Tomcat在調用所有資源文件之前都需要調用OneFilter進行攔截--> <url-pattern>/*</url-pattern> </filter-mapping>
OneServlet
public class OneServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通過請求對象獲取請求體中的請求參數 String userName=request.getParameter("userName"); System.out.println("OneServlet----->"+userName); } }
TwoServlet
public class TwoServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通過請求對象獲取請求體中的請求參數 String userName=request.getParameter("userName"); System.out.println("TwoServlet---->"+userName); } }
4、Filter攔截地址的格式
1)命令格式:
<filter-mapping>
<filter-name><OneFilter/filter-name>
<url-pattern>攔截地址</url-pattern>
</filter-mapping>
2)命令作用:
攔截地址通知Tomcat在調用和何種資源文件之前需要調用OneFilter過濾進行攔截
3)要求Tomcat在調用某一個具體文件之前,來調用OneFilter進行攔截
<url-pattern>/目錄/文件名</url-pattern>
4)要求Tomcat在調用某一個文件夾下所有的資源文件之前,來調用OneFilter進行攔截
<url-pattern>/目錄/*</url-pattern>
5)要求Tomcat在調用任意文件夾下的某種類型文件之前,來調用OneFilter攔截
<url-pattern>*.jpg</url-pattern>
6)要求Tomcat在調用網站中任意文件時,來調用OneFilter攔截
<url-pattern>/*</url-pattern>
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望你能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Web三大組件之Filter,Listener和Servlet詳解
- Java中使用Filter過濾器的方法
- 詳解JavaWeb中的過濾器Filter
- Java過濾器doFilter裡chain.doFilter()函數的理解
- 深入瞭解Java中的過濾器Filter和監聽器Listener