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;
}
}
|