Java 監聽器,國際化

1.?監聽器

1.1?概述

監聽器: 主要是用來監聽特定對象的創建或銷毀、屬性的變化的!

?是一個實現特定接口的普通java類!

?

對象:

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

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

?

Servlet中哪些對象需要監聽?

request / session / servletContext

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

?

監聽器(listener)

?

?

監聽器接口:

一、監聽對象創建/銷毀的監聽器接口

Interface ServletRequestListener?????監聽request對象的創建或銷毀

Interface HttpSessionListener????????監聽session對象的創建或銷毀

Interface ServletContextListener?????監聽servletContext對象的創建或銷毀

二、監聽對象屬性的變化

Interface ServletRequestAttributeListener?監聽request對象屬性變化: 添加、移除、修改

Interface HttpSessionAttributeListener????監聽session對象屬性變化: 添加、移除、修改

Interface ServletContextAttributeListener ?監聽servletContext對象屬性變化

?

三、session相關監聽器

Interface HttpSessionBindingListener???監聽對象綁定到session上的事件

????Interface HttpSessionActivationListener(了解) 監聽session序列化及反序列化的事件

?

?

404(路徑寫錯)

500(服務器錯誤,調試)

1.2?生命周期監聽器

聲明周期監聽器: 監聽對象的創建、銷毀的過程!

監聽器開發步驟:

1.?寫一個普通java類,實現相關接口;

2.?配置(web.xml)

?

A.??ServletRequestListener????

監聽request對象的創建或銷毀。

?

代碼:

/**

?* ?監聽request對象的創建或銷毀

?* @author?Jie.Yuan

?*

?*/

