SpringBoot_04注入3大web组件

3大web组件是什么

3大web组件指的是Servlet、Listener、Filter

Servlet

  • Servlet本质上就是java程序
  • 只有实现Servlet接口,就可以说是一个Servlet
  • Servle可以说是整个web开发的基石,包括Springmvc也是基于servlet开发的

Listener监听器

  • 作用:监听某种变化(对象创建、销毁),当发送变化时做出相应的变化
  • 实现监听器的接口就可以声明为listener,Web提供的监听器一共有8种,例如ServletContextListener,ServletContextAttributeListener

Filter过滤器

  • 作用:拦截请求,过滤响应
  • 通过实现Filter接口可以将一个类声明为过滤器

SpringBoot注入web三大组件

  1. 方案一:@ServletComponentScan + @WebFilter/@WebListener/@WebServlet
//在启动类中声明@ServletComponentScan并传入要扫描的包的范围
@ServletComponentScan(basePackages = "com.servlet")
@SpringBootApplication
public class application {
    public static void main(String[] args) {

        ApplicationContext ioc = SpringApplication.run(application.class, args);
    }
}


@WebServlet(urlPatterns = "/abc")
public class servlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget.....");
    }
}


@WebListener(value = "/*")
public class listener01 implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听器init()");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听器destroy()");
    }
}

@WebFilter(urlPatterns = "/*")
public class filter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器dofilter...");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("过滤器destroy...");
    }
}

  1. 方案二:
@Configuration
public class registerConfig {
    //servlet注入方式2
   
    @Bean
    public ServletRegistrationBean servlet() {
        servlet servlet = new servlet();

        return new ServletRegistrationBean(servlet, "/servlet01");
    }

    @Bean
    public FilterRegistrationBean filter() {
        //filter注入方式2
        filter filter = new filter();
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter);
        //指定拦截范围
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));

        return filterRegistrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean listener() {
        //listener注入方式2
        listener listener = new listener();

        ServletListenerRegistrationBean listenerRegistrationBean = new ServletListenerRegistrationBean(listener);
        return listenerRegistrationBean;
    }
}
public class servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget.....");
    }
}

public class listener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听器init()");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听器destroy()");
    }
}


public class filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器dofilter...");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("过滤器destroy...");
    }
}

原生Servlet与DispacterServlet的区别

  • 两者都是Servlet,都实现了Servlet接口
    在这里插入图片描述
    在这里插入图片描述
    不同的是两者的继承体系树不一样,DispacterServlet有着更多的继承父类,那么就代表着他的功能就更加的强大
  • 原生Servlet与DispacterServlet是同一级别的概念,又或者说他们是两条不同的分支,选择了DispacterServlet就不能走原生Servlet
  • 两者的执行流程也是不一样的
  1. 原生servlet走的流程是:初始化init() -> 服务service() -> 销毁destroy()这样一个声明周期
  2. DispacterServlet走的流程:dispacterServlet -> 映射器 -> 适配器 -> handler -> 视图处理器 -> 视图渲染view -> 客户端返回值
  • 优先级匹配问题:
  1. 在Springmvc中DispacterServlet拦截的请求范围是 / ,优先级最低
  2. 而原生Servlet一般是精准匹配,优先最高
  3. 优先级排位:精准匹配 > 模糊匹配 > 全部拦截

自定义监听器

一个自定义监听器需要满足3个条件

  • 事件
  • 监听器
  • 发布器
//方案一:

//事件
//被监听的事件必须实现ApplicationEvent接口
@Data
public class Obj extends ApplicationEvent {

    String Message;

    public Obj(Object source, String message) {
        super(source);
        this.Message = message;
    }
}


//监听器
//监听器需实现ApplicationListener接口,并指定监听对象
@Component
public class myListener implements ApplicationListener<Obj> {

    @Override
    public void onApplicationEvent(Obj event) {
        //联动触发事件
        System.out.println("Obj...."+event.Message);
    }
}


//事件发布器
@Component
public class EventPublisher {

    @Resource
    ApplicationContext applicationContext;

    public void publish(ApplicationEvent applicationEvent){
        //发布事件
        applicationContext.publishEvent(applicationEvent);
    }
}

//启动类
@SpringBootApplication
public static void main(String[] args) {

        ApplicationContext ioc = SpringApplication.run(application.class, args);

        //获取事件发布器
        EventPublisher publisher = ioc.getBean(EventPublisher.class);
        //创建事件
        Obj obj = new Obj(publisher,"中国");
       	//发布事件
        publisher.publish(obj);
        }
//方式二:

//事件
//被监听的事件必须实现ApplicationEvent接口
@Data
public class Obj extends ApplicationEvent {

    String Message;

    public Obj(Object source, String message) {
        super(source);
        this.Message = message;
    }

}

//监听器
@Component
public class myListener implements ApplicationListener<Obj> {

    @Override
    public void onApplicationEvent(Obj event) {
        //联动触发事件
        System.out.println("Obj...."+event.Message);
    }
}


//启动类 兼 发布器
@SpringBootApplication
public class application {
    public static void main(String[] args) {

        ConfigurableApplicationContext ioc = SpringApplication.run(application.class, args);
        //发布事件
        ioc.publishEvent(new Obj(new Object(),"你好"));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值