监听器用于监听对象的上的事件发生,在Servlet中监听器主要监听请求对象、会话对象、上下文对象以及监听这些对象的作用域操作。JavaEE为我们提供了一系列的监听器接口,开发时按需实现相应的接口即可。
4.13.1 监听作作用域对象的创建与销毁
监听器 | 说明 |
---|---|
ServletRequestListener | 监听请求对象的创建和销毁 |
HttpSesisonListener | 监听会话对象的创建和销毁 |
ServletContextListener | 监听Servlet上下文对象的创建和销毁 |
代码示例:
1.请求对象监听器
public class DemoRequestListener implements ServletRequestListener{ /** * 当请求对象销毁后容器执行此方法 * 销毁方法中同样也有一个ServletRequestEvent事件对象 */ public void requestDestroyed(ServletRequestEvent event) { //通过这个事件对象就可以获取当前的请求对象 HttpServletRequest request = (HttpServletRequest)event.getServletRequest(); System.out.println("销毁请求对象..."+request); } /** * 当请求对象创建之后容器调用此方法 * ServletRequestEvent这个参数就是一个事件对象 */ public void requestInitialized(ServletRequestEvent event) { //通过这个事件对象就可以获取当前的请求对象 HttpServletRequest request = (HttpServletRequest)event.getServletRequest(); System.out.println("初始化了请求对象..."+request); } }
web.xml配置
<!-- 配置监听器 -->
<listener>
<!-- 指定监听器的完整类名 -->
<listener-class>edu.nf.ch10.listener.DemoRequestListener</listener-class>
</listener>
2.会话对象监听器
public class DemoSessionListener implements HttpSessionListener{ /** * 监听HttpSession对象的创建 * HttpSessionEvent参数是一个事件对象 * 通过它可以获得当前的HttpSession */ public void sessionCreated(HttpSessionEvent event) { HttpSession session = event.getSession(); System.out.println("创建了Session对象"+session); } /** * 监听HttpSession对象的销毁 */ public void sessionDestroyed(HttpSessionEvent event) { HttpSession session = event.getSession(); System.out.println("销毁了Session对象"+session); } }
注意:当第一次调用了request.getSesison()方法创建Session时,监听器才会起作用。
web.xml配置
<listener>
<!-- 指定监听器的完整类名 -->
<listener-class>edu.nf.ch10.listener.DemoSessionListener</listener-class>
</listener>
3.Servlet上下文监听器
public class DemoContextListener implements ServletContextListener{ /** * 监听ServletContext的销毁 */ public void contextDestroyed(ServletContextEvent event) { //通过事件对象获取ServletContext ServletContext sc = event.getServletContext(); System.out.println("销毁了ServletContext对象..."+sc); } /** * 监听SerlvetContext的创建 */ public void contextInitialized(ServletContextEvent event) { //通过事件对象获取ServletContext ServletContext sc = event.getServletContext(); System.out.println("创建了ServletContext对象..."+sc); } }
web.xml
<listener>
<!-- 指定监听器的完整类名 -->
<listener-class>edu.nf.ch10.listener.DemoContextListener</listener-class>
</listener>
4.13.2 监听作用域的操作
监听器 | 说明 |
---|---|
ServletRequestAttributeListener | 监听请求作用域的操作 |
HttpSessionAttributeListener | 监听会话作用域的操作 |
ServletContextAttributeListener | 监听Servlet上下文作用域的操作 |
示例代码:
这里以HttpSessionAttributeListener说明,其他作用于监听器用法相似。
public class DemoSessionAttributeListener implements HttpSessionAttributeListener{ /** * 当有数据添加到会话作用域时,执行此方法 */ public void attributeAdded(HttpSessionBindingEvent event) { //获取存入作用域的键和值 System.out.println("存入会话作用域..."+event.getName() + " : " + event.getValue()); } /** * 当从会话作用域移除数据时,执行此方法 */ public void attributeRemoved(HttpSessionBindingEvent event) { System.out.println("移除会话作用域..."+event.getName() + " : " + event.getValue()); } /** * 当替换了会话作用域中的某个数据时,执行此方法 */ public void attributeReplaced(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); //从session中获取的是替换之后的值 System.out.println("替换的值: "+session.getAttribute("userName").toString()); //注意:这里event.getValue()获取到的是替换之前的值 System.out.println("替换会话作用域..."+event.getName() + " : " + event.getValue()); } }
web.xml
<listener>
<!-- 指定监听器的完整类名 -->
<listener-class>edu.nf.ch10.listener.DemoSessionAttributeListener</listener-class>
</listener>
4.14 注解配置
Servlet3.0开始提供了一系列的注解来配置Servlet、Fiilter、Listener等等。这种方式可以极大的简化在开发中大量的xml的配置。从这个版本开始,web.xml可以不再需要,使用相关的注解同样可以完成相应的配置。
注解 | 说明 |
---|---|
@WebServlet | 这个注解标识在类上,用于配置Servlet。例如:@WebServlet(name="hello", urlPatterns="/hello") 也可简化配置@WebServlet("/hello") |
@WebFilter | 这个注解标识在类上,用于配置Filter。例如:@WebFilter(filterName="encode",urlPatterns="/") 也可简化配置@WebFilter("/"), |
@WebListener | 这个注解标识在类上,用于配置监听器 |