【零基础入门SpringBoot2】—— Web开发_3

article/2023/6/4 14:47:10

一、Web原生组件注入

如何向SpringBoot中注入Web的原生组件?


1、使用Servlet API

(1)Servlet原生组件

请添加图片描述

  • 创建一个Servlet类,让它继承原生的Servlet的实现类 HttpServlet ,使用WebServlet注解指定我们的请求,效果直接响应没有经过Spring的拦截器【@WebServlet 是servlet3.0 提供的注解】
  • 我们需要在主程序类中,使用@ServletComponentScan 指明我们原生的Servlet组件都放在哪里

请添加图片描述

package com.atguigu.admin.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;/*** @author Bonbons* @version 1.0*/
@WebServlet(urlPatterns = "/my")
public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("666");}
}

(2)Filter 拦截器

  • 与使用原生Servlet方式相同,包扫描不用重新设置,只需要配置我们的Filter类
    • 让其实现Filter接口,进而实现它的三个方法
    • 注意:单星是Servlet的写法,双星是Spring的写法

请添加图片描述

package com.atguigu.admin.servlet;import lombok.extern.slf4j.Slf4j;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;/*** @author Bonbons* @version 1.0*/
@Slf4j
@WebFilter(urlPatterns = {"/css/*", "/images/*"})
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("MyFilter初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("MyFilter工作");//myFilter要想放行,就要拿到Filter的链filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {log.info("MyFilter销毁");}
}

(3)Listener监听器

  • 创建MyServletContextListener类实现ServletContextListener接口
    • 实现它初始化和销毁方法

package com.atguigu.admin.servlet;import lombok.extern.slf4j.Slf4j;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;/*** @author Bonbons* @version 1.0*/
@WebListener
@Slf4j
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {log.info("MyServletContextListener 监听到项目初始化完成");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {log.info("MyServletContextListener 监听到项目销毁");}
}

2、使用RegistrationBean

  • 第二种方式,使用Spring底层给我们提供的三种RegistrationBean (Servlet、Filter、Listener)

  • 我们需要知道,这个是基于上面我们创建的三个文件 MyServlet、MyFilter、MyServletContextListener 【去掉其中的@WebServlet、@WebFilter、@WebServletContextListener】

  • 定义一个配置类,声明我们对应的三种Registration的Bean

package com.atguigu.admin.servlet;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;/*** @author Bonbons* @version 1.0*/
@Configuration
public class MyRegistConfig {@Beanpublic ServletRegistrationBean myServlet (){//创建Servlet对象MyServlet myServlet = new MyServlet();return new ServletRegistrationBean(myServlet, "/my", "/my02");}@Beanpublic FilterRegistrationBean myFilter(){MyFilter myFilter = new MyFilter();//我们myServlet作为urlMappings的参数,就是将其路径作为我们拦截器的路径//return new FilterRegistrationBean(myFilter, myServlet());//第二种方式,我们自己重新写请求路径FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);filterRegistrationBean.setUrlPatterns(Arrays.asList("/css/*", "/my"));return filterRegistrationBean;}@Beanpublic ServletListenerRegistrationBean myListener(){MyServletContextListener myServletContextListener = new MyServletContextListener();return new ServletListenerRegistrationBean(myServletContextListener);}
}

  • 两个小细节:
    • 单实例,没有将 @Configuration的 proxyBeanMethods 设置为 false 【调用一次创建一个Bean对象】
    • 为什么我们的Servlet没有被拦截器拦截?
      • 原生Servlet和springMvC的dispatcherServlet派发器的处理方式不一样 (url=“/”)
      • 原生Servlet没有走Spring的流程,不能被拦截器拦截
  • DispatcherServlet 如何注册进来的呢?
    • 容器中自动配置了 DispatcherServlet 属性绑定到WebMvcProperties,对应的配置文件配置项是 spring.mvc
    • 通过ServletRegistrationBean<DispatcherServlet>把DispatcherServlet配置进来
    • 默认映射路径是 / 路径
      • 当然我们可以在SpringBoot的配置文件中进行修改
        • spring.mvc.servlet.path=/mvc/

请添加图片描述

