这一节介绍一下在spring-boot中怎么使用servlet,过滤器,监听器,拦截器。使用的方法有很几种,这里仅介绍我学会的一两种方法。
目录结构:
一、servlet
采用注解的方式配置servlet,首先在入口类ServletApplication中添加注解@ServletComponentScan
这样才会去扫描servlet的注解。
其次创建MyServlet类,添加注解@WebServlet
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(name = "myServlet", urlPatterns = "/servlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("test Servlet");
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Hello World!");
response.flushBuffer();
}
}
二、过滤器
首先同样需要在入口程序中加入配置@ServletComponentScan
其次创建过滤器类MyFilter ,@WebFilter
中urlPatterns 参数的含义是匹配所有路径。
package com.example.sprintboot.servlet.util.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init Myfilter");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("do Myfilter ");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("destroy Myfilter ");
}
}
如果需要配置多个过滤器时,采用注解配置的过滤器无法设置过滤器的优先级,想要配置过滤器的顺序需要采用另一种配置方式。
首先MyFilter 类中去掉注解
其次在入口类中添加接口ServletContextInitializer ,重写方法onStartup,便可以配置过滤器,以添加的先后顺序为过滤器的顺序。
package com.example.sprintboot.servlet;
import com.example.sprintboot.servlet.util.filter.MyFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import javax.servlet.DispatcherType;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.util.EnumSet;
@SpringBootApplication
public class ServletApplication implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addFilter("myFilter", new MyFilter())
.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
}
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
同样可以使用这种方法配置servlet及监听器(去掉MyServlet与MyListener的注解)
servletContext.addServlet("myServlet", new MyServlet()).addMapping("/roncoo");
servletContext.addListener(new MyListener());
三、监听器
首先同样需要在入口程序中加入配置@ServletComponentScan
其次创建过滤器类MyFilter ,添加注解@WebListener
package com.example.sprintboot.servlet.util.listerner;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyListerner implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("init Listerner");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("init destroyListerner");
}
}
四、拦截器
拦截器与servlet无关,无需在入口程序中添加注解@ServletComponentScan
首先第一步创建拦截器类,MyInterceptor 继承接口HandlerInterceptor
package com.example.sprintboot.servlet.util.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("MyInterceptor1>>>>>>>在请求处理之前被调用调用");
return true;// 只有返回true才会继续向下执行,返回false取消当前请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}
第二步配置拦截器到服务中,添加@Configuration的作用是使得该配置类被扫描到,有多个拦截器时使用registry.addInterceptor()方法依次添加,添加顺序即为拦截器被调用的顺序。
package com.example.sprintboot.servlet.util.configuration;
import com.example.sprintboot.servlet.util.Interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("Configuration 配置成功");
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/web/**"); //对来自/web/** 这个链接来的请求进行拦截
}
}