成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaWEB開發(fā)15——Listener&Listener

RebeccaZhong / 2772人閱讀

摘要:創(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保存到ServletContext域中。
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類的包名.類名


    filter名稱
    路徑

關(guān)于其它配置
            1.
    完全匹配   以”/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集合
Map map = 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

相關(guān)文章

  • JavaWEB開發(fā)16——Listener

    摘要:方法對(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)的方法(著重...

    Brenner 評(píng)論0 收藏0
  • spring ApplicationListener&amp;ApplicationEvent

    摘要:準(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...

    keke 評(píng)論0 收藏0
  • 第二十七章:SpringBoot使用ApplicationEvent&amp;Listener完成業(yè)

    摘要:實(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ù)邏輯之...

    Reducto 評(píng)論0 收藏0
  • Servlet學(xué)習(xí)筆記

    摘要:學(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ù)的,正好之前...

    kohoh_ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<