  • 当多个Servlet都能处理到同一层路径,精确优选原则

二、嵌入式Web容器

1、切换嵌入式 Servlet 容器

  • 默认支持的 webServlet
    • Tomcat、Jetty、Undertow
    • ServletWebServerApplicationContext 容器启动寻找 ServletWebServerFactory 并引导创建服务器
  • 如何切换服务器呢?

请添加图片描述

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>
  • 整个流程的原理:
    • SpringBoot应用启动发现当前是Web服务器,就会加载Web场景包,附带导入tomcat
    • web 应用会创建一个web版本的 ioc 容器(ServletWebServerApplicationContext)
    • ServletWebServerApplicationContext 启动的时候会寻找 web的服务器工厂(ServletWebServerFactory)【用于生产servlet的web服务器】
    • SpringBoot 底层默认有很多的WebServer工厂
      • TomcatServletWebServerFactory、JettyServletWebServerFactory、UndertowServletWebServerFactory
    • 底层直接会由一个自动配置类——ServletWebServerFactoryAutoConfiguration
    • ServletWebServerFactoryAutoConfiguration 导入了 ServletWebServerFactoryConfiguration(配置类)
    • ServletWebServerFactoryConfiguration 配置类,根据动态判断系统重到底导入了哪个web服务器的包【默认web-start导入tomcat包】,容器中就有了 TomcatServletWebServerFactory
    • TomcatServletWebServerFactory 创建出Tomcat服务器并启动,TomcatWebServer 的构造器初始化方法
      • initialize --- this.tomcat.start()
    • 内嵌服务器,就是手动把启动服务器的代码调用 【tomcat核心jar包存在】

2、定制Servlet容器

  • 实现 WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
    • 把配置文件的值和 ServletWebServerFactory 进行绑定
  • 修改配置文件 server.xxx
  • 直接自定义 ConfigurableServletWebServerFactory
  • xxxxxCustomizer:定制化器,可以改变xxxx的默认规则
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {@Overridepublic void customize(ConfigurableServletWebServerFactory server) {server.setPort(9000);}}

三、定制化原理

1、定制化的常见方式

