SpringBoot之集成Servlet、Filter、Listener
Servlet
方式一:@WebServlet
首先创建一个MyServlet其继承了HttpServlet类并标记了一个@WebServlet(urlPatterns="/hello")注解,用来使当前类能够被SpringBoot扫描到,其urlPatterns="/servlet/hello"指明了该servlet将接收/servlet/hello的请求。
package com.baiyang.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/servlet/hello")
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello MyServlet!");
PrintWriter writer = resp.getWriter();
writer.println("hello servlet!");
}
}
然后是SpringBoot启动类:
package com.baiyang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan(basePackages = {"com.baiyang"})
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}
}
启动类上标记了@ServletComponentScan(basePackages={"com.baiyang"}),其指明了开启Servlet组件扫描并且指明了扫描路径。 直接启动,即可通过访问localhost:8080/servlet/hello来请求到MyServlet。
方式二: ServletRegistrationBean
如果不使用@WebServlet注解的方式,那么还可以通过注入ServletRegistrationBean的方式来配置Servlet。 和方式一一样准备MyServlet类,和方式一的唯一区别就只是没有标注@WebServlet注解:
package com.baiyang.servlet;
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 service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello MyServlet!");
PrintWriter writer = resp.getWriter();
writer.println("hello servlet!");
}
}
然后在启动类中通过@Bean加入ServletRegistrationBean的注入:
package com.baiyang;
import com.baiyang.servlet.MyServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}
@Bean
public ServletRegistrationBean<MyServlet> getServletBean(){
ServletRegistrationBean<MyServlet> servletServletRegistrationBean = new ServletRegistrationBean<>(new MyServlet(),"/servlet/hello");
servletServletRegistrationBean.setLoadOnStartup(1);
return servletServletRegistrationBean;
}
}
上面的getServletBean()方法,注入了ServletRegistrationBean<MyServlet>,同时指明了映射url为/servlet/hello。
Filter
方式一:@WebFilter
首先创建一个MyFilter其继承了HttpFilter类并标记了一个@WebFilter(urlPatterns = "/*")注解,用来使当前类能够被SpringBoot扫描到,其urlPatterns="/*"指明了当前Filter将过滤所有请求。
package com.baiyang.filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class MyFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("hello,MyFilter!");
chain.doFilter(request, response);
}
}
然后是SpringBoot启动类:
package com.baiyang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan(basePackages = {"com.baiyang"})
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}
}
启动类上标记了@ServletComponentScan(basePackages={"com.baiyang"}),其指明了开启Servlet组件扫描并且指明了扫描路径。 直接启动,随后所有请求都将被该过滤器过滤。
方式二:FilterRegistrationBean
如果不使用@WebFilter注解的方式,那么还可以通过注入FilterRegistrationBean的方式来配置Filter。 和方式一一样准备MyFilter类,和方式一的唯一区别就只是没有标注@WebFilter注解:
package com.baiyang.filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("hello,MyFilter!");
chain.doFilter(request, response);
}
}
然后在启动类中通过@Bean加入FilterRegistrationBean的注入:
package com.baiyang;
import com.baiyang.servlet.MyServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}
@Bean
public FilterRegistrationBean<MyFilter> getFilterBean(){
FilterRegistrationBean<MyFilter> servletServletRegistrationBean = new FilterRegistrationBean<>(new MyFilter());
ArrayList<String> urls = new ArrayList<>();
urls.add("/*");
servletServletRegistrationBean.setUrlPatterns(urls);
servletServletRegistrationBean.setOrder(1);
return servletServletRegistrationBean;
}
}
上面的getFilterBean()方法,注入了FilterRegistrationBean<MyFilter>,同时指明了映射路径/*,其将过滤所有请求。
Listener
方式一:@WebListener
首先创建一个MyListener其实现了ServletContextListener类,指明其是一个servlet容器监听器,当容器启动时将执行contextInitialized()方法,当容器关闭时将执行contextDestroyed()方法;并标记了一个@WebListener注解,用来使当前类能够被SpringBoot扫描到。
package com.baiyang.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContextListener#contextInitialized---");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListener#contextDestroyed---");
}
}
然后是SpringBoot启动类:
package com.baiyang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan(basePackages = {"com.baiyang"})
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}
}
启动类上标记了@ServletComponentScan(basePackages={"com.baiyang"}),其指明了开启Servlet组件扫描并且指明了扫描路径。 容器在启动的过程中将执行该容器监听器。
方式二:ServletListenerRegistrationBean
如果不使用@WebListener注解的方式,那么还可以通过注入ServletListenerRegistrationBean的方式来配置Listener。 和方式一一样准备MyListener类,和方式一的唯一区别就只是没有标注@WebListener注解:
package com.baiyang.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContextListener#contextInitialized---");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListener#contextDestroyed---");
}
}
然后在启动类中通过@Bean加入ServletListenerRegistrationBean的注入:
package com.baiyang;
import com.baiyang.listener.MyListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}
@Bean
public ServletListenerRegistrationBean<MyListener> getListenerBean() {
ServletListenerRegistrationBean<MyListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>(new MyListener());
listenerRegistrationBean.setEnabled(true);
listenerRegistrationBean.setOrder(1);
return listenerRegistrationBean;
}
}
|