SpringBoot中servlet三大组件的注册[Servlet,Filter,Listener]

由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文
件。所以三大组件的注册也有相应的改变,接下来看一下,springboot中是如何注册的:

一、Servlet的注册

Servlet是一种独立于平台和协议的处于服务器端的Java应用程序,利用他可以实现业务层和表现层的分离,同时又可以生成动态页面

1. 创建一个Servlet类继承HttpServlet

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("<h1>Hello World,servlet!</h1>");
    }
}

2. 在配置类中配置Servlet

import com.infosec.netsafess.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServletComponentConfiguration {

    @Bean
    public ServletRegistrationBean myServlet(){
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
        return servletRegistrationBean;
    }
}
接下来的几个配置都添加在这个配置类中!

执行结果如下:
image

二、Filter的注册

Filter称之为过滤器,可以通过它对web服务器管理的所有web资源,通常用来实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等。

1. 创建一个filter类实现Filter类

import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("过滤器逻辑运行中");
        chain.doFilter(request,response); //放行
    }

    @Override
    public void destroy() {
    }
}

2. 将Filter注册到SpringBoot容器中

    @Bean
public FilterRegistrationBean myFilter(){
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(new MyFilter()); //设置过滤类
    registrationBean.setUrlPatterns(Arrays.asList("/myServlet")); //这里是一个数组,里面都是过滤的路径
    return registrationBean;
}

三、 Listener的注册

1. 创建一个类实现监听器,以ServletContextListener为例

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听器开始运行了");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听器开始销毁了");
    }

}

2. 将监听器注册到spring容器中

import com.university.subject.jsp_component.MyListener;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyWebConfig {
    @Bean
    public ServletListenerRegistrationBean myListener(){
        ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
        return registrationBean;
    }
}

//这个监听器是监听上下文的初始化,服务启动和关闭就会触发这个监听器
2019-07-24 23:37:37.867  INFO 1412 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-07-24 23:37:37.977  INFO 1412 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-07-24 23:37:37.977  INFO 1412 --- [  restartedMain] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2400 ms
监听器开始运行了
2019-07-24 23:37:38.827  INFO 1412 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'

3. 支持的监听器类型

    static {
        Set<Class<?>> types = new HashSet();
        types.add(ServletContextAttributeListener.class);
        types.add(ServletRequestListener.class);
        types.add(ServletRequestAttributeListener.class);
        types.add(HttpSessionAttributeListener.class);
        types.add(HttpSessionListener.class);
        types.add(ServletContextListener.class);
        SUPPORTED_TYPES = Collections.unmodifiableSet(types);
    }
    
监听器类型功能
ServletContextAttributeListener监听spring上下文的属性增加和减少
ServletRequestListener监听ServletRequest请求
ServletRequestAttributeListener监听ServletRequest请求属性值的变化
HttpSessionAttributeListener监听HttpSession的属性
HttpSessionListener监听HttpSession
ServletContextListener监听spring的上下文的创建和销毁

HttpSessionAttributeListener | 监听HttpSession的属性
HttpSessionListener | 监听HttpSession
ServletContextListener | 监听spring的上下文的创建和销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值