监听器:所谓的监听器是指对整个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=”函数(单引号 + 字符串)”>

javaWeb核心技术第十一篇之Listener的更多相关文章

  1. javaWeb核心技术第四篇之Javascript第二篇事件和正则表达式

    - 事件 - 表单提交(掌握) "onsubmit" - 单击事件(掌握) "onclick" - 页面加载成功事件(掌握) "onload" ...

  2. javaweb回顾第十一篇过滤器(附实现中文乱码问题)

    1:过滤器概念 过滤器就是一种在请求目标资源的中间组件,比喻把污水转换成纯净水中间需要一个污水净化设备,那么这个设备就好比一个过滤器.那么我用图来表示过滤器(可以有多个过滤器)运行的过程 2:Filt ...

  3. javaWeb核心技术第十三篇之Ajax

    Js--ajax--原理解释 概述:异步刷新网页,不会刷新整个页面. Get原理: <%@ page language="java" contentType="te ...

  4. javaWeb核心技术第十篇之Filter

    Web中有三大组件(需要配置web.xml) servlet:服务器端的小程序. Filter(过滤器):运行在服务器,对请求的资源进行过滤,对响应进行包装. 经典案例: 自动登录,网站全局编码,非法 ...

  5. javaWeb核心技术第八篇之Cookie和Session

    会话技术: 会话是什么? 浏览器和服务器交互,浏览器打开网页访问服务器,会话开始,正常交互. 浏览器关闭,会话结束. 会话能干什么? 会话可以共享数据. Cookie和session将数据保存在不同的 ...

  6. javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response

    - Web服务器 - 概念: - web资源: "英文直译"网"的意思 资源:一切数据文件 web资源:通过网络可以访问到的资源,通常指的是一切放在服务器上的文件&quo ...

  7. javaWeb核心技术第六篇之BootStrap

    概述: Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目. 作用: 开发响应式的页面 响应式:就是一个网站能够兼容多个终端 节约开发 ...

  8. javaWeb核心技术第五篇之jQuery

    - 概述 - jQuery是一个优秀的javascript框架(js类库),兼容css3和各大浏览器,提供dom,events,animate,ajax等简易的操作.并且jQuery有非常丰富的插件, ...

  9. javaWeb核心技术第三篇之JavaScript第一篇

    - 概述 - JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言 - 作用:给页面添加动态效果,校验用户信息等. - 入门案例 - js和html的整合 - 方式1:内联式 ...

随机推荐

  1. rabbitmq~消息失败后重试达到 TTL放到死信队列(事务型消息补偿机制)

    这是一个基于消息的分布式事务的一部分,主要通过消息来实现,生产者把消息发到队列后,由消费方去执行剩下的逻辑,而当消费方处理失败后,我们需要进行重试,即为了最现数据的最终一致性,在rabbitmq里,它 ...

  2. 我的chrome 智能扩展插件copier开源了!!!

    整理了下之前写的chrome-extensions-copier,分享给大家. 这个插件呢,主要用来在chrome浏览器上复制某些网站的某些特定内容,主要是用来复制代码,提高效率!(没办法,某些网站不 ...

  3. Java实现微信小程序支付(完整版)

    在开发微信小程序支付的功能前,我们先熟悉下微信小程序支付的业务流程图: 不熟悉流程的建议还是仔细阅读微信官方的开发者文档. 一,准备工作 事先需要申请企业版小程序,并开通“微信支付”(即商户功能).并 ...

  4. Docker入门-笔记-1

    Docker入门 Docker 是 Golang 编写的, 自 2013 年推出以来,受到越来越多的开发者的关注.如果你关注最新的技术发展,那么你一定听说过 Docker.不管是云服务还是微服务(Mi ...

  5. vue & nodejs jwt 的基于token身份验证

    现在比较流行的验证方式,是带着token的登录验证 原理 1. 登陆时,客户端发送用户名密码 2. 服务端验证用户名密码是否正确,校验通过就会生成一个有时效的token串,发送给客户端 3. 客户端储 ...

  6. Mysql 主从复制搭建-极简版

    前言 自己在百度.Google一番踩坑搭建成功后,记录一下,也希望后来人不再被这些坑到. 这里为了方便使用 docker,不会的同学请移步相关 Docker 教程. 正文 1. 启动 mysql #启 ...

  7. jumpserver 资产管理及授权

    1.用户管理-添加[用户列表] 1.1点击创建用户 1.2创建用户 2.用户管理-添加[用户组] 2.1点击创建用户组 2.2创建用户组   3.资产管理添加资产 3.1添加节点 3.2添加资产(点击 ...

  8. RabbitMQ 备份交换机(alternate-exchange)介绍

    RabbitMQ之备份交换机(alternate-exchange) 1.备份交换器,AlternateExchange(AE) 备份交换器是为了实现没有路由到队列的消息,声明交换机的时候添加属性al ...

  9. SoapUI 之 webService 接口测试 [5]

    一.webservice接口实例说明 学习的话,大家可以自行到网上找 一些免费的webservice接口来练手.本文中选择实例为:中国电视节目预告(电视节目表) WEB 服务. Endpoint : ...

  10. Git实战指南----跟着haibiscuit学Git(第十篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...