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 类轻松实现。