spring-boot中servlet,过滤器,定时器,监听器使用

       这一节介绍一下在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/** 这个链接来的请求进行拦截
    }
}

猜你喜欢

转载自blog.csdn.net/u014296316/article/details/79520223