Javaweb开发中的监听器,是用于监听web常见对象
HttpServletRequest HttpSession ServletContext
监听它们的创建与销毁 属性变化 session绑定javaBean
监听机制(监听什么东西)
事件 就是一个事情
事件源 产生这个事情的源头
监听器 用于监听指定的事件的对象
注册监听 要想让监听器可以监听到事件产生,必须对其进行注册。
Javaweb开发中常见监听器
监听域对象的创建与销毁
监听ServletContext创建与销毁 ServletContextListener
/**
* 声明一个监听器(监听ServletContext创建与销毁)
* @author lanou
*
*/
public class MyServletContextListener implements ServletContextListener{
//初始化方法
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext初始化方法");
}
//销毁方法
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁方法");
}
}
监听HttpSession创建与销毁 HttpSessionListener
public class MyHttpSessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
//HttpSessionEvent 事件源对象
//获取session
HttpSession session = se.getSession();
System.out.println("session创建"+session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session销毁");
}
}
监听HttpServletRequest创建与销毁 ServletRequestListener
public class MySevletRequestListener implements ServletRequestListener{
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request创建");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("销毁");
}
}
监听域对象的属性变化
监听ServletContext属性变化 ServletContextAttributeListener
监听HttpSession属性变化 HttpSessionAttributeListener
监听HttpServletRequest属性变化 ServletRequestAttributeListener
/**
* 监听Request域中值得变化
* @author lanou
*
*/
public class MyServletRequestAttritbuteListener implements ServletRequestAttributeListener{
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("添加");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("删除");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("替换");
//查看一下替换的内容
System.out.println(srae.getName() +" "+srae.getValue());
}
}
监听session绑定javaBean
它是用于监听javaBean对象是否绑定到了session域 HttpSessionBindingListener
注意:
1.不用在xml中注册
2.实现接口的类 是javaBean类
/**
* 测试HttpSessionBindingListener接口
* @author lanou
*
*/
public class User implements HttpSessionBindingListener{
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("添加");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("移除");
}
}
Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。
配置方式
创建一个类实现Filter接口
重写接口中方法 doFilter方法是真正过滤的。
在web.xml文件中配置
注意:需要放行资源
/**
* 创建Filter拦截器(过滤器)步骤
* @author lanou
*
*注意:Filter与servlet生命周期的区别
* Filter在你服务器启动时就会创建
*/
public class MyFilter implements Filter{
public MyFilter() {
System.out.println("Filter实例化方法");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter创建了");
}
//拦截到资源会触发该方法
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//解决乱码问题(路径配置合适,就都能解决乱码问题)
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("拦截了");
//调用放行的方法
chain.doFilter(request, response);
System.out.println("拦截完了");
}
@Override
public void destroy() {
System.out.println("Filter销毁了");
}
}
Filter生命周期
Servlet生命周期:
实例化 –》 初始化 –》 服务 –》 销毁
当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.
Filter配置
基本配置
<filter>
<filter-name>filter名称filter-name>
<filter-class>Filter类的包名.类名filter-class>
filter>
<filter-mapping>
<filter-name>filter名称filter-name>
路径
filter-mapping>
1.
完全匹配 以”/demo1”开始,不包含通配符*
目录匹配 以”/”开始 以*结束
扩展名匹配 *.xxx 不能写成/*.xxx
2.
它是对指定的servlet名称的servlet进行拦截的。
3. 对访问方式进行拦截
可以取的值有 REQUEST FORWARD
它的作用是:当以什么方式去访问web资源时,进行拦截操作.
1.REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值
2.FORWARD 它描述的是请求转发的拦截方式配置
public class FirstServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是FirstServlet");
//请求转发 转发到SecondServlet
request.getRequestDispatcher("/secondServlet").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class SecondServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是SecondServlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}