spring boot整合servlet、filter、Listener等组件方式

filter是过滤的意思:在web开发中,是请求会先到过滤器,然后由过滤器再转发到具体的借口上去,此时过滤器就可以对捕捉到的请求作出适当的逻辑了。

一般如果用第三方的filter但是此filter又不是专门服务于spring开发环境,此时就不会被扫描到,因此需要加个@Configuration注解,有了此注解spring会在启动之初就去加载该filter这和以前在spring.xml中配置创建类是一样的效果,urls是指定要过滤那些请求,没有指定的则直接去访问不需要过滤器。

创建一个maven项目,然后此项目继承一个父项目:org.springframework.boot

1.创建一个maven项目:

2.点击next后配置父项目及版本号

3.点击finish后就可查看pom.xml文件中已经有父级项目了。

好了,创建项目演示已经做完,现在粘贴整个各个组件的代码:说明在注释中

1.启动类:

package com.mr.li;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
/**
 * 启动类:
 * 1.@springBootApplication:表示此类是spring boot的启动类.
 * 2.@ServletComponentScan:此注解的意思是在spring boot启动时,主动去扫描所有的Servlet类,filter类....
 * @author Administrator
 *
 */
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

import com.mr.li.filter.MyFilter2;
import com.mr.li.listener.MyListener2;
import com.mr.li.servlet.MyServlet;
@SpringBootApplication
@ServletComponentScan
public class Application {

    public static void main(String[] args) {
        //此方法是spring boot启动时必须调用的一个静态方法,第一个参数是启动类的模板,第二个参数就是main方法中的参数。
        SpringApplication.run(Application.class, args);
    }

    //方法名叫什么无所谓:在启动类中创建一个新的filter
    @Bean
    public ServletRegistrationBean getServletRegistrationBean() {
        ServletRegistrationBean bean = new ServletRegistrationBean(new MyServlet(), "/hhhh");
        return bean;
    }
    
    //过滤器方式二:在启动类中创建一个新的filter对象,加载到spring容器中,然后但凡以他配置的过滤的后缀名结束的请求都会过滤掉,
    @Bean
    public FilterRegistrationBean getFilterRegistrationBean() {
        FilterRegistrationBean bean = new FilterRegistrationBean(new MyFilter2());
        bean.addUrlPatterns("/hhhh","/my");
        return bean;
    }
    
    //注册Listener监听器方式二:启动类中方法注册Listener类。
    @Bean
    public ServletListenerRegistrationBean<MyListener2> getListenerRegistrationBean(){
        ServletListenerRegistrationBean<MyListener2> bean = new ServletListenerRegistrationBean<MyListener2>(new MyListener2());
        return bean;
    }
}

2.整合servlet

package com.mr.li.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * spring boot整合Servlet:
  * 在spring boot中演示:正常的web项目下的Servlet编写方式。现在在spring boot中编写是当前这种方式的,简化了非常多。
  * 其中
 * 1.@WebServlet注解中my和/my相当于以前web.xml中配置的servlet标签和servlet-mapping标签的所有内容。
         相当于web.xml中的:
        <servlet>
            <servlet-name>my</servlet-name>
            <servlet-class>com.mr.li.servlet.MyServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>my</servlet-name>
            <url-pattern>/my</url-pattern>
        </servlet-mapping>
 */
@WebServlet(name = "my", urlPatterns = "/my")
public class MyServlet extends HttpServlet{

    private static final long serialVersionUID = 8908779617494799833L;
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("访问到MyServlet");
//        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().write("你好,世界");
    }

}

3.整合filter方式一:

package com.mr.li.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/**
 * spring boot整合filter方式一:
 * 编写Filter,是Servlet的拦截器,指定某个请求到达此请求(一般是servlet)之前就将一些条件过滤掉
 * 相当于web.xml中的:
 * <filter>
 *      <filter-name>MyFilter</filter-name>
 *      <filter-class>com.mr.li.filter.MyFilter</filter-class>
 * </filter>
 * <filter-mapping>
 *      <filter-name>MyFilter</filter-name>
 *      <url-parrern>/my</url-parrern>
 * </filter-mapping>
 *  本filter的名字叫:MyFilter
 *  拦截:/my 结尾的请求
 * @author Administrator
 *
 */
@WebFilter(filterName = "MyFilter", urlPatterns = {"/my"})
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter初始化了");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("进入:MyFilter");
        chain.doFilter(request, response);//放行
        System.out.println("离开:MyFilter");
    }

    @Override
    public void destroy() {
        System.out.println("filter销毁了");
    }

}

4.整合filter方式2:方法注册,注册方法在启动类中,这里只提供对象

package com.mr.li.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * spring boot整合filter方式二:在启动类中调用
 */
public class MyFilter2 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter222初始化了");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("进入:MyFilter222");
        chain.doFilter(request, response);//放行
        System.out.println("离开:MyFilter222");
    }

    @Override
    public void destroy() {
        System.out.println("filter销毁了");
    }

}

5.整合Listener方式一:

package com.mr.li.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * spring boot整合Listener监听器方式一:配置监听器,主要看针对哪个去配置监听器,这里配置的监听器主要是针对Servlet配置的监听器。
 * 此配置相当于web.xml中:
 *<listener-calss>com.mr.li.listener.MyListener</listener-calss>
 */
@WebListener
public class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Listener监听器开始工作了。。。init。。。。。");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    
    }

}

6.整合Listener方式二:整合方法在启动类中,这里只提供对象

package com.mr.li.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * spring boot整合Listener监听器方式二:通过在启动类中的方法注册Listener监听器。
 * 此配置相当于web.xml中:
 *<listener-calss>com.mr.li.listener.MyListener</listener-calss>
 */
public class MyListener2 implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Listener2222监听器开始工作了。。。init。。。。。");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    
    }

}

7.controller

package com.mr.li.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
 * 单独演示Controller
 *
 */
@Controller
public class HelloWorld {

    @RequestMapping("/show")
    @ResponseBody
    public Map<String, Object> show(){
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("hello", "world");
        return map;
    }
}

8.pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <!-- spring boot项目需要继承父项目,现为2.1.4版本的父项目 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
  </parent>
  <groupId>com.mr.li</groupId>
  <artifactId>springboot_001</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <!-- 修改jdk版本 -->
  <properties>
      <java.version>1.7</java.version>
  </properties>
  <!-- 添加启动器:spring boot启动器中包含各个项目所需要的jar包,总共有44个启动器,例如web,jdbc,redis...想要使用哪个技术
  就要添加哪个启动器。启动器是各个技术的组件,想用哪个技术就将哪个技术的启动器加入进来,这样此服务器就会拥有哪个技术的组件 -->
  <dependencies>
       <dependency>
           <!-- web启动器:此启动器中包含:tomcat + spring mvc的所有jar包,所以如果做web项目就必须有此启动器 -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
  </dependencies>
</project>

具体的项目结构如下:

*如果jdk不对就项目右键 -> maven -> updata Project... 一下

*访问的url:http: //localhost:8080/my  这里是访问的servlet , controller一样可以访问,将my换为show即可

原文地址:https://www.cnblogs.com/li-yan-long/p/10772600.html