一.监听器的概念:
所谓的监听器就是对内置对象的状态或者属性进行监听并且做出反应的特殊的 servlet,
暂时也需要再 web.xml 文件中对监听器进行相关的配置.
对属性和状态监听:
内置对象有两种状态变化: 产生, 销毁,
当产生内置对象的时候能监听, 销毁的时候也能进行监听,
当内置对象中增加, 删除, 修改一个属性的时候也能进行监听.
二.监听 request 内置对象的状态
监听 request 状态,要实现 request 内置对象的状态监听需要实现一个接口"javax.servlet.ServletRequestListener".
Demo : 定义监听器
1.定义 request 内置对象的状态监听器
1 public class RequestListener implements ServletRequestListener{ 2 @Override 3 public void requestDestroyed(ServletRequestEvent arg0) { 4 System.out.println("销毁 request 内置对象"); 5 } 6 @Override 7 public void requestInitialized(ServletRequestEvent arg0) { 8 System.out.println("创建 request 内置对象"); 9 } 10 }
2.配置 request 内置对象的状态监听器
1 <!-- 配置 request 内置对象的状态监听器 --> 2 <listener> 3 <listener-class>com.sxt.mvcpro.listener.RequestListener</listener-class> 4 </listener>
Demo: 使用 request 监听器观察客户端跳转和服务器跳转
1 @SuppressWarnings("serial") 2 public class EmpServlet extends HttpServlet{ 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 // req.getRequestDispatcher("/pages/welcome.jsp").forward(req, resp); 6 resp.sendRedirect("/MvcPro/pages/welcome.jsp"); 7 } 8 }
服务端: 客户端:
创建 request 内置对象 创建 request 内置对象
销毁 request 内置对象 销毁 request 内置对象
创建 request 内置对象
销毁 request 内置对象
总结:
服务端跳转只创建了一个 request 内置对象, 所以本质就发送了一个请求
客户端跳转回创建新的 request 内置对象, 一共创建了两个 request 内置对象, 所以发送了两次请求.
三. 监听 request 内置对象的属性变化
要实现 request 对象的属性监听变化需要另外一个接口 "ServletRequestAttributeListener"
Demo: 监听 request 的属性变化
1.定义 request 内置对象的属性监听器
1 public class RequestAttributeListener implements ServletRequestAttributeListener{ 2 @Override 3 public void attributeAdded(ServletRequestAttributeEvent event) { 4 System.out.println("增加属性时候触发: " + event.getName() + ":" + event.getValue()); 5 } 6 @Override 7 public void attributeRemoved(ServletRequestAttributeEvent event) { 8 System.out.println("删除属性时候触发: " + event.getName() + ":" + event.getValue()); 9 } 10 @Override 11 public void attributeReplaced(ServletRequestAttributeEvent event) { 12 System.out.println("替换属性时候触发: " + event.getName() + ":" + event.getValue()); 13 } 14 }
2.配置 request 内置对象的属性监听器
<listener> <listener-class>com.sxt.mvcpro.listener.RequestAttributeListener</listener-class> </listener>
3.测试监听器
1 @SuppressWarnings("serial") 2 public class EmpServlet extends HttpServlet{ 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 //增加属性 6 req.setAttribute("name", "李四"); 7 //替换属性 8 req.setAttribute("name", "张三"); 9 //删除属性 10 req.removeAttribute("name"); 11 } 12 }