• javaWeb核心技术第十一篇之Listener


    监听器:所谓的监听器是指对整个WEB环境的监听,当被监视的对象发生改变时,立即调用相应的方法进行处理.
    监听术语:
    事件源:被监听的对象.
    监听器对象:监听事件源的对象
    注册或绑定:1和2结合的过程
    事件:事件源的行为动作(就是事件源的创建或者属性行为)
    事件对象:通过监听器可以获得事件源的对象

    监听域对象创建和销毁(三个):
    Requset Session ServletContext
    类型:ServletRequest HttpSession ServletContext

    ServletContext(重要):

    配置:
    1:创建类实现ServletContextListener接口.
    2.配置web.xml.

    ServletContextListener:监听ServletContext创建和销毁.
    创建:服务器启动创建;
    销毁:服务器关闭销毁.

    web中三大组件,都需要实现接口,并且配置web.xmlns
    <!-- 监听器配置 listener-class类的全限定类名 -->
    <listener>
    <listener-class></listener-class>
    </listener>

    作用:
    1.在创建方法的内部初始化参数(服务器的初始化参数,比如权限,比如,web环境的静态配置,比如后退进程)
    2.服务器关闭调用对应的销毁方法,就可以用来释放资源.( 例如对于一些客户端钱的问题,就需要释放资源进行回传到服务器.)

    Session的创建销毁:
    监听器:HttpSessionListener
    创建:第一次调用getSession()
    销毁:
    1:默认超时30分钟自动销毁.
    2.手动调用invalide().
    3.服务器非正常关闭.
    Request的创建销毁:
    监听器:ServletRequestListener
    创建:请求开始创建
    销毁:响应结束销毁

    例如:
    public class MyServletRequestListener implements ServletRequestListener {
    public void requestDestroyed(ServletRequestEvent sre) {
    System.out.println("request 销毁");
    }
    public void requestInitialized(ServletRequestEvent sre) {
    System.out.println("request 创建");
    }
    }
    <listener>
    <listener-class>全限定类名</listener-class>
    </listener>

    在这里面的五个监听术语:
    1.事件源:服务器tomcat创建request对象.(request)
    2.监听器:(MyServletRequestListener)
    3.注册绑定:<listener-class>全限定类名</listener-class>
    4.事件:(request的创建和销毁)
    5.事件对象:(创建request的方法参数的变量:sre.getSource():参数调用方法使监听器获得事件源)

    监听域对象属性操作(增删改)(三个)
    Request Session ServletContext
    类型:ServletRequestAttributeListener HttpSessionAttributeListener ServletContextAttributeListener

    统一api:
    setAttribute(name,value);
    getAttribute(name);(在监听域对象属性操作中没有查询,这个只是在api里面有)
    removeAttribute(name);

    ServletContextAttributeListener
    监听:域对象属性,添加,移除,替换操作,会执行对应的方法.

    ServletRequestAttributeListener
    监听:域对象属性,添加,移除,替换操作,会执行对应的方法.

    HttpSessionAttributeListener.
    监听:域对象属性,添加,移除,替换操作,会执行对应的方法.
    监听往域中放数据,数据没有任何要求.

    以上六个监听器都必须在web.xml中配置.
    特殊javaBean监听不需要配置web.xml,但配置了也可以.

    监听特殊javaBean(两个)
    特殊javaBean 指的是javaBean对象(类),必须实现特殊的接口User ,Category,Product
    HttpSessionBindingListener:监听javaBean在session中绑定和解绑的.
    HttpSessionAttributeListener:监听数据在session中操作.

    区别:
    HttpSessionAttributeListener : 监听的数据没有要求.
    HttpSessionBindingListener: 只监听特殊javaBean.

    开发中经典案例:在登陆功能中统计登陆成功的人数,但没有源码,
    登陆成功需要将user数据放入session,只需要统计session绑定了几个user对象

    HttpSessionActivactionListener : 监听javaBean 活化和钝化,发生时机在服务器关闭和服务器启动(为什么发生在这里呢?因为session)
    活化:反序列化,将磁盘中内容读取到内存中.
    钝化:序列化,将内存中数据写到磁盘中.
    要求:特殊javaBean必须实现Serializable接口

    2.5邮件
    邮件服务器 : 发送邮件服务器 和 接收邮件服务器
    发送邮件服务器:
    协议:smtp 端口25
    接收邮件服务器
    协议POP3 端口110

    Web中一共有13套规范 tomcat支持2套 Servlet Jsp
    Mail 需要导入jar 今日邮件要求 使用工具类

    要点:
    1.搭建本地的邮件服务器
    2.使用工具类发送邮件

    Js:
    setTimeout( 函数名称 , 毫秒值) 执行一次
    setInterval(函数名称 , 毫秒值) 周期执行
    java定时器: Timer

    * 参数1 : 被执行的任务 TimerTask
    * 参数2 : 延迟执行的时间 (毫秒)
    * 参数3 : 周期执行的时间(毫秒)
    * 真实开发中案例:QQ每年都要发送生日邮件
    * 参数2 : 一般都是凌晨 00:00 切日 跑批任务 获得一天的毫秒值 - 当前已经过去的毫秒值
    * 参数3 : 设置一天的毫秒值
    */
    System.out.println(new Date().toLocaleString());
    new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
    System.out.println(new Date().toLocaleString());
    }
    }, DateUtils.getDelayTime(), DateUtils.getOneDay());

    2.7案例
    1.创建监听器
    2.在监听器的监听创建方法中 初始化定时器
    3.定时器 :
    a)从数据库中获得当天过生日的人 返回值List<User>
    b)Dao层 拼接字符串 需要注意
    c)遍历 发送邮件

    案例:

    public class MyServletContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent arg0) {
    //2.初始化定时器
    new Timer().schedule(new TimerTask() {

    @Override
    public void run() {
    try {
    //3.调用service 获得当天过生日的人
    UserService service = new UserService();
    List<User> list = service.findBirthday();
    //4.遍历集合发送邮件
    for(User user : list) {
    EmailUtils.send(user.getEmail(),"<a href='https://www.baidu.com/'>"+ user.getUsername() + "生日快乐" + "</a");
    System.out.println(user.getUsername() + ": OK");
    }
    }catch(Exception e) {
    e.printStackTrace();
    }

    }
    }, 2000, 4000);
    }
    public void contextDestroyed(ServletContextEvent arg0) {
    }

    }

    public class UserDao {

    public List<User> findBirthday() throws Exception {
    //t_user
    //日期格式 -月 -日
    String birthday = "-" + DateUtils.getCurrentMonth() + "-" + DateUtils.getCurrentDay();

    QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
    String sql = " select * from t_user where birthday like ? ";
    Object[] params = { "%" + birthday + "%"};
    List<User> list = qr.query(sql, new BeanListHandler<User>(User.class), params);
    return list;
    }

    }

    <%--要想在函数的参数传入字符串,必须加单引号 --%>
    <a href="javascript:void(0)" onclick="change('${product.pid}')">
    g src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
    </a>

    UUID.randomUUID().toString().replace("-", ""): 随机生成一个不重复的字符串,进行替换,变成一个由字母和数字组成的字符串.

    随机生成ID UUID.randomUUID
    超链接 <a href=”javascript:void(0)” onclick=”函数(单引号 + 字符串)”>

  • 相关阅读:
    perl next和last
    用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务
    mysql 更新唯一主键列 被堵塞
    perl + 匹配前导模式一次或者多次
    跨域
    日志处理
    FineBI:一个简单易用的自助BI工具
    FineBI:一个简单易用的自助BI工具
    bootstrap-treeview
    Bootstrap树形菜单插件TreeView.js使用方法详解
  • 原文地址:https://www.cnblogs.com/haizai/p/11406184.html
Copyright © 2020-2023  润新知