当前位置: 首页 > 后端技术 > Java

6、SpringBoot的Web原生组件注入(Servlet、Filter、Listener)

时间:2023-04-01 18:09:45 Java

1。使用ServletAPI注入Servlet:@ServletComponentScan(basePackages="com.atguigu.admin"):指定原生Servlet组件的放置位置@WebServlet(urlPatterns="/my"):作用:直接响应,不用Spring的拦截器?/*步骤:使用@WebServlet注解并设置匹配路径+@ServletComponentScan扫描Servlet组件继承HttpServlet类并重写方法*/@WebServlet(urlPatterns="/my")publicclassMyServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)抛出ServletException,IOException{resp.getWriter().write("666");}}@ServletComponentScan(basePackages="com.atguigu.admin")//扫描Servlet组件@SpringBootApplicationpublicclasspWebAdminAppot05{staticvoidmain(String[]args){SpringApplication.run(Boot05WebAdminApplication.class,args);}}注入Filter:@WebFilter(urlPatterns={"/css/*","/images/*"})/*step:使用@WebFilter注解并设置拦截路径实现Filter接口并重写方法*/@Slf4j@WebFilter(urlPatterns={"/css/*","/images/*"})publicclassMyFilterimplementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{log.info("MyFilter初始化完成。。。。。。。。");}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{log.info("MyFilter执行过滤。。。。。。。。");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublicvoiddestroy(){log.info("MyFilter销毁。。。。。。。。。");}}InjectListener:@WebListener/*Steps:使用@WebListener注解实现ServletContextListener接口和实现方法*/@Slf4j@WebListenerpublicclassMyListenerimplementsServletContextListener{//项目一运行就执行该方法@OverridepublicvoidcontextInitialized(ServletContextEventsce){log.info("MyListener监听项目初始化完成");}//该方法会在项目真正停止后执行(点击idea中的红色小方块按钮不起作用)@OverridepublicvoidcontextDestroyed(ServletContextEventsce){log.info("MyListener监听到项目已经终止");}}推荐使用这种方式:2.使用RegistrationBeanServletRegistrationBean,FilterRegistrationBean,ServletListenerRegistrationBean注释掉@WebServlet,@WebFilter,@WebListener@Slf4j//@WebServlet(urlPatterns="/my")请求";ri).write("666");}}@Slf4j//@WebFilter(urlPatterns={"/css/*","/images/*"})publicclassMyFilterimplementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{log.info("MyFilter初始化完成。。。。。。。”);}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{log.info("MyFilter执行过滤。。。。。。。。");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublicvoiddestroy(){log.info("MyFilter销毁。。。。。。。。。");}}@Slf4j//@WebListenerpublicclassMyListenerimplementsServletContextListener{@OverridepublicvoidcontextInitialized(ServletContextEventsce){log.info("MyListener监听项目初始化完成");}@OverridepublicvoidcontextDestroyed(ServletsContext)Event{log.info("MyListener听说项目已经终止");}}//将这个类标记为配置类,并保证每个@Bean方法被调用多少次返回的组件是单个的实例@Configuration(proxyBeanMethods=true)publicclassMyRegistConfig{@BeanpublicServletRegistrationBeanmyservlet(){MyServletmyServlet=newMyServlet();returnnewServletRegistrationBean(myServlet,"/my","/my2");}@BeanpublicFilterRegistrationBean()myFilterMyFiltermyFilter=newMyFilter();//第一种写法//Servlet拦截什么路径,我的Filter拦截什么路径//returnnewFilterRegistrationBean(myFilter,myservlet());/**第二种写法*可以设置拦截什么路径**/FilterRegistrationBe一个filterRegistrationBean=newFilterRegistrationBean(myFilter);filterRegistrationBean.setUrlPatterns(Arrays.asList("/my","/css/*"));返回过滤器注册Bean;}@BeanpublicServletListenerRegistrationBeanmyListener(){MyListenermyListener=new)MyListener(;returnnewServletListenerRegistrationBean(myListener);}执行顺序:执行Listener的contextInitialized容器初始化方法->执行Filter的init初始化方法->执行Filter的doFilter方法->执行Servlet的doGet或doPost方法->执行Filter的destroy方法->执行Listener的contextDestroyed销毁方法扩展:如何注册DispatchServlet?DispatcherServlet是自动配置在容器中的,并且该属性绑定到WebMvcProperties类;对应的配置文件配置项(prefixprefix)是spring.mvc通过ServletRegistrationBean配置进来的,默认映射为/路径。所以项目下的所有请求都来DispatchServlet处理。如果要改变DispatchServlet的拦截路径,它是和Servlet绑定的,所以我们需要修改spring.mvc.servlet.path=/mvc///,表示DispatchServlet的拦截路径以/mvc/开头。之前使用Tomcat进行原生Servlet开发时:当多个Servlet可以处理同层路径时,使用精准优化原则:A:/my/如果发送/my/请求,他会先来A处理B:/my/1如果发送/my/1请求,他会先来B处理总结:DispatchServlet是如何注册的?使用RegistrationBean来注册DispatchServlet及其映射/路径。写博客是为了记住自己容易忘记的事情,也是对自己工作的总结。