当前位置: 首页 > 编程日记 > 正文

【spring boot2】第8篇:spring boot 中的 servlet 容器及如何使用war包部署

嵌入式 servlet 容器

在 spring boot 之前的web开发,我们都是把我们的应用部署到 Tomcat 等servelt容器,这些容器一般都会在我们的应用服务器上安装好环境,但是 spring boot 中并不需要外部应用服务器安装这些servlet容器,spring boot自带了嵌入式的servlet容器。

如何修改和定制嵌入式servlet容器

  • 在application.yaml文件中配置修改
#修改服务端口号
server.port=8081
#配置统一请求路径
server.context‐path=/crud#配置tomcat相关
server.tomcat.uri‐encoding=UTF‐8

这些配置相关的属性都定义在org.springframework.boot.autoconfigure.web.ServerProperties类中

  • 编写一个嵌入式的servlet容器的定制器来修改相关的配置
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {@Overridepublic void customize(ConfigurableServletWebServerFactory server) {server.setPort(9000);}
}
  • 直接定制具体的servlet容器配置,比如 tomcat 容器
@Configuration
public class ApplicationConfig implements WebMvcConfigurer {@Beanpublic ConfigurableServletWebServerFactory configurableServletWebServerFactory() {TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();factory.setPort(8585);return factory;}
}

注册 Servlet、Filter、Listener

spring boot默认是以 jar 包的方式启动嵌入式的 servlet 容器来启动web应用,应用中并没有 web.xml 文件,我们注册 servlet, filter, 和 listener 三大组件可以使用以下方式

  • 利用ServletRegistrationBean注册 servlet

    • 定义自己的 servlet
    public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.getWriter().print("servlet doGet");}
    }
    • 给容器中注册自己的 servlet
    @Configuration
    public class ApplicationConfig implements WebMvcConfigurer {@Beanpublic ServletRegistrationBean myServlet() {ServletRegistrationBean servletRegistrationBean =new ServletRegistrationBean(new MyServlet(), "/hello/servlet");return servletRegistrationBean;}
    }
  • 利用FilterRegistrationBean注册 filter

    • 定义 filter`
    public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("do myFilter");chain.doFilter(request, response);}
    }
    • 容器中注册 filter
    @Configuration
    public class ApplicationConfig implements WebMvcConfigurer {@Beanpublic FilterRegistrationBean myFilter() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();//注册自己的 filterfilterRegistrationBean.setFilter(new MyFilter());//注册拦截路径filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello", "/hello/servlet"));return filterRegistrationBean;}
    }

    访问 "/hello", "/hello/servlet"请求时拦截器就会起作用。

  • 利用ServletListenerRegistrationBean注册 listener

    • 定义一个listener
    public class MyListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("contextInitialized ... web应用启动");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("contextDestroyed ... web应用销毁");}
    }
    • 容器中注册listener
    
    @Configuration
    public class ApplicationConfig implements WebMvcConfigurer {@Beanpublic ServletListenerRegistrationBean myListener() {ServletListenerRegistrationBean<MyListener> listenerRegistrationBean =new ServletListenerRegistrationBean(new MyListener());return listenerRegistrationBean;}
    }

切换其他 servlet 容器

spring boot 中默认使用的是 tomcat 容器,那么如何切换使用其他容器呢,比如 jetty。那么如何切换成其他的呢?只需要修改 pom.xml 文件

<!‐‐ 引入web模块 ‐‐> 
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐web</artifactId><exclusions><exclusion><artifactId>spring‐boot‐starter‐tomcat</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><!‐‐引入其他的servlet容器‐‐> 
<dependency><artifactId>spring‐boot‐starter‐jetty</artifactId><groupId>org.springframework.boot</groupId></dependency>

使用外部 servlet 容器

部署项目的服务器安装 servlet 容器,比如 tomcat、jetty 容器,然后项目打成 war 包的形式进行部署
如何创建一个 war 包启动的 spring boot 项目呢?

  1. 创建一个war打包形式的web项目,其目录结构如下

图片描述

  1. 修改 pom.xml 文件

    • 修改打包方式

      pom.xml 文件中的打包方式设置成 war 即可,            ```<packaging>war</packaging>```
    • 修改嵌入的 servlet 容器

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>
      </dependency>
  2. 编写一个类继承 SpringBootServletInitializer
public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(SpringBootWarApplication.class);}
}

使用外部 servlet 容器原理

jar包和war的启动过程

  1. jar包: 执行spring boot 主类的main方法,启动ioc容器,然后创建嵌入式的servlet容器
  2. war包: 启动tomcat服务器,服务器启动spring boot应用,通过SpringBootServletInitializer实现,启动ioc容器

spring boot使用外部servlet过程

servlet3.0标准中规定

  • web应用启动会创建当前web应用里面每一个jar包里面ServletContainerInitializer类型的实例
  • ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer的文件,文件内容就是ServletContainerInitializer实现类的全类名
  • 使用@HandlesTypes注解在应用启动的时候加载我们需要的类

spring boot使用war启动原理

  • 重写SpringBootServletInitializerconfigure(SpringApplicationBuilder application)方法,调用SpringApplicationBuildersources(Class<?>... sources)方法
  • 启动原理

    • Servlet3.0标准ServletContainerInitializer扫描所有jar包中META- INF/services/javax.servlet.ServletContainerInitializer文件指定的类并加载
    • 加载spring web包下的org.springframework.web.SpringServletContainerInitializer
    • 扫描@HandleType(WebApplicationInitializer)`,即扫描WebApplicationInitializer的所有实现类
    • 加载SpringBootServletInitializer并运行onStartup方法
    • 加载@SpringBootApplication主类,启动容器

