java---Listener Filter知識點學習

##Listener

> 監聽器

* 能做什么事?

> 監聽某一個事件的發生。 狀態的改變。


* 監聽器的內部機制

> 其實就是接口回調.


####接口回調

* 需求:

> A在執行循環,當循環到5的時候, 通知B。

> 事先先把一個對象傳遞給 A , 當A 執行到5的時候,通過這個對象,來調用B中的方法。 但是注意,不是直接傳遞B的實例,而是傳遞一個接口的實例過去。

?

###Web監聽器

> 總共有8個 劃分成三種類型

1. 定義一個類,實現接口

2. 注冊 | 配置監聽器

### 監聽三個作用域創建和銷毀

request ---httpServletRequest
session ---httpSession
aapplication --- ServletContext

1. ServletContextListener

? ? ? ? ? ? ? servletcontext創建:啟動服務器的時候

? ? ? ? ? ? ? servletContext銷毀:?關閉服務器. 從服務器移除項目

?

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyServletContextListener implements ServletContextListener{public void contextDestroyed(ServletContextEvent arg0) {// TODO Auto-generated method stubSystem.out.println("初始化......");}public void contextInitialized(ServletContextEvent arg0) {// TODO Auto-generated method stubSystem.out.println("銷毀了......");}}

?

?

注冊代碼:

 ServletContextListener 監聽器的配置<listener><listener-class>com.zyz.listener.MyServletContextListener</listener-class>  </listener>

?

?

?

2. ServletRequestListener

request創建:訪問服務器上的任意資源都會有請求出現。

? ? ? ? ? ? ?訪問 html: 會
? ? ? ? ? ? ?訪問 jsp: 會
? ? ? ? ? ? ?訪問 servlet : 會

request銷毀:服務器已經對這次請求作出了響應。

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;public class MyServletRequestListener implements ServletRequestListener {public void requestDestroyed(ServletRequestEvent arg0) {// TODO Auto-generated method stubSystem.out.println("servletrequest 銷毀了");}public void requestInitialized(ServletRequestEvent arg0) {// TODO Auto-generated method stubSystem.out.println("servletrequest 初始化了");}/** servletrequest 初始化了servletrequest 銷毀了*/}

?

注冊代碼:

ServletRequestListener 監聽器配置<listener><listener-class>com.zyz.listener.MyServletRequestListener</listener-class>  </listener>

?

3. HttpSessionListener

session的創建

只要調用getSession

  html: 不會
  jsp: 會 getSession();
  servlet: 會

session的銷毀

  超時 30分鐘
? ? 非正常關閉 銷毀

? ? 正常關閉服務器(序列化)

public class MySessionListener implements HttpSessionListener {

@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("創建session了");
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("銷毀session了");
}
}

?

?

作用:
ServletContextListener

利用它來,在servletcontext創建的時候,
? ? 1. 完成自己想要的初始化工作

? ? ?2. 執行自定義任務調度。 執行某一個任務。 Timer

?

?

HttpSessionListener

統計在線人數.

?


### 監聽三個作用域屬性狀態變更

> 可以監聽在作用域中值 添加 | 替換 | 移除的動作。

* servletContext --- ServletContextAttributeListener

* request --- ServletRequestAttributeListener

* session --- HttpSessionAttributeListener

?

?

### 監聽httpSession里面存值的狀態變更

> 這一類監聽器不用注冊。

* HttpSessionBindingListener

> 監聽對象與session 綁定和解除綁定 的動作

?

1. 讓javaBean 實現該接口即可

@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("對象被綁定進來了");
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("對象被解除綁定");
}

?

* HttpSessionActivationListener

> 用于監聽現在session的值 是 鈍化 (序列化)還是活化 (反序列化)的動作

* 鈍化 (序列化)

> 把內存中的數據 存儲到硬盤上

* 活化 (反序列化)

> 把硬盤中的數據讀取到內存中。


* session的鈍化活化的用意何在

> session中的值可能會很多, 并且我們有很長一段時間不使用這個內存中的值, 那么可以考慮把session的值可以存儲到硬盤上【鈍化】,等下一次在使用的時候,在從硬盤上提取出來。 【活化】

* 如何讓session的在一定時間內鈍化.

> 做配置即可

1. 在tomcat里面 conf/context.xml 里面配置

對所有的運行在這個服務器的項目生效

2. 在conf/Catalina/localhost/context.xml 配置

對 localhost生效。 localhost:8080

3. 在自己的web工程項目中的 META-INF/context.xml

只對當前的工程生效。

maxIdleSwap : 1分鐘不用就鈍化
directory : 鈍化后的那個文件存放的目錄位置。

D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\itheima

<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>


##Filter

> 過濾器 , 其實就是對客戶端發出來的請求進行過濾。 瀏覽器發出, 然后服務器派servlet處理。 在中間就可以過濾, 其實過濾器起到的是攔截的作用。

* 作用

1. 對一些敏感詞匯進行過濾
2. 統一設置編碼
3. 自動登錄

...

###如何使用Filter

1. 定義一個類, 實現Filter

public class FilterDemo implements Filter {

public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("來到過慮器了。。。");
chain.doFilter(request, response);
}

public void init(FilterConfig fConfig) throws ServletException {
}

}

2. 注冊過濾器

> 在web.xml里面注冊,注冊的手法與servlet基本一樣。


<filter>
<display-name>FilterDemo</display-name>
<filter-name>FilterDemo</filter-name>
<filter-class>com.itheima.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


###Filter的生命周期

* 創建

> 在服務器啟動的時候就創建。

* 銷毀

> 服務器停止的時候。


###Filter執行順序

1. 客戶端發出請求,先經過過濾器, 如果過濾器放行,那么才能到servlet

2. 如果有多個過濾器, 那么他們會按照注冊的映射順序 來 排隊。 只要有一個過濾器, 不放行,那么后面排隊的過濾器以及咱們的servlet都不會收到請求。


##Filter細節:

1. init方法的參數 FilterConfig , 可以用于獲取filter在注冊的名字 以及初始化參數。 其實這里的設計的初衷與ServletConfig是一樣的。

2. 如果想放行,那么在doFilter 方法里面操作,使用參數 chain


chain.doFilter(request, response); 放行, 讓請求到達下一個目標。

3. <url-pattern>/*</url-pattern> 寫法格式與servlet一樣。

1. 全路徑匹配 以 / 開始

/LoginServlet

2. 以目錄匹配 以 / 開始 以 * 結束

/demo01/* 攔截文件夾demo01下的所有

3. 以后綴名匹配 以 * 開始 以后綴名結束 (例如*.jsp攔截所有的jsp文件)

*.jsp *.html *.do

4. 針對 dispatcher 設置

REQUEST : 只要是請求過來,都攔截,默認就是REQUEST
FORWARD : 只要是轉發都攔截。
ERROR : 頁面出錯發生跳轉
INCLUDE : 包含頁面的時候就攔截。


###自動登錄

* 需求分析


####1. 搭建環境

1. 搭建數據庫

2. 搭建頁面


###登錄servlet代碼


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {
String userName = request.getParameter("username");
String password = request.getParameter("password");
String autoLogin = request.getParameter("auto_login");
UserBean user = new UserBean();
user.setUsername(userName);
user.setPassword(password);

UserDao dao = new UserDaoImpl();
UserBean userBean = dao.login(user);

if(userBean != null){
//成功了,進入首頁
request.getSession().setAttribute("userBean", userBean);
response.sendRedirect("index.jsp");
}else{
//不成功...
request.getRequestDispatcher("login.jsp").forward(request, response);
}

} catch (SQLException e) {
e.printStackTrace();
}
}


##過濾器代碼

> 過濾器的核心不是完成攔截不給 , 還是放行顯示。 它的核心是在放行之前,幫用戶完成登錄的功能。

* 實現思路

1. 先判斷session是否有效, 如果有效,就不用取cookie了,直接放行。

2. 如果session失效了,那么就取 cookie。

1. 沒有cookie 放行

2. 有cookie

1. 取出來cookie的值,然后完成登錄
2. 把這個用戶的值存儲到session中

3. 放行。

/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {

try {
HttpServletRequest request = (HttpServletRequest) req;

//先判斷,現在session中還有沒有那個userBean.
UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
//還有,有效。
if(userBean != null){
chain.doFilter(request, response);
}else{
//代表session失效了。

//2. 看cookie。

//1. 來請求的時候,先從請求里面取出cookie , 但是cookie有很多的key-value
Cookie[] cookies = request.getCookies();
//2. 從一堆的cookie里面找出我們以前給瀏覽器發的那個cookie
Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");

//第一次來
if(cookie == null){
chain.doFilter(request, response);
}else{

//不是第一次。

String value = cookie.getValue();
String username = value.split("#itheima#")[0];
String password = value.split("#itheima#")[1];

//完成登錄
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);

UserDao dao = new UserDaoImpl();
userBean = dao.login(user);

//使用session存這個值到域中,方便下一次未過期前還可以用。
request.getSession().setAttribute("userBean", userBean);

chain.doFilter(request, response);
}

}

} catch (Exception e) {
e.printStackTrace();
chain.doFilter(req, response);
}
}


###BeanUtils的使用

> BeanUtils.populate(bean, map);

//注冊自己的日期轉換器
ConvertUtils.register(new MyDateConverter(), Date.class);


//轉化數據
Map map = request.getParameterMap();
UserBean bean = new UserBean();

轉化map中的數據,放置到bean對象身上
BeanUtils.populate(bean, map);

?

#總結

##Listener

8個

三種類型
針對三個作用域的創建和銷毀
針對三個作用域的值改變 【添加 | 替換 | 移除】
針對session中的值 【鈍化 活化】 , 【綁定 解綁】

鈍化 ( 序列化 )
內存中的對象存儲到硬盤

超時失效。 session銷毀了。

非正常關閉服務器, 鈍化 。 正常關閉服務器 銷毀

設置了session,多久時間。 context.xml

活化 (反序列化)
從硬盤里面讀取到內存


ServletContextListner : 應用被部署的時候, 服務器加載這個項目的時候,做一些初始化工作, 任務調度。
HttpSessionListener : 統計在線人數
HttpSessionActivationListener : 鈍化活化處理




##Filter

> 使用頻率更高

* 如果要寫一個過濾器。

> 1. 定義一個類,實現接口 Filter

> 2. 注冊 . web.xml . 與servlet相似。

* 過濾器放行。

> chain.doFilter(request, response);

* 過濾器生命周期

創建: 服務器加載這個項目的時候創建實例

銷毀: 關閉服務器或者從服務器中移除項目的時候。

轉載于:https://www.cnblogs.com/byczyz/p/11371155.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386193.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

頭條三面技術四面HR,就是這么簡單

前言 看日期&#xff0c;今天都是4月了&#xff0c;這春招也差不多進入尾聲了。 近期任有不少朋友都在找工作&#xff0c;很多人開始抱怨&#xff0c;工作可真難找啊&#xff01;身邊不少朋友問我咋搞呀&#xff0c;秋招都要結束了&#xff0c;工作還沒著落呢…額…這個…今年…

臨時表

tmp_table_size 這個配置限制了內存臨時表的大小&#xff0c;默認值是 16M。 如果臨時表大小超過了 tmp_table_size&#xff0c;那么內存臨時表就會轉成磁盤臨時表 磁盤臨時表使用的引擎默認是 InnoDB&#xff0c;是由參數 internal_tmp_disk_storage_engine 控制的。 轉載于:h…

如何保證Redis與數據庫的雙寫一致性?進階加薪全靠它!

我有話要說&#xff0c;請仔細看完 我發現一個現象&#xff0c;很多開發5年的程序員仍然停留在crud的階段&#xff0c;這是什么原因&#xff1f; 最主要的原因就是基礎很差&#xff0c;尤其對于JVM和并發編程這方面掌握的比較差&#xff0c;而JVM和并發編程就是非常非常重要的…

Swimming Balls

Swimming Balls https://vjudge.net/contest/318752#problem/J如果直接算&#xff0c;各種球的情況都不清楚&#xff0c;因為放一個球之后&#xff0c;水位的變化也會影響之前放入的球&#xff0c;不如&#xff0c;二分最終的水位高度&#xff0c;這樣每個球的貢獻就有了 #incl…

如何保證redis高可用?薪資翻倍

前言&#xff1a; 首先介紹一下我的同學&#xff0c;專科畢業應用電子技術專業&#xff0c;已經畢業快兩年了。因為專業的原因工作一年覺得沒什么發展前途就想轉行&#xff0c;身為他的“好基友”&#xff0c;他覺得我這個工作挺好的&#xff0c;就咨詢了我一下&#xff0c;經…

Linux中強大的輸入輸出重定向和管道

Linux中有三個最重要的輸入輸出流: Standard Input(STDIN) - 通常指鍵盤的輸入 Standard Output(STDOUT) - 通常指顯示器的輸出 Standard Error(STDERR) - 通常也是重定向到顯示器 默認情況下&#xff0c;分別是0表示標準輸入(stdin),1表示標準輸出(stdout),2表示標準錯誤。 參…

如何保證消息隊列的高可用?透徹分析源碼

前言 成為優秀的架構師是大部分初中級工程師的階段性目標。優秀的架構師往往具備七種核心能力&#xff1a;編程能力、調試能力、編譯部署能力、性能優化能力、業務架構能力、在線運維能力、項目管理能力和規劃能力。 這幾種能力之間的關系大概如下圖。編程能力、調試能力和編…

rails 放在 apache一個目錄下面的配置方法

<Location /redmine> ProxyPass http://localhost:3000 ProxyPassReverse http://localhost:3000/</Location>然后&#xff0c;配置additional_environment.rb文件中config.action_controller.relative_url_root /redmine這樣基本就可以了&#xff0c;但是&…

如何化身BAT面試收割機?不吃透都對不起自己

前言 多線程相對于其他 Java 知識點來講&#xff0c;有一定的學習門檻&#xff0c;并且了解起來比較費勁。在平時工作中如若使用不當會出現數據錯亂、執行效率低&#xff08;還不如單線程去運行&#xff09;或者死鎖程序掛掉等等問題&#xff0c;所以掌握了解多線程至關重要。…

Tensorflow2.0開啟,從此忘記1.*版本

1.可使用GPU&#xff0c;提升上百倍的效率 2.可自動求導 3.內置神經網絡API 使用cast&#xff0c;可以轉換成相應的類型 轉載于:https://www.cnblogs.com/ningxinjie/p/11412653.html

如何在面試中通過工廠模式來給自己加分?逆襲面經分享

拼多多三面慘敗&#xff0c;java中間件、數據庫與spring框架&#xff0c;答不上… 面試開火箭&#xff0c;工作擰螺絲…月初有個朋友面試拼多多&#xff0c;一面自信滿滿過了&#xff0c;結果三面卻慘敗…昨天朋友約我出來討論問題在哪里&#xff0c;三面就答不上了&#xff0…

CNN/RNN TF1.4

###CNN###import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data這些是tf1.*版本&#xff0c;現在我已經升級到2.0版本&#xff0c;上方數據集都用不了了...黑白圖片&#xff0c;因此這里使用的是2Dmnistinput_data.read_data_sets("MNIST…

Java-類與對象

Java&#xff0c;從一開始學習這門技術&#xff0c;我們就被注入了一個概念——“Java是一門面向對象編程語言。”是的&#xff0c;Java之所以簡單而具有優勢&#xff0c;就是因為面向對象所帶來的方便。這種方式免去了C 中反復而難以理解的指針和多繼承&#xff0c;“可以讓程…

Hibernate學習筆記(一)

####1.1Hibernate框架的學習路線?第一天&#xff1a;Hibernate的入門&#xff08;Hibernate的環境搭建、Hibernate的API、Hibernate的CRUD&#xff09;?第二天&#xff1a;Hibernate的一級緩存、其他的API?第三天&#xff1a;Hibernate的一對多配置、Hibernate的多對多的配置…

Java-進階:Java-File--IO—1

#目錄 一、File 類 二、IO流 三、字節輸出流 四、字節輸入流 五、字節流文件復制 六、字符輸出流 七、字符輸入流 八、字符流復制文本文件 ##一、File 類 ###1. 概述 文件 和 目錄路徑名 的抽象表達形式 Java中把文件或者目錄&#xff08;文件夾&#xff09;都封裝成 File對象…

北理工爬蟲課程學習記錄

Requests post方法如果提交字典會被存到form下&#xff0c;如果直接提交字符串&#xff0c;會被存到data下 put方法和post類似&#xff0c;只不過他會覆蓋原始數據 ###各個方法的使用### 13個 訪問參數 url修改的字段 //模擬瀏覽器進行訪問 //模擬不同的IP地址對這個網站進行訪…

Java-進階:Java-File--IO—2

目錄 一、轉換流 二、字節緩沖流 三、字符緩沖流 四、序列化流與反序列化流 五、打印流 六、標準輸入、輸出流 七、IO流總結 一、轉換流 1. OutputStreamWriter 類 &#xff08;1&#xff09; 概述 java.io.OutputStreamWriter繼承 Writer類&#xff1b;就是一個字符輸出流…

Hibernate學習筆記(二)

Hibernate概述&#xff1a; 什么是Hibernate:是一個持久層的ORM的框架 什么是ORM: ORM:對象關系映射,指的是將一個java中的對象與關系型數據庫中的表建立一種映射關系&#xff0c;從而操作對象就可以完成數據庫的相關操作為什么學習Hibernate 簡化JDBC的開發 性能很好Hibernate…

Java-進階:多線程1

目錄 一、概述 二、Thread 類 三、創建線程&#xff1a;繼承 Thread 類 四、創建線程&#xff1a;實現 Runnable 接口 五、線程優先級 六、線程的生命周期 七、同步代碼塊 一、概述 1. 進程和線程 進程&#xff1a;進程指正在運行的程序。線程&#xff1a;線程是進程中的一個…

Struts2學習筆記(一)--入門常見配置

Struts2框架的學習路線 l 第一天&#xff1a;Struts2的概述、Struts2的入門、Struts2常見的配置、Struts2的Action的編寫 l 第二天&#xff1a;Struts2的數據的封裝、結果頁面配置 l 第三天&#xff1a;Struts2的值棧和OGNL表達式 l 第四天&#xff1a;Struts2的標簽庫 Struts2…