监听器

监听器: 主要是用来监听特定对象的创建或销毁、属性的变化的!
是一个实现特定接口的普通java类!

Servlet中哪些对象需要监听?

request / session / servletContext
分别对应的是request监听器、session相关监听器、servletContext监听器

监听器接口:

生命周期监听器

一、监听对象创建/销毁的监听器接口

Interface ServletRequestListener     监听request对象的创建或销毁
Interface HttpSessionListener 监听session对象的创建或销毁
Interface ServletContextListener 监听servletContext对象的创建或销毁

监听request对象的创建或销毁

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>

监听ServletContext对象创建或销毁

ServletContext对象是在服务器打开和关闭的时候创建和销毁的

public class MyServletContextListener implements ServletContextListener{

@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("MyServletContextListener.contextDestroyed()");
} @Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("1..........MyServletContextListener.contextInitialized()");
} }

监听Session对象创建、销毁

Session对象在用户关闭浏览器时并不马上销毁,而是不能使用,默认session存在时间30分钟,时间过期后session销毁

public class MySessionListener implements HttpSessionListener{

// 创建
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("MySessionListener.sessionCreated()");
} // 销毁
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("MySessionListener.sessionDestroyed()");
} }

web.xml内容

<!-- session的最大活跃时间 -->
<session-config>
<session-timeout>60</session-timeout>
</session-config> <!-- 监听request对象创建、销毁 -->
<listener>
<listener-class>cn.itcast.a_life.MyRequestListener</listener-class>
</listener>
<!-- 监听session对象创建、销毁 -->
<listener>
<listener-class>cn.itcast.a_life.MySessionListener</listener-class>
</listener> <!-- 监听servletContext对象创建、销毁 -->
<listener>
<listener-class>cn.itcast.a_life.MyServletContextListener</listener-class>
</listener> <!-- 属性监听器 -->
<listener>
<listener-class>cn.itcast.b_attr.MySessionAttrListener</listener-class>
</listener> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

属性监听器

二、监听对象属性的变化

Interface ServletRequestAttributeListener 监听request对象属性变化: 添加、移除、修改
Interface HttpSessionAttributeListener 监听session对象属性变化: 添加、移除、修改
Interface ServletContextAttributeListener 监听servletContext对象属性变化

监听session对象属性的变化

public class MySessionAttrListener implements HttpSessionAttributeListener {

// 属性添加
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
// 先获取session对象
HttpSession session = se.getSession();
// 获取添加的属性
Object obj = session.getAttribute("userName");
// 测试
System.out.println("添加的属性:" + obj);
} // 属性移除
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("属性移除");
} // 属性被替换
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// 获取sesison对象
HttpSession session = se.getSession(); // 获取替换前的值
Object old = se.getValue();
System.out.println("原来的值:" + old); // 获取新值
Object obj_new = session.getAttribute("userName");
System.out.println("新值:" + obj_new); } }

session相关监听器

Interface HttpSessionBindingListener   监听对象绑定到session上的事件
Interface HttpSessionActivationListener(了解) 监听session序列化及反序列化的事件

监听此对象绑定到session上的过程,需要实现session特定接口

监听对象绑定/解除绑定到sesison上的事件!

步骤:

对象实现接口; 再把对象绑定/解除绑定到session上就会触发监听代码。

作用:(上线提醒!)

这个session监听器,和上面的声明周期、属性监听器区别?

-- 不用再web.xml配置
- 因为监听的对象是自己创建的对象,不是服务器对象!

public class Admin implements HttpSessionBindingListener {

private int id;
private String name; public Admin() {
super();
}
public Admin(int id, String name) {
super();
this.id = id;
this.name = name;
} // 构造函数
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} // 对象放入session
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("Admin对象已经放入session");
}
// 对象从session中移除
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("Admin对象从session中移除!");
}
}

国际化

软件的国际化:

软件
中国: 显示中文,以及服务符合中国习惯的文本字符串!
1999-09-09
美国: 显示英文,以及服务符合他国习惯的文本字符串!
这种软件,就叫国际化的软件!

本地化 Locale

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 存储所有英文

  1. 程序中获取
    ResourceBundle类,可以读取国际化的资源文件!

    // 国际化 - 静态数据
    @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"));

    }

msg_ en _US.properties内容

hello=Hello
username=User Name
pwd=Password
title=Login Page
submit=Submit \!

msg.properties内容(默认当前语言环境的命名,最好写全)

hello=\u4F60\u597D
username=\u7528\u6237\u540D
pwd=\u5BC6\u7801
title=\u767B\u9646\u9875\u9762
submit=\ \u767B\u9646

动态文本国际化

中文:1987-09-19 ¥1000

英文: Sep/09 1987 $100

 数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)