相关文章:

让织梦内容页arclist标签的当前文章标题加亮显示

很多人在用织梦做站的时候&#xff0c;会用到在当前栏目页面&#xff0c;给当前栏目标题使用指定样式如标题加亮&#xff0c;或者放个背景图。这是一个很常用和实用的功能&#xff0c;比如在导航页面&#xff0c;标识当前在浏览哪个栏目。如下图&#xff1a; 但是有些时候&…

RHEL6入门系列之九,常用命令2

今天还是继续来学习Linux的基本命令。4、touch命令——建立空文件touch命令用于建立空文件。[rootlocalhost ~]# mkdir /root/test ‘创建目录/root/test[rootlocalhost ~]# touch /root/test/test1.txt ‘在目录/root/test中创建空文件test1.txt[rootlocalhos…

为什么华为200万招聘AI博士,马斯克却推出脑机接口对抗AI?

作者 | 伍杏玲来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;7 月&#xff0c;华为一则薪资通知刷爆朋友圈&#xff1a;华为给8位博士应届生给予 89.6 万至 201 万的年薪。其中薪资最高的两位博士均研究人工智能相关专业。7 月还有一件大事&#xff1a;马斯克发布…

Artistic Style在windows下的使用(C/C++)

ArtisticStyle是一个开源的源代码格式化工具。主页地址为&#xff1a;http://astyle.sourceforge.net/&#xff0c;它可以应用在C、C、Objective-C、C#、Java等程序语言中。http://astyle.sourceforge.net/astyle.html中为对使用它的详细介绍。从http://sourceforge.net/projec…

ESXi主机与网络中其他主机的网咯数据包捕获

1、tcpdump-uw -i vmk0 -s 1514 host x.x.x.x 指定捕获与某台主机间的网络数据包2、tcpdump -i vmk0 -s 1514 port not 22 and port not 53 在捕获的数据包中&#xff0c;过滤掉指定端口的数据包3、tcpdump-uw -i vmk0 -s 1514 -w traffic.pcap 捕获的数据包保存成PCAP文件&…

Windows下批处理文件(.bat)的使用

批处理(Batch)&#xff0c;就是进行批量的处理&#xff0c;英文译文BATCH&#xff0c;批处理文件后缀BAT就取的前三个字母&#xff0c;通常被认为是一种简化的脚本语言&#xff0c;它应用于DOS和Windows系统中。批处理文件是扩展名为.bat或.cmd的文本文件&#xff0c;包含一条或…

金融业加速智能化,解析360金融AI基础架构和应用

传统金融信贷业务中&#xff0c;催收、客服及电销人员占比超过 60%&#xff0c;人员素质参差不齐的现状造成了管理成本过高的问题&#xff0c;由此衍生的客户体验差&#xff0c;也成为困扰金融业的一大通病。 8 月 15 日&#xff0c;在 360金融 AI 媒体开放日上&#xff0c;360…

正则:匹配一个汉字姓名

//汉字姓名正则var reg/^[\u4e00-\u9fa5]{2,}(\.[\u4e00-\u9fa5])?$/console.log(reg.test(张卫健.爱新觉罗))console.log(reg.test(兔子)) 复制代码

