您的位置:首页 > 编程语言 > Java开发

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

2018-03-11 21:09 856 查看
这一节介绍一下在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
b8c6
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/** 这个链接来的请求进行拦截
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息