目录

一、使用注解注册原生web组件

1.使用原生servlet

2.使用原生filter

3.使用原生listener

二、使用RegistrationBean注册原生web组件

三、发现一个问题,使用原生的servlet,并不会触发spring的拦截器。

四、DispatcherServlet的自动配置

1.springmvc处理逻辑参考博文

2.spring主要的servlet-DispatcherServlet的自动配置


一、使用注解注册原生web组件

1.使用原生servlet

(1)启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;// 扫描servlet,指定原生Servlet组件都放在那里
@ServletComponentScan("com.cxf.servlet")
@SpringBootApplication
public class WebApplicationCxf {public static void main(String[] args) {SpringApplication.run(WebApplicationCxf.class, args);}
}

(2)自定义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;// 使用原生servlet API,会直接响应,不会经过spring的拦截器等
@WebServlet(urlPatterns = "/my")
public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("66666");}
}

2.使用原生filter

import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@Slf4j
@WebFilter(urlPatterns={"/my","/images/*"}) //拦截的路径
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("MyFilter初始化完成");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {log.info("MyFilter工作");chain.doFilter(request,response);}@Overridepublic void destroy() {log.info("MyFilter销毁");}
}

3.使用原生listener

import lombok.extern.slf4j.Slf4j;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;// 监听context初始化
@Slf4j
@WebListener
public class MySwervletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {log.info("MySwervletContextListener监听到项目初始化完成");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {log.info("MySwervletContextListener监听到项目销毁");}
}

二、使用RegistrationBean注册原生web组件

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;// (proxyBeanMethods = true):保证依赖的组件始终是单实例的,默认就是true
@Configuration(proxyBeanMethods = true)
public class MyRegistConfig {// 注册servlet@Beanpublic ServletRegistrationBean myServlet(){MyServlet myServlet = new MyServlet();// servlet + url映射return new ServletRegistrationBean(myServlet,"/my","/my02");}@Beanpublic FilterRegistrationBean myFilter(){MyFilter myFilter = new MyFilter();
//        return new FilterRegistrationBean(myFilter,myServlet());FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);filterRegistrationBean.setUrlPatterns(Arrays.asList("/my","/css/*")); // 可以拦截的路径return filterRegistrationBean;}@Beanpublic ServletListenerRegistrationBean myListener(){MySwervletContextListener mySwervletContextListener = new MySwervletContextListener();return new ServletListenerRegistrationBean(mySwervletContextListener);}
}

三、发现一个问题,使用原生的servlet,并不会触发spring的拦截器。

这是为什么呢?

原因:spring默认是注册一个DispatcherServlet,而我们再注册一个原生的servlet,这样容器中就会有两个servlet,而DispatcherServlet匹配的根路径是 / ,原生的servlet匹配的路径是/my,根据最优匹配,请求/my的时候会走原生的servlet,不会走spring的那一套,所以不会触发spring的拦截器,而spring的请求也不会触发原生的拦截器。

四、DispatcherServlet的自动配置

1.springmvc处理逻辑参考博文

springBoot-springMVC请求处理原理_私人博客,有需要请联系17854238061(vx同号)-CSDN博客

2.spring主要的servlet-DispatcherServlet的自动配置

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(DispatcherServlet.class)
@AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class)
public class DispatcherServletAutoConfiguration {/** The bean name for a DispatcherServlet that will be mapped to the root URL "/"*/public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME = "dispatcherServlet";/** The bean name for a ServletRegistrationBean for the DispatcherServlet "/"*/public static final String DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME = "dispatcherServletRegistration";@Configuration(proxyBeanMethods = false)@Conditional(DefaultDispatcherServletCondition.class)@ConditionalOnClass(ServletRegistration.class)@EnableConfigurationProperties(WebMvcProperties.class)protected static class DispatcherServletConfiguration {// 注册DispatcherServlet ,id就是dispatcherServlet。属性绑定到 WebMvcProperties;对应的配置文件配置项是 spring.mvc@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) {DispatcherServlet dispatcherServlet = new DispatcherServlet();dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails());return dispatcherServlet;}// 注册文件上传解析器@Bean@ConditionalOnBean(MultipartResolver.class)@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)public MultipartResolver multipartResolver(MultipartResolver resolver) {// Detect if the user has created a MultipartResolver but named it incorrectlyreturn resolver;}}@Configuration(proxyBeanMethods = false)@Conditional(DispatcherServletRegistrationCondition.class)@ConditionalOnClass(ServletRegistration.class)@EnableConfigurationProperties(WebMvcProperties.class)@Import(DispatcherServletConfiguration.class)protected static class DispatcherServletRegistrationConfiguration {// 通过 ServletRegistrationBean<DispatcherServlet> 把 DispatcherServlet 配置进来@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)@ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet,WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) {DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,webMvcProperties.getServlet().getPath()); // 映射的是 / 路径registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());multipartConfig.ifAvailable(registration::setMultipartConfig);return registration;}}……
}

springboot使用原生servlet、filter、listener相关推荐

