监听器、国际化!
1. 监听器
概念:
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
监听器可以监听对象创建或属性的变化:
监听的对象:
ServletContext/HttpServletRequest/HttpSession
对象特点:
Tomcat服务器创建的,在开发中经常使用的对象!
Servlet中监听器分类
生命周期监听器
属性监听器
Session监听器
监听器开发
0. 监听器,Listener
1. 普通的java类,实现了特定的接口; 这个类就是监听器类!
2. 通常,都需要通知服务器; 即配置监听器! (web.xml)
生命周期监听器
监听对象的创建或销毁!
接口:
ServletContextListener
void contextDestroyed(ServletContextEvent sce) 销毁ServletContext对象时候执行此方法!
void contextInitialized(ServletContextEvent sce) 创建ServletContext对象时候,会执行这个方法!
开发一个ServletContext监听器!
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("... 创建ServletContext");
// 启动时候,保存一些数据! 就要拿到ServletContext对象!
ServletContext sc = sce.getServletContext();
// 存放数据到ServletContext中,项目所有地方都可以访问!
sc.setAttribute("message", "初始化数据");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println(".... 销毁ServletContext对象");
}
}
cn.itcast.a_life.MyServletContextListener
HttpSessionListener
void sessionCreated(HttpSessionEvent se) 创建session对象时候,会执行这个方法!
void sessionDestroyed(HttpSessionEvent se) 销毁session对象时候执行此方法!
开发一个session监听器!
ServletRequestListener
void requestDestroyed(ServletRequestEvent sre) 销毁request对象时候,会执行这个方法!
void requestInitialized(ServletRequestEvent sre) 创建request对象时候执行
属性监听器
监听对象属性的变化!
ServletContextAttributeListener
监听ServletContext对象顺序变化的监听器!
对象属性变化:
sc.setAttribute(key,value); 往servletContext中添加了数据
sc.removeAttribute(key); 移除ServletContext中数据
sc.setAttribute(key,value); 替换
void attributeAdded(ServletContextAttributeEvent scab) 添加数据触发
void attributeRemoved(ServletContextAttributeEvent scab) 移除数据时候触发
void attributeReplaced(ServletContextAttributeEvent scab) 替换属性时候触发
HttpSessionAttributeListener
监听session对象中属性变化!
void attributeAdded(HttpSessionBindingEvent se)
void attributeRemoved(HttpSessionBindingEvent se)
void attributeReplaced(HttpSessionBindingEvent se)
ServletRequestAttributeListener
监听request对象中属性变化!
void attributeAdded(ServletRequestAttributeEvent srae)
void attributeRemoved(ServletRequestAttributeEvent srae)
void attributeReplaced(ServletRequestAttributeEvent srae)
Session监听器
HttpSessionBindingListener 监听对象绑定(解除绑定)到session上的过程!
HttpSessionActivationListener 监听session序列化或反序列化的过程!
HttpSessionBindingListener : 只要实现这个接口即可,不需要配置!
// 监听这个对象什么时候绑定到session上; 或从session上解除绑定的事件!
public class User implements HttpSessionBindingListener{
private int id;
private String 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;
}
// 监听绑定事件
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("user对象已经放入session!");
}
// 监听解除绑定事件
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("user对象从session中移除了!");
}
}
2. 统计在线人数
只要用户登陆,
在线人数+1
退出; 在线用户-1
监听器: session属性监听器!
2. 国际化
国际化的人:
人会说中文、日语、韩语!掌握多种语言,就是国际化的人!
国际化的软件,
在中文语言环境,显示中文!
在日语语言环境,显示日语!
这个软件,就是国际化的软件!
软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。
国际化又简称为 i18n:internationalization
CHINA US
软件国际化,应该如何实现?
问题:
1. 如何知道哪个语言环境?
- 在一个http请求中,tomcat已经把浏览器当前语言环境封装为Locale对象了!
2. 中文、日文数据,需要预先存储!
本地化对象
Locale, 表示本地化对象!
表示当前语言环境特征的对象!
// 本地化对象
@Test
public void testLocale() throws Exception {
//模拟中国本地化对象
// Locale locale =Locale.CHINA;
// Locale locale =Locale.getDefault(); // 获取当前系统默认的本地化对象
Locale locale = Locale.JAPAN; // 模拟其他国际本地化对象!¥ $
System.out.println(locale.getCountry()); // 国家简称 CN
System.out.println(locale.getDisplayCountry()); // 国家名称
System.out.println(locale.getLanguage()); // 语言简称
System.out.println(locale.getDisplayLanguage());// 语言名称
}
国际化
软件国际化步骤:
1. 写资源文件(properties), 存储国际化字符串
资源文件命名规则:基础名_语言简称_国家简称.properties
中文: msg_zh_CN.properties
英文: msg_en_US.properties
2. 加载资源文件
工具类:ResourceBundle类
Jstl中国际化相关标签:
设置当前浏览器语言环境对象
加载资源文件
读取资源文件中的内容