javawebday54(存储文件 session活化和钝化 【存硬盘】国际化【多语言】 )

JavaWeb监听器
三大组件
    Servlet
    Listener
    Filter
Listener:监听器
1、初次:AWT
2、然后:SAX    

监听器
    是一个接口,内容由我们来实现
    需要注册,例如注册在按钮上
    监听器的方法,会在特定事件发生时被调用

观察者
    事件源
        强盗 button
    事件
        抢劫 event
    监听器
        捕快 actionListener
        监听器中的方法:抓捕 actionPerformed

JavaWeb中的监听器
    事件源:三大域
        ServletContext 项目启动时生 关闭死
            生命周期监听ServletContextListener:有两个方法,一个在出生时调用,一个在死亡时调用
                void contextInitialized(ServletContextEvent sce):创建ServletContext时
                void contextDestroyed(ServletContextEvent sce):销毁ServletContext时
            属性监听ServletContextAttributeListener:有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用
            void attributeAdded(ServletContextAttributeEvent event)添加属性时
            void attributeReplaced(ServletContextAttributeEvent event) 替换属性时
            void attributeRemoved(ServletContextAttributeEvent event) 移除属性时

        HttpSession
            生命周期监听HttpSessionListener:有两个方法,一个在出生时调用,一个在死亡时调用
                void sessionCreated(HttpSessionEvent e) 创建session时
                void sessionDestroyed(HttpSessionEvent e) 销毁ession时

            属性监听HttpSessiontAttributeListener:有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用
            void attributeAdded(HttpSessionBindingEvent event) 添加属性时
            void attributeReplaced(HttpSessionBindingEvent event)替换属性时
            void attributeRemoved(HttpSessionBindingEvent event) 删除属性时

        ServletRequest      
            生命周期监听ServletRequestListener:有两个方法,一个在出生时调用,一个在死亡时调用
                void requestInitialized(ServletRequestEvent sre):创建request时
                void requesDestroyed(ServletRequestEvent sre):销毁request时
            属性监听ServletRequestAttributeListener:有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用
            void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
            void attributeReplaced(ServletRequestAttributeEvent srae)替换属性时
            void attributeRemoved(ServletRequestAttributeEvent srae) 删除属性时

        JSP真身=“JSP通过Servlet容器生成Servlet和JSP之间的关系”
    javaweb完成编写监听器
        写一个监听器类:实现某个监听器接口
        注册:在web.xml中完成配置完成      

    事件对象
        ServletContextEvent:ServletContext getServletContext()
        HttpSessionEvent:HTTPSession getSession()
        ServletRequestEvent
            ServletContext getServletContext()
            ServletRequest getServletRequest()  
        ServletContextAttributeEvent
            ServletContext getServletContext();
            String getName():获取属性名
            String getValue():获取属性值
        HttpSessionBindingEvent:略
        ServletRequestAttributeEvent:略

    感知监听(都与HttpSession相关)
        用来添加到JavaBean上,而不是添加到三大域上
        不需要在web.xml中注册

    HttpSessionBindingListener:添加到javabean上,javabean就知道自己是否添加到session中了 

    HttpSessionActivationListener:Tomcat会在session从时间不被使用时钝化session对象,所谓钝化session,就是把session通过序列化的方式保存到硬盘文件中。
    当用户再使用session时,tomcat还会把钝化的对象再活化session,所谓活化就是把硬盘文件中的session再反序列化回内存。
    当session被Tomcat钝化时,session中存储的对象也被钝化,当session被活化时,也会把session中存储的对象活化。
    如果某个类实现HttpSessionActivationListener接口后,当对象随着session被钝化和活化时。下面两个方法就会被调用
        public void sessionWillPassivate(HttpSessionEvent se):当对象感知被活化时调用本方法
        public void sessionDidActivate(HttpSessionEvent se)当对象感知被钝化时调用本方法

    HttpSessionActivationListener监听器与HttpSessionBindingListener监听器相似,都是感知型的监听器,
    如果让Person类实现了HttpSessionActivationListener监听器接口,并把Person对象添加到了session中后,
    当Tomcat钝化session时,同时也会钝化session中的Person对象,这时Person对象就会感知到自己被钝化了,
    其实就是调用Person对象的sessionWillPassivate()方法,当用户再次使用session时,Tomcat会活化session,
    这时Person会感知到自己被活化,其实就是调用Person对象的sessionDidActivate()方法 

    因为钝化和活化session,其实就是使用序列化和反序列化技术把session从内存保存到硬盘,和把session从硬盘加载到内存。
    这说明如果Person类没有实现Serializable接口,那么当session钝化时就不会钝化Person,而是把Person从session中移除再钝化。这说明session活化后,session中不再有Person对象了

需要实现serializable接口才可以和session一起被保存到硬盘

国际化
    国际化就是可以把页面中的中文变成英文

这里写图片描述
这里写图片描述
这里写图片描述

/**
 * 可以在监听器存放一些在tomcat启动时就要完成的代码
 * @author Administrator
 *
 */
public class AListener implements ServletContextListener {

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

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

}
public class BListener implements ServletContextAttributeListener {

    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("向apllication添加了一个"+event.getName()+",值为:"+event.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println(event.getName()+"=" +event.getValue());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        //返回旧值 因为旧值就只有这次了 新值还可以再获取
        System.out.println(event.getName()+"="+event.getValue()+","
        +event.getServletContext().getAttribute(event.getName()));
    }

}
public class Customer implements HttpSessionActivationListener {

    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("和session一起活化");
    }

    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("和session从内存到硬盘");
    }

}
/**
 * 写2个配置文件,一个文件中存放中文信息,另一个存放英文信息
 * 使用一个类,来通过语言环境,最终识别加载哪一个文件的信息:ResourceBundle
 * 什么语言环境:Locale
 *  zn_CN
 *  en_US
 *  new Locale("zh","CN");
 *  Locale.getDefault();
 * @author Administrator
 *资源文件名称的格式:基本名称+Locale部分+.properties
 *例如res_zh_CN.properties,其中基本名称为res,而zh_CN是Locale部分
 *必须所有的资源文件基本名称要相同,不同之处就是Locale部分
 */
public class Demo1 {
    @Test
    public void fun1(){
        Locale locale = Locale.US;
        //得到ResourceBundle
        //第一个参数是基本名称
        //第二个参数是Locale
        ResourceBundle rb = ResourceBundle.getBundle("res",locale); 

        //使用ResourceBundle来获取资源
        System.out.println(rb.getString("username"));
        System.out.println(rb.getString("password"));
        System.out.println(rb.getString("login"));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值