第1章 课程介绍
1-1 监听器介绍
监听器-Listener
♦ 监听器(Listener)是J2EE Servlet模块下的组件
♦ Listener的作用对Web应用对象的行为进行监控
♦ 通过Listener监听自动触发指定的功能代码
三种监听对象
♦ ServletContext - 对全局ServletContext及其属性进行监听
♦ HttpSession - 对用户会话及其属性操作进行监听
♦ ServletRequest - 对请求及属性操作进行监听
过滤器与监听器的区别
♦ 过滤器(Filter)的职责是对URL进行过滤拦截,是主动的执行
♦ 监听器(Listener)的职责是对Web对象进行监听,是被动触发
1-2 第一个监听器
开发监听器的三要素
♦ 实现XxxListener接口,不同接口对应不同监听对象
♦ 实现每个接口中独有的方法,实现触发监听的后续操作
♦ 在web.xml中配置<listener>
使监听器生效
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class FirstLstener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("ServletContext已销毁");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("ServletContext已初始化");
}
}
监听器的配置方式:
在web.xml当中配置
<listener>
<listener-class>com.imooc.listener.FirstListener</listener-class>
</listener>
注解方式:
@WebListener
1-3 内置对象监听器
内置对象监听接口
♦ ServletContextListener - 监听ServletContext对象创建、销毁操作
♦ HttpSessionListener - 监听HttpSession对象创建、销毁等操作
♦ ServletRequestiListener - 监听HttpServletRequest对象创建、销毁
代码
Servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().println("Hello World!");
request.getServletContext().setAttribute("sc-attr1", "sc-attr-value1");
request.getServletContext().removeAttribute("sc-attr1");
request.getSession().setAttribute("session-attr1", "session-attr-value1");
request.setAttribute("request-attr1", "request-attr-value1");
}
监听类
public class WebListener implements ServletContextListener,HttpSessionListener,ServletRequestListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("ServletContext已初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("ServletContext已被销毁");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
// TODO Auto-generated method stub
System.out.println("Session已被创建,SessionId:" + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("Session已被销毁");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("HttpServletRequest已被销毁");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
// TODO Auto-generated method stub
System.out.println("HttpServletRequest已被创建,URI:" + request.getRequestURI());
}
}
在web.xml当中配置
<listener>
<listener-class>com.imooc.listener.WebListener</listener-class>
</listener>
- 第一个请求,Web应用启动时,ServletContext被初始化,启动成功后访问地址时,一个HttpServletRequest对象被创建。同时因为是一个新的浏览器窗口,所以tomcat会创建一个session对象,网页处理完成后HttpServletRequest被销毁。
- 第二次请求(当浏览器窗口刷新后),session 并没有被创建,因为session id 已存在,通过确认session id 的存在,所以并不会创建新的session。此时,HttpServletRequest 又经历了一次创建与销毁的过程。
- 当浏览器关闭重新打开一个新的窗口,再次访问这个网址,这时一个新的session被创建。原因是新的浏览器并没有包含任何session id,所以由新的浏览器窗口向tomcat发送请求后,会为其创建一个对应的session,原有的session id并不会消失,原因是session id的凭证不存在了,30分钟后自然过期,或程序代码人为关闭。
- 当(servlet)关闭应用时,ServletContext 才被销毁。
1-4 属性监听器
属性监听接口
♦ ServletContextAttribut