public?class?MyRequestListener implements?ServletRequestListener{

?

// 對象銷毀

@Override

public?void?requestDestroyed(ServletRequestEvent sre) {

// 獲取request中存放的數據

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

System.out.println(obj);

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

}

?

// 對象創建

@Override

public?void?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

?*

?*/

public?class?Admin implements?HttpSessionBindingListener {

???…?省略get/set

// 對象放入session

@Override

public?void?valueBound(HttpSessionBindingEvent event) {

System.out.println("Admin對象已經放入session");

}

// 對象從session中移除

@Override

public?void?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?國際化又簡稱為 i18ninternationalization

?

國際化的人:

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

?

軟件的國際化:

軟件

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

?1999-09-09

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

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

?

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

1.?軟件中存儲特定的字符串

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

?

Locale ?本地化

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

?

?

public?class?App {

?

@Test

//1. 本地化對象:Locale

// 封裝語言、國家信息的對象,有java.util提供

public?void?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

public?void?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

public?void?testI18N2() throws?Exception {

// 國際化貨幣

NumberFormat.getCurrencyInstance();

// 國際化數字

NumberFormat.getNumberInstance();

// 國際化百分比

NumberFormat.getPercentInstance(); ?

// 國際化日期

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

}

?

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

@Test

public?void?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

public?void?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

public?void?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 ??下午043159CST

?* ??LONG ??下午043237

?* ???MEDIUM 16:33:00

?* ???SHORT ?下午4:33

?* ???

?*

?*/

@Test

public?void?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 上午102539CST,反向解析成一個date對象。

@Test

public?void?eg2() throws?Exception {

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

// 創建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:setBundle basename=""/>?????設置工具類

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

格式化數值

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

格式化日期:

<fmt:formatDate pattern="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>

?

轉載于:https://www.cnblogs.com/burningmyself/p/7451419.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454941.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

patator mysql 字典_利用patator進行子域名爆破

前言:原來朋友寫的一個子域名爆破工具挺好用,這前幾天API接口關了.痛苦萬分.自己也寫了一個類似的但是不咋穩定.特地google找了下 找到一款patator.效果和速度還是不錯的。knock的速度真心受不了啊patator是由Python寫的 不用安裝下載即可.下載地址&#xff1a;http://code.goo…

div 超出高度滾動條,超出寬度點點點

超出高度滾動條style"width:230px; height: 180px; overflow: auto;"超出寬度點點點style"width: 220px; overflow: hidden; white-space:nowrap; text-overflow:ellipsis;"轉載于:https://www.cnblogs.com/thinkingthigh/p/7603703.html

mp4(H264容器)的詳細文件格式分析

十六進制碼流分析&#xff1a; ftyp Box 00 00 00 1C: size ,28,表示此BOX有28個字節&#xff0c;表示長度的四個字節也計算在內。以下同 66 74 79 70: type,表示BOX TYPE,此處為ftyp 6D 70 34 32: 可能是兼容的格式信息&#xff0c;/mp42 00 00 00…

hdu 5925 搜索

題意&#xff1a;一個圖&#xff0c;n個障礙&#xff0c;求聯通塊 思路&#xff1a; 圖很大&#xff0c;障礙物很少。把聯通的障礙物塊摳出來&#xff0c;然后暴力。 代碼&#xff1a; #include<bits/stdc.h> using namespace std; #define MEM(a,b) memset(a,b,sizeof(a…

分析數據庫CitusDB:提供彈性計算能力

本文講的是分析數據庫CitusDB&#xff1a;提供彈性計算能力,企業數據庫市場很龐大&#xff0c;在這個領域既有Oracle這樣行家&#xff0c;也有IBM(DB2)和微軟(SQL Server)這樣的跨界巨頭。它們都與中小企業常用到的開源數據庫MySQL一樣&#xff0c;都屬于傳統關系型數據庫。似乎…

mysql不能創建innodb類型表_MYSQL have_innodb DISABLED無法創建innodb類型的表

今天在一臺MYSQL服務器上發現&#xff0c;明明用了engineinnodb創建的表&#xff0c;結果創建出來卻成了myisam的表。再看show variables like %innodb%;have_innodb 成了DISABLED。經過一番試驗&#xff0c;發現是我關閉數據庫后&#xff0c;直接刪除ibdata1文件造成的。刪除該…

[bzoj1059]矩陣游戲

雖然是一道水難題&#xff0c;但是我這種蒟蒻還是要講一講的。 Description 小Q是一個非常聰明的孩子&#xff0c;除了國際象棋&#xff0c;他還很喜歡玩一個電腦益智游戲——矩陣游戲。矩陣游戲在一個N*N黑白方陣進行&#xff08;如同國際象棋一般&#xff0c;只是顏色是隨意的…

H264 RTP頭分析

h264 RTP頭解析流程 結合NALDecoder.c分析 協議分析 &#xff1a;每一個RTP數據報都由頭部&#xff08;Header&#xff09;和負載&#xff08;Payload&#xff09;兩個部分組成&#xff0c;其中頭部前 12 個字節的含義是固定的&#xff0c;而負載則可以是音頻或者視頻數據。 一…

golang mysql 插入_Mysql學習(一)添加一個新的用戶并用golang操作Mysql

Mysql添加一個新的用戶并賦予權限添加一個自己的用戶到mysql首先我們需要先用root用戶登錄mysql&#xff0c;但是剛安裝完沒有密碼&#xff0c;我們先跳過密碼ailumiyanaailumiyana:~/Git_Project/Go_Test$ sudo mysqld_safe --skip-grant-tables2019-01-07T01:35:51.559420Z m…

云計算構建基石之Hyper-V:虛擬機管理

本文講的是云計算構建基石之Hyper-V:虛擬機管理,作為云計算的重要基石&#xff0c;虛擬化技術的好壞起著關鍵作用。Hyper-V作為微軟重要的虛擬化解決技術&#xff0c;在微軟云計算構建解決方案中&#xff0c;更是關鍵至關鍵&#xff0c;基礎之基礎。在本系列文章中&#xff0c;…

Delphi語言最好的JSON代碼庫 mORMot學習筆記1

mORMot沒有控件安裝&#xff0c;直接添加到lib路徑,工程中直接添加syncommons&#xff0c;syndb等到uses里 --------------------------------------------------------- 在進行網絡編程中需要JSON對象的構建與解析&#xff0c;這個Delphi XE自帶&#xff1a;{$IF CompilerVers…

3GP文件格式分析

1. 概述現在很多智能手機都支持多媒體功能&#xff0c;特別是音頻和視頻播放功能&#xff0c;而3GP文件格式是手機端普遍支持的視頻文件格式。目前很多手機都支持h263視頻編碼格式的視頻文件播放&#xff0c;還有些手機支持h264。音頻文件格式普遍支持amr&#xff0c;有些手…

mysql group concat_MySQL 的 GROUP_CONCAT 函數詳解

GROUP_CONCAT(expr) 函數會從 expr 中連接所有非 NULL 的字符串。如果沒有非 NULL 的字符串&#xff0c;那么它就會返回 NULL。語法如下&#xff1a;GROUP_CONCAT 語法規則它在遞歸查詢中用的比較多&#xff0c;但要使用好它并不容易。所以讓我們一起來看看吧&#xff1a;假設有…

ORACLE數據庫 常用命令和Sql常用語句

ORACLE 賬號相關 如何獲取表及權限 1.COPY表空間backup scottexp登錄管理員賬號system2.創建用戶 create user han identified(認證) by mima default tablespace users&#xff08;默認的表空間&#xff09; quota&#xff08;配額&#xff09;10M on users;創建賬號分配權限g…

光榮之路測試開發面試linux考題之四:性能命令

Hi,大家好我是tom,I am back.今天要給大家講講linux系統一些性能相關命令。 1.fdisk 磁盤管理 是一個強大的危險命令&#xff0c;所有涉及磁盤的操作都由該命令完成&#xff0c;包括&#xff1a;新增磁盤、增刪改磁盤分區等。 1.fdisk -l 查看磁盤分區情況 Disk /dev/sda: 27.8…

一起學并發編程 - 優雅關閉

Java中原來在Thread中提供了stop()方法來終止線程&#xff0c;但這個方法是不安全的&#xff0c;所以一般不建議使用。文本將介紹兩種可以優雅的終止線程的方式...<!-- more --> 第一種 在JAVA《Java多線程模式》中有一種叫Two-Phase Termination&#xff08;兩步終止&am…

mac安裝完mysql后關機特別慢_mysql-Mac終端下遇到的問題總結

為了方便啟動mysql服務&#xff0c;修改/etc/.bash_profile文件&#xff0c;如下alias mysql"/usr/local/mysql/bin/mysql"alias mysqladmin"/usr/local/mysql/bin/mysqladmin"或者alias mysqlstart"sudo /usr/local/mysql/support-files/mysql.serve…

sending data mysql slow Mysql查詢非常慢的可能原因

1.用explain看看mysql的執行情況,可以得知,task_id掃描了近20萬條數據,而且這個task_id不是索引 2.為這個task_id所在的表,將此字段添加索引后,查詢就變得很快了 轉載于:https://www.cnblogs.com/Skrillex/p/7365590.html

mybatis 添加語句返回對象_mybatis的insert語句插入數據時的返回值的實現

mybatis的insert語句插入數據時的返回值的實現,語句,返回值,那條,都是,站長站mybatis的insert語句插入數據時的返回值的實現易采站長站&#xff0c;站長之家為您整理了mybatis的insert語句插入數據時的返回值的實現的相關內容。mybatis的sql語句一般是配置在配置文件中&#xf…

打包上架

昨天寫的打包上架&#xff0c;分組到了文章&#xff0c;發現不便查看貼鏈接到這里&#xff1a; http://www.cnblogs.com/ITCoderW/articles/7597969.html 最近一個版本的審核的過程 當我們上傳到APP Store一個新的版本后 登錄ITunes Connect就可以看到相應的版本的審核的狀態 粗…