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 国际化又简称为 i18n:internationalization
国际化的人:
人,英语,汉语; 可以说这个人是国际化的人;
软件的国际化:
软件
中国: 显示中文,以及服务符合中国习惯的文本字符串!
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 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 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 上午10时25分39秒 CST,反向解析成一个date对象。 @Test public void 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: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> |
Java 监听器,国际化的更多相关文章
- Java的国际化(i18n)
http://blog.csdn.net/csuliky/article/details/4225800 1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, ...
- JAVA实现国际化
1 Java国际化的思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每个资源文件中 ...
- Java:国际化
Java的国际化: 资源文件的命名可以有如下三种形式:baseName _ language _country.properties baseName _language.properties bas ...
- JAVA监听器原理
http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...
- JAVA监听器Listener
JAVA监听器Listener 一. 简介 监听器用于对web中内置对象的状态或者属性变化进行监听并做出相应响应的一种Servlet;在内置对象的生命周期中,产生.销毁等状态发生变化时,监听器就会进行 ...
- Java程序国际化学习代码一
Java程序国际化初识 1.基本思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每 ...
- java基础---->java中国际化的实现
应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产.开发这样的程序的过程,就称为国际化.今天,我们就开始学习java中国际化的代码实现. Java国际化主要通过如下3个类 ...
- Java监听器Listener使用说明
转载:http://blog.csdn.net/meng2602956882/article/details/13511587 1.什么是Java监听器 监听器也叫Listener,是Servlet的 ...
- Java监听器listener的介绍
Java监听器listener的介绍 listener 能做什么 当web中某些动作发生之后,服务器就调用listener中对应的方法. 内部机制 接口回调 Web监听器 步骤 创建需要的监听器类,实 ...
- 自己编写一个Java监听器
Java监听器 1.原理: 当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法. 例如:创建一个“人”类Class Person 人拥有吃的方法public void eat(){},我 ...
随机推荐
- centos的基本命令02
16:查看系统运行的进程 ps -ef 17:查看系统已开放的端口 netstat -tunlp 18:管道命令 ps -ef | grep tom # 查看系统中与tom相关的进程 19:grep过 ...
- web服务的简单介绍及apache服务的安装
一,web服务的作用: 是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档.可以放置网站文件,让全世界浏览: 可以放置数据让全世界下载.目前最主流的三个Web服务器是Ap ...
- js中自执行函数写法
//自执行写法1 (function T(){ alert(1) })() //自执行写法2 var T1=function(){ alert(1) }(); //传值 var para1={a:1; ...
- linux切换php版本
1.查看php版本 find / -name .php 2.vim /etc/profile 3.加上export PATH=/usr/local/php5.6/bin:$PATH 4.source ...
- javascript 正则表达式校验方式写法
if(/[0-9]/.test(value)){return true; } if(/[a-z]/.test(value)){return true; } if(/[A-Z]/.test(value) ...
- openerp学习笔记 按客户电话、名称模糊查找选择客户(name_search)及客户名称自定义显示(name_get)
#同时按手机.电话.名称模糊查找选择客户 def name_search(self, cr, user, name, args=None, operator='ilike', context=N ...
- MVC流程
控制器:调用模型,并调用视图,将模型产生数据传递给视图,并让相关视图去显示 模 型:获取数据,并处理返回数据 视 图:是将取得的数据进行组织.美化等,并最终向用户终端输出 第一步 浏览者 -& ...
- hadoop集群搭建过程中遇到的问题
在安装配置Hadoop集群的过程中遇到了很多问题,有些是配置导致的,有些是linux系统本身的问题造成的,现在总结如下. 1. hdfs namenode -format出现错误:hdfs namen ...
- PHP如何判断对象为空的方法分享
1.网上很多方法分享说用empty()方法判断对象是否为空.empty()的方法介绍:格式:bool empty ( mixed var )功能:检查一个变量是否为空返回值:若变量不存在则返回 TRU ...
- 关于table-layout的用法
定义:tableLayout 属性用来显示表格单元格.行.列的算法规则. 自动表格布局:auto(默认) 在自动表格布局中,列的宽度是由列单元格中没有折行的最宽的内容设定的. 此算法有时会较慢,这是由 ...