springboot 配置 servlet 三大组件(Servlet、Filter、Listener)

Servlet、Filter、Listener 是 JavaEE Web 服务规定的服务器动态组件,由开发者编写,由 Web 容器创建,并保证单例以及线程安全性,其中加载顺序为 Linstener —> Fliter —> Servlet 。
在之前的项目开发中,我们把这些组件都注册在 web.xml 配置文件中。而在 springboot 项目中,它提供了相应的对象让我们更方便地注册这些组件。

Servlet

Servlet 是用来处理客户端请求的动态资源,也就是当我们在浏览器中键入一个地址回车跳转后,请求就会被发送到对应的 Servlet 上进行处理。

定义一个 servlet

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyDefineServlet extends HttpServlet {
    
    

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException,IOException{
    
    
		
		resp.getWriter().write("MyDefineServlet=========");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException,IOException{
    
    
		super.doGet(req, resp);
	}
}

注册到容器中

import java.util.Arrays;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.xiao.component.MyDefineFilter;
import com.xiao.component.MyDefineListener;
import com.xiao.component.MyDefineServlet;

@Configuration
public class ServerConfig {
    
    

	// 注册三大组件
	@Bean
	public ServletRegistrationBean<MyDefineServlet> myservlet() {
    
    
		ServletRegistrationBean<MyDefineServlet> servletRegistrationBean = 
				new ServletRegistrationBean<MyDefineServlet>(new MyDefineServlet(), "/hello");
		return servletRegistrationBean;
	}
	
	@Bean
	public FilterRegistrationBean<MyDefineFilter> myFilter(){
    
    
		FilterRegistrationBean<MyDefineFilter> filterRegistrationBean = 
				new FilterRegistrationBean<MyDefineFilter>();
		filterRegistrationBean.setFilter(new MyDefineFilter());
		filterRegistrationBean.setUrlPatterns(Arrays.asList("/success","/hello"));
		return filterRegistrationBean;
	}
	
	@Bean
	public ServletListenerRegistrationBean<MyDefineListener> myListener(){
    
    
		ServletListenerRegistrationBean<MyDefineListener> listenerRegistrationBean = 
				new ServletListenerRegistrationBean<MyDefineListener>(new MyDefineListener());
		return listenerRegistrationBean;
	}

}

Filter

Filter 与 Servlet 在很多的方面极其相似, 但是Servlet主要负责处理请求,而 Filter 主要负责拦截请求,和放行。Filter 实际上是一个接口,定义了一套规则,等待具体的类来实现该接口,而具体的拦截操作还需要 web 容器来实现。

定义一个 Filter

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyDefineFilter implements Filter {
    
    

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
    
    
		System.out.println("MyDefineFilter............");
		chain.doFilter(req, resp);
	}

}

Filter 的注册与 servlet 的注册类似,示例代码见 Servlet 的注册

Listener

Listener 是监听器,在 JavaWeb 的 Listener 可以监听 Application、Session、Request 对象,当这些对象发生变化就会调用对应的监听方法,本质是方法回调。

定义一个 Listener

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

public class MyDefineListener implements ServletContextListener {
    
    

	@Override
	public void contextInitialized(ServletContextEvent sce) {
    
    
		System.out.println("contextInitialized..........");
	}
	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
    
    
		System.out.println("contextDestroyed..........");
	}
}

Listener 的注册与 servlet 的注册类似,示例代码见 Servlet 的注册

启动项目可以看到监听已经触发
在这里插入图片描述输入 /hello 请求,可以发现另外两个组件也生效了。
在这里插入图片描述
控制台打印
在这里插入图片描述

写好的组件可以很方便地注册到容器中。springboot 初衷就是减少开发中繁杂的配置,现在也一直是这么做的,绝大部分配置都可以通过 java 类轻松实现。

猜你喜欢

转载自blog.csdn.net/Alias_fa/article/details/89784922