成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

RebeccaZhong / 2712人閱讀

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


    filter名稱
    路徑

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

相關文章

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

    摘要:方法對象銷毀時執(zhí)行方法其中的參數(shù)每次在執(zhí)行方法時容器負責創(chuàng)建一個和一個對象作為的參數(shù)傳遞進來。該個該就是在訪問目標資源的方法時的和。 一、過濾器Filter1.filter的簡介filter是對客戶端訪問資源的過濾,符合條件放行,不符合條件不放行,并且可以對目 標資源訪問前后進行邏輯處理2.快速入門步驟:1)編寫一個過濾器的類實現(xiàn)Filter接口2)實現(xiàn)接口中尚未實現(xiàn)的方法(著重...

    Brenner 評論0 收藏0
  • spring ApplicationListener&amp;ApplicationEvent

    摘要:準備好了我們可以開始向中發(fā)布,當發(fā)布后,所有在中的都會收到對應的。將類注入到的中。測試和通過方法將發(fā)布到應用上下文中,同時這個動作會觸發(fā)收到事件。深入剖析發(fā)布與監(jiān)聽的過程在使用方法發(fā)布的時候,最終會調用到中的類的如下的一段代碼。 本篇主要來聊一聊spring中ApplicationListener接口和ApplicationEvent類。 從命名上可以很容易的看出來一個是listene...

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

    摘要:實體代碼如下所示恒宇少年碼云用戶名密碼創(chuàng)建內添加一個注冊方法,該方法只是實現(xiàn)注冊事件發(fā)布功能,代碼如下所示恒宇少年碼云用戶注冊方法省略其他邏輯發(fā)布事件事件發(fā)布是由對象管控的,我們發(fā)布事件前需要注入對象調用方法完成事件發(fā)布。 ApplicationEvent以及Listener是Spring為我們提供的一個事件監(jiān)聽、訂閱的實現(xiàn),內部實現(xiàn)原理是觀察者設計模式,設計初衷也是為了系統(tǒng)業(yè)務邏輯之...

    Reducto 評論0 收藏0
  • Servlet學習筆記

    摘要:學習筆記工作以來就一直在用各種框架,比如,這些,向外提供接口都很方便,但是一直在想它的內部是怎樣對外暴露服務的,正好之前學習基礎的時候也沒好好看這塊,抽個時間學習總結一下,也能更好的理解掌握現(xiàn)在的框架。 Servlet學習筆記 工作以來就一直在用各種web框架,比如SpringMVC,Spring Cloud這些,向外提供接口都很方便,但是一直在想它的內部是怎樣對外暴露服務的,正好之前...

    kohoh_ 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<