1. 程式人生 > >Java 監聽器知識

Java 監聽器知識

 

1. 監聽器

 

1.1     概述

監聽器:主要是用來監聽特定物件的建立或銷燬、屬性的變化的!

                    是一個實現特定介面的普通java類!

物件:

         自己建立自己用 (不用監聽)

         別人建立自己用(需要監聽)

Servlet中哪些物件需要監聽?

         request / session / servletContext

         分別對應的是request監聽器、session相關監聽器、servletContext監聽器

          監聽器

介面(listener)

監聽器介面:

一、監聽物件建立/銷燬的監聽器介面

         InterfaceServletRequestListener     監聽request物件的建立或銷燬

         InterfaceHttpSessionListener         監聽session物件的建立或銷燬

         InterfaceServletContextListener     監聽servletContext物件的建立或銷燬

二、監聽物件屬性的變化

         InterfaceServletRequestAttributeListener 監聽request物件屬性變化: 新增、移除、修改

         InterfaceHttpSessionAttributeListener      監聽session物件屬性變化: 新增、移除、修改

         InterfaceServletContextAttributeListener  監聽servletContext物件屬性變化

三、session相關監聽器

         InterfaceHttpSessionBindingListener   監聽物件繫結到session上的事件    

         InterfaceHttpSessionActivationListener(瞭解) 監聽session序列化及反序列化的事件

1.2     生命週期監聽器

    宣告週期監聽器:監聽物件的建立、銷燬的過程!

    監聽器開發步驟:

        1.      寫一個普通java類,實現相關介面;

        2.      配置(web.xml)

 

A.   ServletRequestListener   

監聽request物件的建立或銷燬。

 

程式碼:

/**

 *  監聽request物件的建立或銷燬

 * @author ruiyu

publicclass MyRequestListener implements ServletRequestListener{

 

    // 物件銷燬

    @Override

    publicvoid requestDestroyed(ServletRequestEvent sre) {

        // 獲取request中存放的資料

        Object obj = sre.getServletRequest().getAttribute("cn");

        System.out.println(obj);

        System.out.println("MyRequestListener.requestDestroyed()");

    }

 

    // 物件建立

    @Override

    publicvoid requestInitialized(ServletRequestEvent sre) {

        System.out.println("MyRequestListener.requestInitialized()");

    }

}
 

publicclass MyRequestListener implements ServletRequestListener{

 

    // 物件銷燬

    @Override

    publicvoid requestDestroyed(ServletRequestEvent sre) {

        // 獲取request中存放的資料

        Object obj = sre.getServletRequest().getAttribute("cn");

        System.out.println(obj);

        System.out.println("MyRequestListener.requestDestroyed()");

    }

 

    // 物件建立

    @Override

    publicvoid requestInitialized(ServletRequestEvent sre) {

        System.out.println("MyRequestListener.requestInitialized()");

    }

}

 

Web.xml

<!-- 監聽request物件建立、銷燬 -->

    <listener>

        <listener-class>cn.itcast.a_life.MyRequestListener</listener-class>

    </listener>

 

 

 

B.  HttpSessionListener

監聽session物件的建立或銷燬。

 

C.   ServletContextListener

監聽servletContext物件的建立或銷燬。

 

 

1.3     屬性監聽器

監聽:request/session/servletContext物件屬性的變化!

ServletRequestAttributeListener

HttpSessionAttributeListener

ServletContextAttributeListener

總結:先寫類,實現介面;  再配置

 

1.4 其他監聽器: session相關監聽器

HttpSessionBindingListener  

監聽物件繫結/解除繫結到sesison上的事件!

步驟:

         物件實現介面; 再把物件繫結/解除繫結到session上就會觸發監聽程式碼。

作用:

         (上線提醒!)

 

/**

 * 監聽此物件繫結到session上的過程,需要實現session特定介面

 * @author Jie.Yuan

 *

 */

publicclass Admin implements HttpSessionBindingListener {

   省略get/set

// 物件放入session

    @Override

    publicvoid valueBound(HttpSessionBindingEvent event) {

        System.out.println("Admin物件已經放入session");

    }

    // 物件從session中移除

    @Override

    publicvoid valueUnbound(HttpSessionBindingEvent event) {

        System.out.println("Admin物件從session中移除!");

    }

}

 

 

思考:

         這個session監聽器,和上面的宣告週期、屬性監聽器區別?

  1.    不用再web.xml配置
  2.    因為監聽的物件是自己建立的物件,不是伺服器物件!

1.4     案例

