Java 監聽器知識
1. 監聽器
1.1 概述
監聽器:主要是用來監聽特定物件的建立或銷燬、屬性的變化的!
是一個實現特定介面的普通java類!
物件:
自己建立自己用 (不用監聽)
別人建立自己用(需要監聽)
Servlet中哪些物件需要監聽?
request / session / servletContext
分別對應的是request監聽器、session相關監聽器、servletContext監聽器
監聽器
監聽器介面:
一、監聽物件建立/銷燬的監聽器介面
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物件的建立或銷燬。
程式碼:
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監聽器,和上面的宣告週期、屬性監聽器區別?
- 不用再web.xml配置
- 因為監聽的物件是自己建立的物件,不是伺服器物件!
1.4 案例
需求:做一個線上列表提醒的功能!
使用者登陸:
- 顯示登陸資訊,列表展示。(list.jsp)
- 顯示線上使用者列表 (list.jsp)
- 列表點選進入“線上列表頁面” 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
l 數值,貨幣,時間,日期等資料由於可能在程式執行時動態產生,所以無法像文字一樣簡單地將它們從應用程式中分離出來,而是需要特殊處理。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 2015年3月4日星期三 * LONG 2015年3月4日 * FULL 2015年3月4日星期三 * MEDIUM 2015-3-4 * SHORT 15-3-4 * * 時間 * FULL 下午04時31分59秒 CST * LONG 下午04時32分37秒 * 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 上午10時25分39秒 CST,反向解析成一個date物件。 @Test publicvoid eg2() throws Exception { String str = "09-11-28 上午10時25分39秒 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> |