// 国际化 - 动态文本 - 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页面国际化 – 使用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}"/>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--引入jstl国际化与格式化标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<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> <!--
格式化金额
格式: 0.00 保留2为小数,会自动补0
#.## 保留2为小数,不自动补0(四舍五入)
-->
<fmt:formatNumber pattern="#.##" value="100.99"></fmt:formatNumber> <!-- 格式化日期 -->
<fmt:formatDate pattern="yyyy-MM-dd" value="<%=new Date() %>"/>
</body>
</html>

java -- 监听器、国际化的更多相关文章

  1. Java的国际化(i18n)

    http://blog.csdn.net/csuliky/article/details/4225800 1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, ...

  2. JAVA实现国际化

    1 Java国际化的思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每个资源文件中 ...

  3. Java:国际化

    Java的国际化: 资源文件的命名可以有如下三种形式:baseName _ language _country.properties baseName _language.properties bas ...

  4. JAVA监听器原理

    http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...

  5. JAVA监听器Listener

    JAVA监听器Listener 一. 简介 监听器用于对web中内置对象的状态或者属性变化进行监听并做出相应响应的一种Servlet;在内置对象的生命周期中,产生.销毁等状态发生变化时,监听器就会进行 ...

  6. Java程序国际化学习代码一

    Java程序国际化初识 1.基本思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每 ...

  7. java基础---->java中国际化的实现

    应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产.开发这样的程序的过程,就称为国际化.今天,我们就开始学习java中国际化的代码实现. Java国际化主要通过如下3个类 ...

  8. Java监听器Listener使用说明

    转载:http://blog.csdn.net/meng2602956882/article/details/13511587 1.什么是Java监听器 监听器也叫Listener,是Servlet的 ...

  9. Java监听器listener的介绍

    Java监听器listener的介绍 listener 能做什么 当web中某些动作发生之后,服务器就调用listener中对应的方法. 内部机制 接口回调 Web监听器 步骤 创建需要的监听器类,实 ...

  10. 自己编写一个Java监听器

    Java监听器 1.原理: 当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法. 例如:创建一个“人”类Class Person 人拥有吃的方法public void eat(){},我 ...

随机推荐

  1. TidHTTP的post编码,老掉牙的问题

    TidHTTP使用post时,需要提交json字符串. 那么采用什么编码,这个问题就头大了.目前xe已经不要考虑编码转换问题.但是.... 我们使用ISuperObject操控json.那么最后提交到 ...

  2. 继承 QPaintEngine 利用 QSvgRenderer 从SVG 图片中提取路径(QPainterPath)的方法

    SVG 作为为可缩放矢量图形(Scalable Vector Graphics),易于编辑和维护,基于XML的文本文件存储,在网页设计.图标制作.数据可视化和其他图形相关的领域应用广泛.在应用工程中总 ...

  3. Postwoman教程

    1.安装 打开git或cmder,输入如下命令: cd d:/GitDemo/ git clone https://github.com/liyasthomas/postwoman cd postwo ...

  4. DelayQueue 底层原理

    一.DelayQueue 底层原理 DelayQueue是一种本地延迟队列,比如希望我们的任务在5秒后执行,就可以使用DelayQueue实现.常见的使用场景有: 订单10分钟内未支付,就取消. 缓存 ...

  5. Java--利用打印流(PrintStream)输出信息

    package demo; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; /** ...

  6. Spring--IOC注解用法初探

    创建一个UserDao接口,和一个UserDaoImp的实现类 UserDao接口 package com.zjw.spring.demo1; public interface UserDao { p ...

  7. 【记录】MATLAB|Python NumPy|两种语言的数组/矩阵中元素修改方式的总结和对比

    文章目录 二维矩阵 操作 1. 将数组大于0的数全部加1 2. 删除元素 ①删除单个元素 ②删除一列元素 3. 添加一行或多行 ①添加一行 ②添加多行 4. 获取行/列数 5. 格式化输出数组 结构数 ...

  8. 时间工具类之“LocalDateTime方案转换地域性时差问题->本地时间 转 UTC时间

    一.使用方法 1.这里有使用LocalDateTime,Date, 2.直接使用LocalDateTime来将输入时间转为UTC还是没有摸索到,看了下源码发现根据偏移量去处理的,但是没有测试成功所以换 ...

  9. 将 Excel 拼接为 SQL 脚本

    好像半年前,我就有写过将 Excel 数据, 逐条 或 批量 插入 mysql 数据库, 那时候正在建库嘛, 想着弄个脚本来批量刷新和处理. 工具当时用的 pandas, 这个, 强的一批的工具, 无 ...

  10. 掌握Node.js原理,开启异步编程之旅

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...