NLP命名实体识别开源实战教程 | 深度应用

作者 | 小宋是呢来源 | CSDN博客近几年来&#xff0c;基于神经网络的深度学习方法在计算机视觉、语音识别等领域取得了巨大成功&#xff0c;另外在自然语言处理领域也取得了不少进展。在NLP的关键性基础任务—命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER…

poj 2063完全背包

题意&#xff1a;给出总资金和投资年份 &#xff0c;n个股票 给出股票价格和其一年的利润。问如何选择能获得最大利润。 思路&#xff1a;股票可以重复选择&#xff0c;完全背包问题&#xff0c;完全背包也是从01背包衍生而行的&#xff0c;其主要区别在于中间那层循环的次序不…

UTF-8 CPP的使用

UTF-8 CPP是一个简单、小巧、轻量级、跨平台的UTF-8编码字符串库。下面对其使用方法进行简单的介绍&#xff1a;1. 从http://sourceforge.net/projects/utfcpp/下载最新的utf8_v2_3_4.zip源码&#xff0c;将其解压缩&#xff1b;2. 新建一个vs2013 控制台工程TestUTF…

一行js代码识别Selenium+Webdriver及其应对方案

有不少朋友在开发爬虫的过程中喜欢使用Selenium Chromedriver&#xff0c;以为这样就能做到不被网站的反爬虫机制发现。 先不说淘宝这种基于用户行为的反爬虫策略&#xff0c;仅仅是一个普通的小网站&#xff0c;使用一行Javascript代码&#xff0c;就能轻轻松松识别你是否使用…

Android系统移植与调试之-------如何修改Android设备添加重启、飞行模式、静音模式等功能(一)...

1、首先先来看一下修改前后的效果对比图 修改之后的图片 确认重启界面 具体的修改内容在下一篇中具体介绍。 Android系统移植与调试之------->如何修改Android设备添加重启、飞行模式、静音模式等功能&#xff08;二&#xff09; 作者&#xff1a;欧阳鹏 欢迎转载&#xf…

鸿蒙霸榜GitHub,从最初的Plan B到“取代Android”?

整理 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;距离 8 月 9 日鸿蒙&#xff08;HarmonyOS&#xff09;正式发布刚刚过去九天&#xff0c;这场由华为领衔的技术风暴&#xff0c;经过十年蛰伏&#xff0c;终于成功引爆全球。与此同时&#xff0c;一个非官…

CODING 最佳实践:快课网研发效能提升之路

快课企业移动学习平台是上海快微网络科技有限公司自主研发的企业级 SaaS 平台&#xff0c;提供移动学习、考试练习、培训管理、知识分享、统计分析等学习和培训功能&#xff0c;为员工、经销商及客户等全价值链合作伙伴提供全面的知识服务。本文将详细介绍快课网的研发团队是如…

基于chyh1990/caffe-compact在windows vs2013上编译caffe步骤

1. 从https://github.com/chyh1990/caffe-compact下载caffe-compact代码&#xff1b; 2. 通过CMake(cmake-gui)生成vs2013 x64 caffe工程&#xff1b; 3. 从https://github.com/google/protobuf下载ProtoBuf&#xff0c;解压缩&#xff0c;编译ProtoBuf&#xf…

菜鸟学***——菜鸟的旅程

第一章&#xff0e;菜鸟的旅程作为一个典型的菜鸟&#xff0c;第一次去网吧上网我不知道怎么开机是很正常的事情&#xff0c;但是无论怎么菜怎么无知也无法阻止我对于***的崇拜&#xff0c;我喜欢他们的那种神秘和在我们普通人眼中的无所不能&#xff0c;在网络世界里他们就想鱼…

程序员假冒AI,印度公司竟骗取2亿元投资

作者 | 神经小姐姐来源 | HyperAI超神经&#xff08;ID&#xff1a;HyperAI&#xff09;人工智能界有句调侃的话——「有多少智能&#xff0c;就有多少人工」&#xff0c;今天&#xff0c;印度的一家人工智能公司就印证了这句话。据《华尔街日报》报道&#xff0c;印度创业公司…

Windows7上使用VS2013编译Caffe源码(不带GPU支持)步骤