  • 修改配置文件;
  • xxxxxCustomizer;
  • 编写自定义的配置类 xxxConfiguration;+ @Bean替换、增加容器中默认组件;视图解析器
  • Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件
    @Configuration
    public class AdminWebConfig implements WebMvcConfigurer
  • @EnableWebMvc + WebMvcConfigurer —— @Bean 可以全面接管SpringMVC,所有规则全部自己重新配置; 实现定制和扩展功能
  • 原理
    • 1、WebMvcAutoConfiguration 默认的SpringMVC的自动配置功能类。静态资源、欢迎页…
    • 2、一旦使用 @EnableWebMvc 、。会 @Import(DelegatingWebMvcConfiguration.class)
    • 3、DelegatingWebMvcConfiguration 的 作用,只保证SpringMVC最基本的使用
      • 把所有系统中的 WebMvcConfigurer 拿过来。所有功能的定制都是这些 WebMvcConfigurer 合起来一起生效
      • 自动配置了一些非常底层的组件。RequestMappingHandlerMapping、这些组件依赖的组件都是从容器中获取
      • public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport
    • 4、WebMvcAutoConfiguration 里面的配置要能生效 必须 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    • 5、@EnableWebMvc 导致了 WebMvcAutoCo

2、原理分析套路
场景starter - xxxxAutoConfiguration - 导入xxx组件 - 绑定xxxProperties – 绑定配置文件项

http://www.ngui.cc/article/show-1007717.html

相关文章

MobaXterm 链接Linux Ubuntu

MobaXterm 链接Linux Ubuntu 1.查看是否安装 openssh-server sudo apt-get install open-server2.开启ssh服务 sudo /etc/init.d/ssh start3.查看虚拟机的IP ifconfig5.打开MobaXterm 将ip输入即可 如果传输文件&#xff0c;选择SFTP&#xff0c;步骤和上面一样

c++加解密算法总结

不可逆加密 概述 单向加密&#xff0c;主要是对明文的保密和摘要提取。算法包括MD5、SHA、HMAC等。 特点 压缩性&#xff1a;任意长度的数据&#xff0c;单向加密后长度都是固定的&#xff1b;抗修改性&#xff1a;对原数据进行任何改动&#xff0c;哪怕只修改1个字节&…

JAVA Session会话 Thymeleaf - 视图模板技术配置步骤

JAVAWebSession会话会话跟踪技术session保存作用域Thymeleaf - 视图模板技术配置过程Session会话 HTTP是无状态的&#xff1a;服务器无法区分这两个请求是同一个客户端发过来的&#xff0c;还是不同的客户端发过来的 现实问题&#xff1a;第一次请求是添加商品到购物车&#x…

model.train()、model.eval()什么时候用

model.train() 在使用 pytorch 构建神经网络的时候&#xff0c;训练过程中会在程序上方添加一句model.train()&#xff0c;作用是 启用 batch normalization 和 dropout 。 如果模型中有BN层&#xff08;Batch Normalization&#xff09;和 Dropout &#xff0c;需要在训练时…

Mac M1/Intel 芯片 Nginx+PHP开发环境配置——初探(一)

最近因为新买Mac M系列芯片笔记本&#xff0c;一直也没搭建过PHP的开发环境&#xff0c;花了一点时间特意在本机做了一次环境搭建测试具体如下。开始之前&#xff0c;需要安装一些工具来完成配置&#xff0c;工具列表如下:XcodeVS CodeHomebrewOpenSSL & wgetMySQLPostgres…

Spring《二》bean的实例化与生命周期

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录一、bean实例化&#x1f34d;1.构造方法 ***2.静态工厂 *使用工厂创建对象实例化bean3.实例工厂 ***使用示例工厂创建对象实例工厂实例化beanFactoryBean二、生命周期&#x1f351;1.生命周期设置2.在main方法使…

Vector - CAPL - 实时时间on *

前面有简单的提到过on message的用法&#xff0c;但是对于整个on *家族来说&#xff0c;on message仅仅这是其中之一&#xff0c;为了能够的了解、学习这个家族的成员&#xff0c;因此做了专门的整理的&#xff0c;将囊括CALP用常用的所有的on *家族成员&#xff0c;并对其进行…

【JavaEE】Java设计模式-单例模式(饿汉式与懒汉式)

目录 1.设计模式是啥&#xff1f; 2.单例模式 2.1什么是单例模式 2.2饿汉模式 2.3懒汉模式 3.懒汉模式与饿汉模式的区别 1.设计模式是啥&#xff1f; 设计模式是前人经过总结&#xff0c;通过对不同应用场景应该运用何种方法解决问题的模式。我们可以将它看成NBA中的…

English Learning - L2-10 英音地道语音语调 鼻辅音 [m] [n] [ŋ] 舌边音 [l] [r] 2023.03.23 周四

English Learning - L2-10 英音地道语音语调 鼻辅音 [m] [n] [ŋ] 舌边音 [l] [r] 2023.03.23 周四课前准备活动和回顾鼻辅音鼻辅音 [m]鼻辅音 [n]鼻辅音 [ŋ]鼻辅音对比鼻辅音发音技巧对应单词对应的句子舌边音舌边音 [l]发音技巧对应单词[l] 和 [n] 的区分舌边音 [r]发音技巧…

基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机打铃 获取完整无水印论文报告说明&#xff08;含源码程序、电路原理图和仿真图&#xff09; 本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动&…