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