需求:做一個線上列表提醒的功能!

     使用者登陸:

  1.     顯示登陸資訊,列表展示。(list.jsp)
  2.     顯示線上使用者列表        (list.jsp)
  3.      列表點選進入“線上列表頁面”   onlineuser.jsp

實現:

1.       先增加退出功能;  再把session活躍時間1min;

2.       寫監聽器,監聽servletContext物件的建立: 初始化集合(onlineuserlist)

3.       登陸功能:使用者登陸時候,把資料儲存到servletContext中

4.       List.jsp  增加超連結, 點選時候提交直接跳轉到online.jsp

5.       寫監聽器:監聽session銷燬,把當前登陸使用者從onlineuserlist移除!

 

2. 國際化

Javaweb增強:過濾器、監聽器、國際化、檔案上傳下載、javaMail

l  國際化又簡稱為 i18n:internationalization

國際化的人:

         人,英語,漢語;  可以說這個人是國際化的人;

軟體的國際化:

         軟體

                   中國: 顯示中文,以及服務符合中國習慣的文字字串!

                                                                  1999-09-09

                   美國: 顯示英文,以及服務符合他國習慣的文字字串!

         這種軟體,就叫國際化的軟體!

如何做到國際化的軟體,要求:

1.      軟體中儲存特定的字串

2.      知道瀏覽器當前使用哪種語言(Locale  )

 

Locale  本地化

Java提供了一個本地化的物件!封裝當前語言、國家、環境等特徵!

 

 

publicclass App {

 

   @Test

   //1. 本地化物件:Locale

   // 封裝語言、國家資訊的物件,有java.util提供

   publicvoid testLocale() throws Exception {

      // 模擬中國語言等環境

      //Locale locale = Locale.CHINA;

      Locale locale = Locale.getDefault();      // 當前系統預設的語言環境

      System.out.println(locale.getCountry());        // CN  國家的簡稱

      System.out.println(locale.getDisplayCountry()); // 國家名稱

      System.out.println(locale.getLanguage());    // zh 語言簡稱

     

      // 模擬美國國家

      Locale l_us = Locale.US;

      System.out.println(l_us.getCountry());

      System.out.println(l_us.getDisplayCountry());

   }

}

 

國際化

靜態資料國際化

網站中顯示的固定文字的國際化:“使用者名稱”“密碼“

 

國際化的軟體:

1.      儲存所有國家顯示的文字的字串

a)        檔案: properties

b)        命名:  基礎名_語言簡稱_國家簡稱.properties

例如:msg_zh_CN.properties     儲存所有中文

      Msg_en_US.properties    儲存所有英文

2.      程式中獲取

ResourceBundle類,可以讀取國際化的資原始檔!

 

 

 

動態文字國際化

中文:1987-09-19   ¥1000

英文: Sep/09 1987  $100

 

數值,貨幣,時間,日期等資料由於可能在程式執行時動態產生,所以無法像文字一樣簡單地將它們從應用程式中分離出來,而是需要特殊處理。Java 中提供瞭解決這些問題的API 類(位於java.util 包和java.text 包中)

 

