JavaWeb基础03

本文介绍了JavaWeb中的过滤器(Filter)概念、实现步骤、执行流程、生命周期方法和配置详解,以及监听器(Listener)的ServletContextListener用法。此外,还讲解了JQuery的基础知识,包括选择器、DOM操作和事件处理。
摘要由CSDN通过智能技术生成

1.Filter(过滤器)

概念

  • 生活中的过滤器:净水器,空气净化器,土匪、

  • web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

  • 过滤器的作用:
    一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…

1.实现步骤

步骤

  1. 定义一个类,实现接口Filter

  2. 复写方法

  3. 配置拦截路径(web.xml,注解)

@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class filter01 implements Filter {
   
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
        System.out.println("filter01被执行了。。。。。");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
   

    }
}

web.xml

    <filter>
        <filter-name>demo1</filter-name>
        <filter-class>Filters.filter01</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>demo1</filter-name>
        <!-- 拦截路径  拦截所有-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2.过滤器执行流程

在这里插入图片描述
过滤器代码中的方法

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filter) throws IOException, ServletException {
   
        System.out.println("进去(请求)");
        //放行
        filter.doFilter(req,resp);
        
        System.out.println("出来(响应)");
    }

访问资源代码

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("servlet.....");
    }

执行结果
在这里插入图片描述

3.过滤器生命周期方法

  1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源

  2. doFilter:每一次请求被拦截资源时,会执行。执行多次

  3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

代码示例

@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class filter01 implements Filter {
   

    //在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        System.out.println("init方法被执行了。。。。。");
    }

    //每一次请求被拦截资源时,会执行。执行多次
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filter) throws IOException, ServletException {
   
        System.out.println("doFilter方法被执行了。。。。。");
        //放行
        filter.doFilter(req,resp);

    }

    //在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
    @Override
    public void destroy() {
   
        System.out.println("destroy方法被执行了。。。。。");
    }
}

4.过滤器配置详解

拦截路径配置

  1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行

  2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行

  3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行

  4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行

拦截方式配置

  • 注解配置(设置dispatcherTypes属性)
  1. REQUEST:默认值。浏览器直接请求资源时,才能被过滤器

  2. FORWARD:只有转发被访问的资源,才能被过滤器过滤

  3. INCLUDE:包含访问资源

  4. ERROR:错误跳转资源

  5. ASYNC:异步访问资

代码示例FORWARD

//只有转发访问时,该过滤器才会被执行
@WebFilter(value = "/*",dispatcherTypes = DispatcherType.FORWARD)
public class filter02 implements Filter {
   


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        System.out.println("init-filter02");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filter) throws IOException, ServletException {
   
        System.out.println("filter02");
        //放行
        filter.doFilter(req,resp);
    }

    @Override
    public void destroy() {
   
        System.out.println("destroy方法被执行了。。。。。");
    }
}

上述代码我们通过浏览器访问资源时,控制台不会输出,只有服务器内部资源转发时,才能进行过滤

例如:

@WebServlet("/servlet01")
public class servlet01 extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("servlet01.....");
        //请求转发
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet02");
        requestDispatcher.forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        this.doPost(req, resp);
    }
}
@WebServlet("/servlet02")
public class servlet02 extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        System.out.println("servlet02.....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
        this.doPost(req, resp);
    }
}

当我们访问http://localhost:8080/javaweb04/servlet01时,我们由于servlet01请求转发给servlet02,所以会启动过滤器,显示如下结果

在这里插入图片描述

  • web.xml配置
1.设置<dispatcher> </dispatcher>标签即可
  
     <filter>
     <filter-name>filter02</filter-name>
     <filter-class>Filters.filter02</filter-class>
 </filter>
 <filter-mapping>
     <filter-name>filter02</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>FORWARD</dispatcher>
 </filter-mapping>

在这里插入图片描述

5.过滤器链

在这里插入图片描述
filter01中的代码

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filter) throws IOException, ServletException {
   
        System.out.println("进:filter01");
        //放行
        filter.doFilter(req,resp);
        System.out.println("出:filter01");
    }

filter02中的代码

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filter) throws IOException, ServletException {
   
        System.out.println("进:filter02");
        //放行
        filter.doFilter(req,resp);
        System.out.println("出:filter02");

    }

当我们访问servlet02
在这里插入图片描述

过滤器先后顺序问题

  1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
  2. web.xml配置: < filter-mapping>谁定义在上边,谁先执行

2.Listener(监听器)

  • 事件监听机制
    • 事件 :一件事情
    • 事件源 :事件发生的地方
    • 监听器 :一个对象
    • 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

1.ServletContextListener

ServletContextListener:监听ServletContext对象的创建和销毁

方法
void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法

实现步骤

  1. 定义一个类,实现ServletContextListener接口,复写方法
@WebListener("/*")
public class Listener01 implements ServletContextListener {
   

    /**监听ServletContext对象创建的。ServletContext对象服务器启动后自动创建。
     * 在服务器启动后自动调用
     * @param servletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
   
        System.out
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值