JavaWeb基础03

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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值