servlet监听器基础.docx
《servlet监听器基础.docx》由会员分享,可在线阅读,更多相关《servlet监听器基础.docx(14页珍藏版)》请在冰豆网上搜索。
servlet监听器基础
过滤器:
API(接口)
执行流程
应用、案例:
(在servlet中重复编写的代码,都可以放到过滤器中完成!
)
过滤器实现编码统一处理
登陆权限验证
目标:
监听器
国际化
1.监听器
1.1概述
监听器:
主要是用来监听特定对象的创建或销毁、属性的变化的!
是一个实现特定接口的普通java类!
对象:
自己创建自己用(不用监听)
别人创建自己用(需要监听)
Servlet中哪些对象需要监听?
request/session/servletContext
分别对应的是request监听器、session相关监听器、servletContext监听器
监听器(listener)
监听器接口:
一、监听对象创建/销毁的监听器接口
InterfaceServletRequestListener监听request对象的创建或销毁
InterfaceHttpSessionListener监听session对象的创建或销毁
InterfaceServletContextListener监听servletContext对象的创建或销毁
二、监听对象属性的变化
InterfaceServletRequestAttributeListener监听request对象属性变化:
添加、移除、修改
InterfaceHttpSessionAttributeListener监听session对象属性变化:
添加、移除、修改
InterfaceServletContextAttributeListener监听servletContext对象属性变化
三、session相关监听器
InterfaceHttpSessionBindingListener监听对象绑定到session上的事件
InterfaceHttpSessionActivationListener(了解)监听session序列化及反序列化的事件
404(路径写错)
500(服务器错误,调试)
1.2生命周期监听器
声明周期监听器:
监听对象的创建、销毁的过程!
监听器开发步骤:
1.写一个普通java类,实现相关接口;
2.配置(web.xml)
A.ServletRequestListener
监听request对象的创建或销毁。
代码:
/**
*监听request对象的创建或销毁
*@authorJie.Yuan
*
*/
publicclassMyRequestListenerimplementsServletRequestListener{
//对象销毁
@Override
publicvoidrequestDestroyed(ServletRequestEventsre){
//获取request中存放的数据
Objectobj=sre.getServletRequest().getAttribute("cn");
System.out.println(obj);
System.out.println("MyRequestListener.requestDestroyed()");
}
//对象创建
@Override
publicvoidrequestInitialized(ServletRequestEventsre){
System.out.println("MyRequestListener.requestInitialized()");
}
}
Web.xml
--监听request对象创建、销毁-->
cn.itcast.a_life.MyRequestListener
B.HttpSessionListener
监听session对象的创建或销毁。
C.ServletContextListener
监听servletContext对象的创建或销毁。
1.3属性监听器
监听:
request/session/servletContext对象属性的变化!
ServletRequestAttributeListener
HttpSessionAttributeListener
ServletContextAttributeListener
总结:
先写类,实现接口;再配置
1.4其他监听器:
session相关监听器
HttpSessionBindingListener
监听对象绑定/解除绑定到sesison上的事件!
步骤:
对象实现接口;再把对象绑定/解除绑定到session上就会触发监听代码。
作用:
(上线提醒!
)
/**
*监听此对象绑定到session上的过程,需要实现session特定接口
*@authorJie.Yuan
*
*/
publicclassAdminimplementsHttpSessionBindingListener{
…省略get/set
//对象放入session
@Override
publicvoidvalueBound(HttpSessionBindingEventevent){
System.out.println("Admin对象已经放入session");
}
//对象从session中移除
@Override
publicvoidvalueUnbound(HttpSessionBindingEventevent){
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
●国际化又简称为i18n:
internationalization
国际化的人:
人,英语,汉语;可以说这个人是国际化的人;
软件的国际化:
软件
中国:
显示中文,以及服务符合中国习惯的文本字符串!
1999-09-09
美国:
显示英文,以及服务符合他国习惯的文本字符串!
这种软件,就叫国际化的软件!
如何做到国际化的软件,要求:
1.软件中存储特定的字符串
2.知道浏览器当前使用哪种语言(Locale)
Locale本地化
Java提供了一个本地化的对象!
封装当前语言、国家、环境等特征!
publicclassApp{
@Test
//1.本地化对象:
Locale
//封装语言、国家信息的对象,有java.util提供
publicvoidtestLocale()throwsException{
//模拟中国语言等环境
//Localelocale=Locale.CHINA;
Localelocale=Locale.getDefault();//当前系统默认的语言环境
System.out.println(locale.getCountry());//CN国家的简称
System.out.println(locale.getDisplayCountry());//国家名称
System.out.println(locale.getLanguage());//zh语言简称
//模拟美国国家
Localel_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/091987$100
●数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。
Java中提供了解决这些问题的API类(位于java.util包和java.text包中)
//国际化-静态数据
@Test
publicvoidtestI18N()throwsException{
//中文语言环境
Localelocale=Locale.US;
//创建工具类对象ResourceBundle
ResourceBundlebundle=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
publicvoidtestI18N2()throwsException{
//国际化货币
NumberFormat.getCurrencyInstance();
//国际化数字
NumberFormat.getNumberInstance();
//国际化百分比
NumberFormat.getPercentInstance();
//国际化日期
//DateFormat.getDateTimeInstance(dateStyle,timeStyle,aLocale)
}
//国际化-动态文本-1.国际化货币
@Test
publicvoidtestI18N3()throwsException{
//模拟语言环境
Localelocale=Locale.CHINA;
//数据准备
doublenumber=100;
//工具类
NumberFormatnf=NumberFormat.getCurrencyInstance(locale);
//国际化货币
Stringm=nf.format(number);
//测试
System.out.println(m);
}
//面试题:
代码计算:
$100*10
@Test
publicvoideg()throwsException{
Stringstr="$100";
intnum=10;
//1.分析str值是哪一国家的货币
Localeus=Locale.US;
//2.国际化工具类
NumberFormatnf=NumberFormat.getCurrencyInstance(us);
//3.解析str国币
Numbern=nf.parse(str);
System.out.println(n.intValue()*num);
}
//国际化-动态文本-2.国际化数值
@Test
publicvoidtestI18N4()throwsException{
//模拟语言环境
Localelocale=Locale.CHINA;
NumberFormatnf=NumberFormat.getNumberInstance(Locale.US);
Stringstr=nf.format(1000000000);
System.out.println(str);
}
//国际化-动态文本-3.国际化日期
/*
*日期
*FULL2015年3月4日星期三
*LONG2015年3月4日
*FULL2015年3月4日星期三
*MEDIUM2015-3-4
*SHORT15-3-4
*
*时间
*FULL下午04时31分59秒CST
*LONG下午04时32分37秒
*MEDIUM16:
33:
00
*SHORT下午4:
33
*
*
*/
@Test
publicvoidtestI18N5()throwsException{
//日期格式
intdateStyle=DateFormat.SHORT;
//时间格式
inttimeStyle=DateFormat.SHORT;
//工具类
DateFormatdf=
DateFormat.getDateTimeInstance(dateStyle,timeStyle,Locale.CHINA);
Stringdate=df.format(newDate());
System.out.println(date);
}
//面试2:
请将时间值:
09-11-28上午10时25分39秒CST,反向解析成一个date对象。
@Test
publicvoideg2()throwsException{
Stringstr="09-11-28上午10时25分39秒CST";
//创建DateFormat工具类,国际化日期
DateFormatdf=DateFormat.getDateTimeInstance(
DateFormat.SHORT,DateFormat.FULL,Locale.getDefault());
Dated=df.parse(str);
System.out.println(d);
}
Jsp页面国际化
<%
ResourceBundlebundle=ResourceBundle.getBundle("cn.itcast.f_i18n.msg",request.getLocale());
%>
<%=bundle.getString("title")%>
method=login"method="post">
<%=bundle.getString("username")%> |
|
<%=bundle.getString("pwd")%> |
|
"> |
Jsp页面国际化–使用jstl标签
JSTL标签:
核心标签库
国际化与格式化标签库
数据库标签库(没用)
函数库
setLocalevalue=""/>设置本地化对象
setBundlebasename=""/>设置工具类
message>
message>显示国际化文本
格式化数值
formatNumberpattern="#.##"value="100.99">
formatNumber>
格式化日期:
formatDatepattern="yyyy-MM-dd"value="${date}"/>
--一、设置本地化对象-->
setLocalevalue="${pageContext.request.locale}"/>
--二、设置工具类-->
setBundlebasename="cn.itcast.f_i18n.msg"var="bundle"/>
messagekey="title"bundle="${bundle}">
message>
method=login"method="post">
messagekey="username"bundle="${bundle}"> message> |
|
messagekey="pwd"bundle="${bundle}"> message> |
|
messagekey="submit"bundle="${bundle}"/>">
|
作业:
继续前面的案例:
1.登陆、注册、首页列表显示、退出、分页
2.“在线列表显示“