SpringBoot-基础-06-servlet三大组件

SpringBoot-servlet三大组件

servlet三大组件,简单servlet、过滤servlet、监听servlet,即Servlet、Filter、Listener ,三大组件注册方式大同小异。

一、Servlet

(1)简介:

Servlet主要用于处理客户端的请求,当我们在浏览器回车跳转时,请求就会被发送对应 的Servlet处理。

作用:接收请求数据
处理请求
完成响应

(2)Servlet的创建和使用

①创建一个Servlet类,继承HttpServlet
②编写一个Configuration类,注册Servlet的Bean
Servlet类

 public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response){
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response){
        System.out.println("现在执行Servlet的doPost方法");
    }
}

Configuration类

@Configuration
public class Config {
    @Bean
    public ServletRegistrationBean myServlet(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet());
        registrationBean.addUrlMappings("/login");
        return registrationBean;
    }
}

请求测试:
SpringBoot-基础-06-servlet三大组件_第1张图片
测试结果:
SpringBoot-基础-06-servlet三大组件_第2张图片

二、Filter过滤器

(1)简介:

它是基于函数回调实现链式对网络请求和响应的拦截和修改。拦截已有请求,对不需要或不符合的信息资源进行预处理。
执行顺序:过滤前—拦截前—Action处理—拦截后—过滤后
SpringBoot-基础-06-servlet三大组件_第3张图片

(2)Filter的创建和使用

①创建一个Filter类,实现Filter接口
②编写一个Configuration类,注册Filter的Bean Filter类

Filter类,
init()初始化方法,只在过滤器创建的时候执行一次,用于初始化过滤器的属性
doFilter()过滤方法,调用该方法的入参 FilterChain对象的 doFilter 方法对请求放行执行后面的逻辑,若未调用 doFilter 方法则本次请求结束,并向客户端返回响应失败
destory()销毁方法, 此方法用于销毁过滤器,过滤器被创建以后只要项目一直运行,过滤器就会一直存在,在项目停止时,会调用该方法销毁过滤器

 public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException{
        System.out.println("现在进行Filter的init初始化方法");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("现在执行doFilter方法");
        HttpServletRequest hsr = (HttpServletRequest) servletRequest;
        String url = hsr.getRequestURL().toString();
        if(url.contains("/testfilter")){
            System.out.println("不拦截:"+url);
            filterChain.doFilter(servletRequest,servletResponse);
        }
        else if(url.contains("/test")){
            System.out.println("进行拦截:"+url);
            return ;
        }
    }

    @Override
    public void destroy() {
        System.out.println("现在执行销毁方法");
    }

}

Configuration类

public class Config {
//    @Bean
//    public ServletRegistrationBean myServlet(){
//        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet());
//        registrationBean.addUrlMappings("/login");
//        return registrationBean;
//    }
    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        //设置拦截规则
        registrationBean.setUrlPatterns(Arrays.asList("/testfilter","/test"));
        return registrationBean;
    }
}

测试结果:

SpringBoot-基础-06-servlet三大组件_第4张图片

SpringBoot-基础-06-servlet三大组件_第5张图片

SpringBoot-基础-06-servlet三大组件_第6张图片
SpringBoot-基础-06-servlet三大组件_第7张图片

三、Listener监听器

3.1、简介:

监听器就是监听某个对象的状态变化的组件

(1)事件源:被监听的对象。主要有三个域对象:request、session、servletContext(application)。
(2)监听器:监听事件源对象的组件,事件源对象的状态变化就会触发监听器。
(3)注册监听器:将监听器与事件源进行绑定。
(4)响应行为:监听器听到事件源的转台变化是,所涉及的功能代码

3.2、事件源监听器

(1)创建和销毁事件监听器

①ServletContextListener 接口
ServletContext对象创建时:激发contextInitialized(ServletContextEvent sce)方法
ServletContext对象销毁时:激发contextDestroyed(ServletContextEvent sce)方法

②HttpSessionListener接口
HttpSession对象创建时:激发sessionCreated(HttpSessionEvent se)方法
HttpSession对象销毁时:激发contextDestroyed(ServletContextEvent sce)方法
③ServletRequestListener 接口
Request对象创建时:激发requestInitialized方法
Request对象销毁时:激发requestInitialized方法

(2)属性增加删除监听器

监听器:
①ServletContextAttributeListener
②HttpSessionAttributeListener
③ServletRequestAttributeListener
监听对象属性的增加、删除和替换,三个监听器接口方法名称相同,参数不同

(1)监听对象增加属性,web容器调用事件监听器的这个方法
public void attributeAdded()方法,不同域对象参数分别为:ServletContextAttributeEvent scae 、HttpSessionBindingEvent hsbe、ServletRequestAttributeEvent srae
(2)监听对象
删除
属性,web容器调用事件监听器的这个方法
public void attributeRemoved (ServletContextAttributeEvent scae)方法,不同域对象参数分别为:ServletContextAttributeEvent scae、HttpSessionBindingEvent hsbe、ServletRequestAttributeEvent srae
(3)监听对象
替换*属性,web容器调用事件监听器的这个方法
public void attributeReplaced (ServletContextAttributeEvent scae)方法,不同域对象参数分别为:ServletContextAttributeEvent scae、HttpSessionBindingEvent hsbe、ServletRequestAttributeEvent srae

(3)对象的状态监听器

对象绑定到HttpSession对象: void valueBound(HttpSessionBindingEvent event)
对象与HttpSession对象解绑:void valueUnbound(HttpSessionBindingEvent event)
当绑定到HttpSession对象中的对象将要随HttpSession对象被钝化之前:sessionWillPassivate(HttpSessionBindingEvent event)
当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后:
sessionDidActive(HttpSessionBindingEvent event)

一个 web.xml 文件中可以配置多个 Servlet 事件监听器
web 服务器按照它们在 web.xml 文件中的注册顺序来加载和注册这些 Serlvet 事件监听器

四、示例

实现ServletContextListener接口

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce){
        System.out.println("Servlet上下文--->当前web项目启动");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce){
        System.out.println("当前类销毁");
    }
}

注册Listenner监听器

@Configuration
public class Config {
//    @Bean
//    public ServletRegistrationBean myServlet(){
//        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet());
//        registrationBean.addUrlMappings("/login");
//        return registrationBean;
//    }
//注册过滤器
    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        //设置拦截规则
        registrationBean.setUrlPatterns(Arrays.asList("/testfilter","/test"));
        return registrationBean;
    }
//注册监听器
    @Bean
    public ServletListenerRegistrationBean myListener(){
        ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(new MyListener());
        return registrationBean;
    }
}

测试结果
在这里插入图片描述

你可能感兴趣的:(java,spring,boot)