1. 从https://github.com/BVLC/caffe/通过git clone下载caffe源码,master分支,版本号为09868ac&#xff1a;$ git clone https://github.com/BVLC/caffe.git &#xff1b;2. 先使用cmake-gui构建生成vs2013工程&#xff0c;发现有很多错误&#xff0c;提示缺少各种依…

区块链之比特币的潜在激励

想知道更多区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】链客&#xff0c;有问必答&#xff01;&#xff01; 比特币&#xff0c;这个建立在开放P2P&#xff08;点对点&#xff09;网络结构之上的货币&#xff08;文献9&#xff09;&#xff0c;继续享受人们的追…

每天超50亿推广流量、3亿商品展现,阿里妈妈的推荐技术有多牛?

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;随着深度学习、强化学习、知识图谱、AutoML 等 AI 技术出现更多突破&#xff0c;推荐系统领域的企业和开发者开始将这些技术与传统推荐算法相结合&#xff0c;使得推荐效果得到显著提升。不过&#xff0c;越…

常用的JQuery数字类型验证正则表达式

var regexEnum { intege:"^-?[1-9]//d*$", //整数 intege1:"^[1-9]//d*$", //正整数 intege2:"^-[1-9]//d*$", //负整数 num:"^([-]?)//d*//.?//d$", //数字 num1:"^([1-9]//d*|0)$", //正数&#xff…

Java多线程编程实战:模拟大量数据同步

背景 最近对于 Java 多线程做了一段时间的学习&#xff0c;笔者一直认为&#xff0c;学习东西就是要应用到实际的业务需求中的。否则要么无法深入理解&#xff0c;要么硬生生地套用技术只是达到炫技的效果。 不过笔者仍旧认为自己对于多线程掌握不够熟练&#xff0c;不敢轻易应…

Ubuntu中Atom编辑器显示中文乱码的处理方法

在Ubuntu14.04 64位机上安装Atom&#xff0c;依次在终端输入如下命令&#xff1a; 1. $ sudo add-apt-repository ppa:webupd8team/atom 2. $ sudo apt-get update 3. $ sudo apt-get install atom处理中文乱码的问题&#xff1a; 1. 安装文泉驿正黑等相关中文字体&#…

我的世界游戏安装

2019独角兽企业重金招聘Python工程师标准>>> Minecraft 是一款沙盘独立视频游戏&#xff0c;灵感来自于Infiniminer&#xff0c;使用Java编写&#xff0c;由Markus "Notch" Persson 所建立&#xff0c;现由Mojang AB 公司开发。 这里我们介绍如何在pcDuin…

RSA签名的PSS模式

本文由云社区发表作者&#xff1a;mariolu 一、什么是PSS模式&#xff1f; 1.1、两种签名方式之一RSA-PSS PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS&#xff08;Public Key Cryptography …

AI真人表情包、斗地主AI......DeeCamp学员做了50个好玩又实用的AI项目

8月16日&#xff0c;2019 DeeCamp人工智能训练营的结营仪式上&#xff0c;展示了600名DeeCamp学员的50个AI实践课题。 结营仪式上&#xff0c;由2019 DeeCamp学员组成的6个项目小组作为代表&#xff0c;现场展示了自己Demo成果&#xff0c;并由李开复、张潼等学术及产业导师现…

libcurl库的使用(通过libcurl库下载url图像)

1. 从http://curl.haxx.se/download.html下载libcurl源码&#xff0c;解压缩&#xff1b; 2. 通过CMake(cmake-gui)生成vs2013 x64位 CURL.sln&#xff1b; 3. 打开CURL.sln&#xff0c;编译会生成libcurl.dll动态库&#xff1b; 4. 在CURL.sln基础上&a…

SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法

2019独角兽企业重金招聘Python工程师标准>>> 一直想把数据库的默认路径修改一下&#xff0c;在网上找了一下&#xff0c;真的发现有办法 &#xff0c; 特拿 来与大家共同分享。 以下仅为参照&#xff0c;如果有多个实例&#xff0c;可能会有些许不同&#xff1a; …

Linux下多线程编程互斥锁和条件变量的简单使用

Linux下的多线程遵循POSIX线程接口&#xff0c;称为pthread。编写Linux下的多线程程序&#xff0c;需要使用头文件pthread.h&#xff0c;链接时需要使用库libpthread.a。线程是进程的一个实体&#xff0c;是CPU调度和分派的基本单位&#xff0c;它是比进程更小的能独立运行的基…