摘要:創(chuàng)建與銷毀對象是發(fā)送請求服務器就會創(chuàng)建它,當響應產生時,對象就會銷毀。是容器為開發(fā)人員提供的對象,它提供了對某一資源的已過濾請求調用鏈的視圖。
一、Listener監(jiān)聽器
Javaweb開發(fā)中的監(jiān)聽器,是用于監(jiān)聽web常見對象 HttpServletRequest HttpSession ServletContext 監(jiān)聽它們的創(chuàng)建與銷毀 屬性變化 session綁定javaBean
1、監(jiān)聽機制
事件 就是一個事情 事件源 產生這個事情的源頭 監(jiān)聽器 用于監(jiān)聽指定的事件的對象 注冊監(jiān)聽 要想讓監(jiān)聽器可以監(jiān)聽到事件產生,必須對其進行注冊。 ------------------------------
2、Javaweb開發(fā)中常見監(jiān)聽器
2.1、監(jiān)聽域對象的創(chuàng)建與銷毀
監(jiān)聽ServletContext創(chuàng)建與銷毀 ServletContextListener
監(jiān)聽HttpSession創(chuàng)建與銷毀 HttpSessionListener
監(jiān)聽HttpServletRequest創(chuàng)建與銷毀 ServletRequestListener
2.2、監(jiān)聽域對象的屬性變化
監(jiān)聽ServletContext屬性變化 ServletContextAttributeListener
監(jiān)聽HttpSession屬性變化 HttpSessionAttributeListener
監(jiān)聽HttpServletRequest屬性變化 ServletRequestAttributeListener
2.3、監(jiān)聽session綁定javaBean
它是用于監(jiān)聽javaBean對象是否綁定到了session域 HttpSessionBindingListener
它是用于監(jiān)聽javaBean對象的活化與鈍化 HttpSessionActivationListener
3、監(jiān)聽器的快速入門
關于創(chuàng)建一個監(jiān)聽器的步驟
1.創(chuàng)建一個類,實現(xiàn)指定的監(jiān)聽器接口
2.重寫接口中的方法
3.在web.xml文件中對監(jiān)聽器進行注冊。
3.1、關于域對象創(chuàng)建與銷毀的演示
1.ServletContext對象的創(chuàng)建與銷毀
這個對象是在服務器啟動時創(chuàng)建的,在服務器關閉時銷毀的。
2.HttpSession對象的創(chuàng)建與銷毀
HttpSession session=request.getSession();
Session銷毀
1.默認超時 30分鐘
2.關閉服務器
3.invalidate()方法
4.setMaxInactiveInterval(int interval) 可以設置超時時間
問題:直接訪問一個jsp頁面時,是否會創(chuàng)建session?
會創(chuàng)建,因為我們默認情況下是可以在jsp頁面中直接使用session內置對象的。
3.HttpServletRequest創(chuàng)建與銷毀
Request對象是發(fā)送請求服務器就會創(chuàng)建它,當響應產生時,request對象就會銷毀。
3.2、演示了Request域對象中屬性變化
在java的監(jiān)聽機制中,它的監(jiān)聽器中的方法都是有參數(shù)的,參數(shù)就是事件對象,而我們可以通過事件對象直接獲取事件源。
3.3、演示session綁定javaBean
1.javaBean對象自動感知被綁定到session中.
HttpSessionBindingListener 這個接口是由javaBean實現(xiàn)的,并且不需要在web.xml文件中注冊.
2.javabean對象可以活化或鈍化到session中。
HttpSessionActivationListener如果javaBean實現(xiàn)了這個接口,那么當我們正常關閉服務器時,session中的javaBean對象就會被鈍化到我們指定的文件中。
當下一次在啟動服務器,因為我們已經將對象寫入到文件中,這時就會自動將javaBean對象活化到session中。
我們還需要個context.xml文件來配置鈍化時存儲的文件
在meta-inf目錄下創(chuàng)建一個context.xml文件
案例-定時銷毀session
1.怎樣可以將每一個創(chuàng)建的session全都保存起來?
我們可以做一個HttpSessionListener,當session對象創(chuàng)建時,就將這個session對象裝入到一個集合中.
將集合List
2.怎樣可以判斷session過期了?
在HttpSession中有一個方法public long getLastAccessedTime()
它可以得到session對象最后使用的時間。
可以使用invalidate方法銷毀。
我們上面的操作需要使用任務調度功能. 在java中有一個Timer定時器類
關于三個域對象獲取
如果在Servlet中要獲取 request,在方法上就有,request.getSession() getServletContext();
如果我們有request對象了, request.getSession() request.getSession().getServletCotnext();
程序在使用時,需要考慮并發(fā)問題,因為我們在web中,它一定是一個多線程的,那么我們的程序對集合進行了添加,還有移除操作。
二、Filter過濾器(重要)
Javaweb中的過濾器可以攔截所有訪問web資源的請求或響應操作。
1、Filter快速入門
1.1、步驟:
1.創(chuàng)建一個類實現(xiàn)Filter接口
2.重寫接口中方法 doFilter方法是真正過濾的。
3.在web.xml文件中配置
注意:在Filter的doFilter方法內如果沒有執(zhí)行chain.doFilter(request,response)
那么資源是不會被訪問到的。
1.2、FilterChain
FilterChain 是 servlet 容器為開發(fā)人員提供的對象,它提供了對某一資源的已過濾請求調用鏈的視圖。過濾器使用 FilterChain 調用鏈中的下一個過濾器,如果調用的過濾器是鏈中的最后一個過濾器,則調用鏈末尾的資源。
問題:怎樣可以形成一個Filter鏈?
只要多個Filter對同一個資源進行攔截就可以形成Filter鏈
問題:怎樣確定Filter的執(zhí)行順序?
由來確定 1.3、Filter生命周期
Servlet生命周期:
實例化 --》 初始化 --》 服務 --》 銷毀
?當服務器啟動,會創(chuàng)建Filter對象,并調用init方法,只調用一次.
?當訪問資源時,路徑與Filter的攔截路徑匹配,會執(zhí)行Filter中的doFilter方法,這個方法是真正攔截操作的方法.
?當服務器關閉時,會調用Filter的destroy方法來進行銷毀操作.
1.4、FilterConfig 在Filter的init方法上有一個參數(shù),類型就是FilterConfig. FilterConfig它是Filter的配置對象,它可以完成下列功能
1.獲取Filtr名稱
2.獲取Filter初始化參數(shù)
3.獲取ServletContext對象。
問題:怎樣在Filter中獲取一個FIlterConfig對象?
1.5、Filter配置
基本配置filter名稱 Filter類的包名.類名 關于其它配置 1. filter名稱 路徑 完全匹配 以”/demo1”開始,不包含通配符* 目錄匹配 以”/”開始 以*結束 擴展名匹配 *.xxx 不能寫成/*.xxx 2. 它是對指定的servlet名稱的servlet進行攔截的。 3. 可以取的值有 REQUEST FORWARD ERROR INCLUDE
它的作用是:當以什么方式去訪問web資源時,進行攔截操作.
1.REQUEST 當是從瀏覽器直接訪問資源,或是重定向到某個資源時進行攔截方式配置的 它也是默認值
2.FORWARD 它描述的是請求轉發(fā)的攔截方式配置
3.ERROR 如果目標資源是通過聲明式異常處理機制調用時,那么該過濾器將被調用。除此之外,過濾器不會被調用。
4.INCLUDE 如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用。除此之外,該過濾器不會被調用
三、自動登陸
1、創(chuàng)建庫與表 CREATE DATABASE day17
USE day17
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100), PASSWORD VARCHAR(100)
)
INSERT INTO USER VALUES(NULL,"tom","123");
2、自動登陸功能實現(xiàn):
1.當用戶登陸成功后,判斷是否勾選了自動登陸,如果勾選了,就將用戶名與密碼持久化存儲到cookie中
2.做一個Filter,對需要自動登陸的資源進行攔截
問題
1.如果用戶想要登陸操作,還需要自動登陸嗎?
2.如果用戶已經登陸了,還需要自動登陸嗎?
四、MD5加密
在mysql中可以對數(shù)據(jù)進行md5加密 Md5(字段) UPDATE USER SET PASSWORD=MD5(PASSWORD); 在java中也提供了md5加密 /**
使用md5的算法進行加密
*/
public static String md5(String plainText) {
byte[] secretBytes = null; try { secretBytes = MessageDigest.getInstance("md5").digest( plainText.getBytes()); } catch (NoSuchAlgorithmException e) { throw new RuntimeException("沒有md5這個算法!"); } String md5code = new BigInteger(1, secretBytes).toString(16); for (int i = 0; i < 32 - md5code.length(); i++) { md5code = "0" + md5code; } return md5code;
五、全局的編碼過濾器
分析: 我們之前做的操作,只能對post請求是ok
怎樣可以做成一個通用的,可以處理post,get所有的請求的?
在java中怎樣可以對一個方法進行功能增強?
1.繼承
2.裝飾設計模式
1.創(chuàng)建一個類讓它與被裝飾類實現(xiàn)同一個接口或繼承同一個父類
2.在裝飾類中持有一個被裝飾類的引用
3.重寫要增強的方法
問題:我們獲取請求參數(shù)有以下方法
1.getParameter
2.getPrameterValues
3.getParameterMap
這三個方法都可以獲取請求參數(shù)。
分析后,我們知道getParameter與getParameterValue方法可以依賴于getParamterMap方法來實現(xiàn)。
// 這個就是我們對request進行裝飾的類
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;// 是用于接收外部傳遞的原始的request
public MyRequest(HttpServletRequest request) {
super(request); // 是因為父類沒有無參數(shù)構造 this.request = request;
}
// @Override
// public String getParameter(String name) {
// // 1.得到原來的getParameter方法的值
// String value = request.getParameter(name); // 亂碼
//
// try {
// return new String(value.getBytes("iso8859-1"), "utf-8");
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
// return null;
// }
@Override
public String getParameter(String name) {
if (name != null) { String[] st = (String[]) getParameterMap().get(name); if (st != null && st.length > 0) { return st[0]; } } return null;
}
@Override
public String[] getParameterValues(String name) {
if (name != null) { return (String[]) getParameterMap().get(name); } return null;
}
private boolean flag = true;
@Override
public Map getParameterMap() {
// 1.得到原始的map集合 Mapmap = request.getParameterMap();// 亂碼 if (flag) { // 2.將map集合中的String[]得到,解決每一個元素的亂碼問題. for (String key : map.keySet()) { String[] st = map.get(key); // 得到每一個數(shù)組 for (int i = 0; i < st.length; i++) { try { st[i] = new String(st[i].getBytes("iso8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } flag = false; } return map;
}
}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/72481.html
摘要:方法對象銷毀時執(zhí)行方法其中的參數(shù)每次在執(zhí)行方法時容器負責創(chuàng)建一個和一個對象作為的參數(shù)傳遞進來。該個該就是在訪問目標資源的方法時的和。 一、過濾器Filter1.filter的簡介filter是對客戶端訪問資源的過濾,符合條件放行,不符合條件不放行,并且可以對目 標資源訪問前后進行邏輯處理2.快速入門步驟:1)編寫一個過濾器的類實現(xiàn)Filter接口2)實現(xiàn)接口中尚未實現(xiàn)的方法(著重...
摘要:準備好了我們可以開始向中發(fā)布,當發(fā)布后,所有在中的都會收到對應的。將類注入到的中。測試和通過方法將發(fā)布到應用上下文中,同時這個動作會觸發(fā)收到事件。深入剖析發(fā)布與監(jiān)聽的過程在使用方法發(fā)布的時候,最終會調用到中的類的如下的一段代碼。 本篇主要來聊一聊spring中ApplicationListener接口和ApplicationEvent類。 從命名上可以很容易的看出來一個是listene...
摘要:實體代碼如下所示恒宇少年碼云用戶名密碼創(chuàng)建內添加一個注冊方法,該方法只是實現(xiàn)注冊事件發(fā)布功能,代碼如下所示恒宇少年碼云用戶注冊方法省略其他邏輯發(fā)布事件事件發(fā)布是由對象管控的,我們發(fā)布事件前需要注入對象調用方法完成事件發(fā)布。 ApplicationEvent以及Listener是Spring為我們提供的一個事件監(jiān)聽、訂閱的實現(xiàn),內部實現(xiàn)原理是觀察者設計模式,設計初衷也是為了系統(tǒng)業(yè)務邏輯之...
摘要:學習筆記工作以來就一直在用各種框架,比如,這些,向外提供接口都很方便,但是一直在想它的內部是怎樣對外暴露服務的,正好之前學習基礎的時候也沒好好看這塊,抽個時間學習總結一下,也能更好的理解掌握現(xiàn)在的框架。 Servlet學習筆記 工作以來就一直在用各種web框架,比如SpringMVC,Spring Cloud這些,向外提供接口都很方便,但是一直在想它的內部是怎樣對外暴露服務的,正好之前...
閱讀 3275·2021-11-15 11:37
閱讀 1090·2021-11-02 14:45
閱讀 3907·2021-09-04 16:48
閱讀 3585·2019-08-30 15:55
閱讀 762·2019-08-23 17:53
閱讀 1002·2019-08-23 17:03
閱讀 2037·2019-08-23 16:43
閱讀 2194·2019-08-23 16:22