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

 

国际化又简称为 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

 

数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。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.mzph.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就可以看到相应的版本的审核的状态 粗…