  1. servlet/filter/listener/interceptor区别与联系

    2019独角兽企业重金招聘Python工程师标准>>> servlet/filter/listener/interceptor区别与联系 博客分类: java 由于最近两个月工作比较 ...

  2. JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference 转载于:https://www.cnblogs.com/Jeremy2001 ...

  3. servlet,filter,listener区别

    时间的朋友 随笔 - 2314, 文章 - 3, 评论 - 101, 引用 - 0 servlet/filter/listener/interceptor区别与联系 一.概念: 1.servlet:s ...

  4. Spring Boot注册Servlet三大组件(Servlet, Filter, Listener)

    Spring Boot默认使用的Tomcat的Servlet容器,这个容器我们可以自己替换,比如替换成支持JSP的Servlet容器,这个容器已经帮我们注册好了一个Servlet(Dispatcher ...

  5. servlet/filter/listener/interceptor区别与联系(转)

    由于最近两个月工作比较清闲,个人也比较"上进",利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时候,发现为什么struts1要用servle ...

  6. JAVA基础(16) Servlet/Filter/Listener/Interceptor区别与联系

    一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Serv ...

  7. Spring Boot整合Servlet,Filter,Listener,访问静态资源

    目录 Spring Boot整合Servlet(两种方式) 第一种方式(通过注解扫描方式完成Servlet组件的注册): 第二种方式(通过方法完成Servlet组件的注册) Springboot整合F ...

  8. SpringBoot 配置嵌入式Servlet容器(tomcat,jetty,undertow)

    SpringBoot 默认打包方式为jar包,且可以自启动,就是因为它内嵌了Servlet容器. SpringBoot 默认使用嵌入式Servlet容器,SpringBoot 2.2.5 默认是 To ...

  9. SpringBoot Web原生组件注入(Servlet、Filter、Listener)

    一.使用原生Servlet API(推荐) @Slf4j @WebFilter(urlPatterns={"/css/*","/images/*"}) //my ...

最新文章

  1. rhel6多台主机的HA集群,并实现增加仲裁盘和共享存储
  2. java转成图形界面_【转】java图形界面设计(AWT)
  3. 如何实现模糊查询LIKE
  4. angular 注入器配置_Angular依赖注入介绍
  5. Harris角点检测原理详解(转载)
  6. cpu线程测试软件,CPU多线程测试:wPrime/国际象棋
  7. cad填充图案乱理石_CAD图案填充应该这么操作!简单又高效!!!1分钟就能学会...
  8. 牛客小白月赛2 G 文 【模拟】
  9. 吴恩达神经网络和深度学习-学习笔记-7-正则化regularization方法
  10. 解决:AttributeError: ‘str‘ object has no attribute ‘decode‘
  11. 约瑟夫 java_约瑟夫问题 java 实现详解
  12. Android开发实现选择城市界面,可根据拼音、首字母进行搜索
  13. linux at91看门狗驱动设置
  14. 【Vscode - Bug】-- 过程试图写入的管道不存在
  15. laravel 使用队列进行微信模板消息的群发
  16. 94.(leaflet之家)leaflet态势标绘-进攻方向绘制(燕尾)
  17. 文秘类计算机,文秘类包括哪些专业
  18. 沈询介绍-阿里云DRDS
  19. 最新互联网地图资质办理-2021测绘资质新规
  20. mqtt断开自动重连

热门文章

  1. J.U.C系列(二)CyclicBarrier的使用
  2. springBoot搭建activiti工作流
  3. Optional 详解 Java
  4. mysql数据库技术方案,MySql数据库优化方案
  5. 电脑的基础知识_电脑键盘功能基础知识
  6. 一年级大括号问题专项训练_一年级小学生自信满满地交了试卷,以为会考满分,结果很打脸...
  7. php数组去重的函数,php数组去重的函数代码
  8. node和java性能_服务端I/O性能大比拼:Node、PHP、Java和Go(二)
  9. Java用map实现沁园春_QQ飞车:小钰挑战沁园春影子记录,成为了这张地图的赛道之王!...
  10. linux反调试代码,linux反调试方法