文章目录
- 3大web组件是什么
- SpringBoot注入web三大组件
- 原生Servlet与DispacterServlet的区别
- 自定义监听器
 
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三大组件
- 方案一:@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...");
    }
}- 方案二:
@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
- 两者的执行流程也是不一样的
- 原生servlet走的流程是:初始化init() -> 服务service() -> 销毁destroy()这样一个声明周期
- DispacterServlet走的流程:dispacterServlet -> 映射器 -> 适配器 -> handler -> 视图处理器 -> 视图渲染view -> 客户端返回值
- 优先级匹配问题:
- 在Springmvc中DispacterServlet拦截的请求范围是 / ,优先级最低
- 而原生Servlet一般是精准匹配,优先最高
- 优先级排位:精准匹配 > 模糊匹配 > 全部拦截
自定义监听器
一个自定义监听器需要满足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(),"你好"));
    }
}                
 
 
                     
            
        













 
                    

 
                 
                    