// 國際化 - 靜態資料

   @Test

   publicvoid testI18N() throws Exception {

     

      // 中文語言環境

      Locale locale = Locale.US;

     

      // 建立工具類物件ResourceBundle

      ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.f_i18n.msg", locale);

      // 根據key獲取配置檔案中的值

      System.out.println(bundle.getString("hello"));

      System.out.println(bundle.getString("username"));

      System.out.println(bundle.getString("pwd"));

     

   }

  

   // 國際化 - 動態文字 - 0. 概述

   @Test

   publicvoid testI18N2() throws Exception {

      // 國際化貨幣

      NumberFormat.getCurrencyInstance();

      // 國際化數字

      NumberFormat.getNumberInstance();

      // 國際化百分比

      NumberFormat.getPercentInstance(); 

      // 國際化日期

      //DateFormat.getDateTimeInstance(dateStyle, timeStyle, aLocale)

   }

  

   // 國際化 - 動態文字 - 1. 國際化貨幣

   @Test

   publicvoid testI18N3() throws Exception {

      // 模擬語言環境

      Locale locale = Locale.CHINA;

      // 資料準備

      double number = 100;

      // 工具類

      NumberFormat nf = NumberFormat.getCurrencyInstance(locale);

      // 國際化貨幣

      String m = nf.format(number);

      // 測試

      System.out.println(m);

   }

  

   //面試題:  程式碼計算:  $100 * 10 

   @Test

   publicvoid eg() throws Exception {

      String str = "$100";

      int num = 10;

     

      // 1. 分析str值是哪一國家的貨幣

      Locale us = Locale.US;

      // 2. 國際化工具類

      NumberFormat nf = NumberFormat.getCurrencyInstance(us);

      // 3. 解析str國幣

      Number n = nf.parse(str);

     

      System.out.println(n.intValue() * num);

   }

  

   // 國際化 - 動態文字 - 2. 國際化數值

   @Test

   publicvoid testI18N4() throws Exception {

      // 模擬語言環境

      Locale locale = Locale.CHINA;

      NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);

      String str = nf.format(1000000000);

      System.out.println(str);

   }

  

   // 國際化 - 動態文字 - 3. 國際化日期

   /*

    * 日期

    *   FULL   201534星期三

    *   LONG   201534

    *   FULL   201534星期三

    *    MEDIUM 2015-3-4

    *    SHORT  15-3-4

    *   

    * 時間

    *   FULL   下午043159 CST

    *   LONG   下午043237

    *    MEDIUM 16:33:00

    *    SHORT  下午4:33

    *   

    *

    */

   @Test

   publicvoid testI18N5() throws Exception {

     

      // 日期格式

      int dateStyle = DateFormat.SHORT;

      // 時間格式

      int timeStyle = DateFormat.SHORT;

     

      // 工具類

      DateFormat df =

        DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.CHINA);  

      String date = df.format(new Date());

     

      System.out.println(date);

   }

  

   // 面試2請將時間值:09-11-28 上午102539 CST,反向解析成一個date物件。

   @Test

   publicvoid eg2() throws Exception {

      String str = "09-11-28 上午102539 CST";

      // 建立DateFormat工具類,國際化日期

      DateFormat df = DateFormat.getDateTimeInstance(

           DateFormat.SHORT, DateFormat.FULL, Locale.getDefault());

      Date d = df.parse(str);

     

      System.out.println(d);

   }

  

 

Jsp頁面國際化

<html>

  <head>

  <%

  ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.f_i18n.msg",request.getLocale());

  %>

    <title><%=bundle.getString("title") %></title>

   <meta http-equiv="pragma" content="no-cache">

   <meta http-equiv="cache-control" content="no-cache">

   <meta http-equiv="expires" content="0">   

  </head>

 

  <body>

  <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post">

  <table align="center" border="1">

      <tr>

         <td><%=bundle.getString("username") %></td>

         <td>

            <input type="text" name="userName">

         </td>

      </tr>

      <tr>

         <td><%=bundle.getString("pwd") %></td>

         <td>

            <input type="password" name="pwd">

         </td>

      </tr>

      <tr>

         <td>

            <input type="submit" value="<%=bundle.getString("submit") %>">

         </td>

      </tr>

  </table>

  </form>

  </body>

</html>

 

Jsp頁面國際化– 使用jstl標籤

JSTL標籤:

         核心標籤庫

         國際化與格式化標籤庫

         資料庫標籤庫(沒用)

         函式庫

 

<fmt:setLocale value=""/>        設定本地化物件

       <fmt:setBundlebasename=""/>     設定工具類

       <fmt:message></fmt:message>     顯示國際化文字

格式化數值

<fmt:formatNumberpattern="#.##" value="100.99"></fmt:formatNumber>

格式化日期:

<fmt:formatDatepattern="yyyy-MM-dd" value="${date}"/>

 

<html>

  <head>

  <!-- 一、設定本地化物件 -->

  <fmt:setLocale value="${pageContext.request.locale}"/>

  <!-- 二、設定工具類 -->

  <fmt:setBundle basename="cn.itcast.f_i18n.msg" var="bundle"/>

 

    <title><fmt:message key="title" bundle="${bundle}"></fmt:message></title>

   <meta http-equiv="pragma" content="no-cache">

   <meta http-equiv="cache-control" content="no-cache">

   <meta http-equiv="expires" content="0">   

  </head>

 

  <body>

  <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post">

  <table align="center" border="1">

      <tr>

         <td><fmt:message key="username" bundle="${bundle}"></fmt:message></td>

         <td>

            <input type="text" name="userName">

         </td>

      </tr>

      <tr>

         <td><fmt:message key="pwd" bundle="${bundle}"></fmt:message></td>

         <td>

            <input type="password" name="pwd">

         </td>

      </tr>

      <tr>

         <td>

            <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>">

         </td>

      </tr>

  </table>

  </form>

  </body>

</html>