springboot使用外置的tomcat,启动的时候没有启动springboot应用

2023-11-16

 

springboot使用外置的tomcat,启动的时候没有启动springboot应用,虽然可以访问首页

但是点击超链接访问controller却是404错误,

前台

<%--
  Created by IntelliJ IDEA.
  User: jillion
  Date: 2018/10/18
  Time: 23:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>你好欢迎来到首页</h1>
<a href="abc">abc</a>
</body>
</html>
后台代码:
@Controller
public class HelloController {
    @RequestMapping("/abc")
    public String hello(Model model){
        model.addAttribute("msg","处理成功");
        return "success";
    }

}

点击abc连接出现404错误,

这是因为启动tomcat容器的时候并没有情动到springboot应用,找了半天也不行,最后,进行compile,package

重新启动后就可以了,

 

我们看看使用外置的Servlet容器的原理:

嵌入式Servlet容器:应用打成可执行的jar

​ 优点:简单、便携;

​ 缺点:默认不支持JSP、优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】);

 

外置的Servlet容器:外面安装Tomcat---应用war包的方式打包;

步骤

1)、必须创建一个war项目;(利用idea创建好目录结构)

2)、将嵌入式的Tomcat指定为provided;

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

3)、必须编写一个SpringBootServletInitializer的子类,并调用configure方法

public class ServletInitializer extends SpringBootServletInitializer {
​
   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       //传入SpringBoot应用的主程序
      return application.sources(SpringBoot04WebJspApplication.class);
   }
​
}

4)、启动服务器就可以使用;

原理

jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式的Servlet容器;

war包:启动服务器,服务器启动SpringBoot应用【SpringBootServletInitializer】,启动ioc容器;

 

servlet3.0(Spring注解版):

8.2.4 Shared libraries / runtimes pluggability:

规则:

​ 1)、服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面ServletContainerInitializer实例:

​ 2)、ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的实现类的全类名

​ 3)、还可以使用@HandlesTypes,在应用启动的时候加载我们感兴趣的类;

 

流程:

1)、启动Tomcat

2)、org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar!\META-INF\services\javax.servlet.ServletContainerInitializer:

Spring的web模块里面有这个文件:org.springframework.web.SpringServletContainerInitializer

3)、SpringServletContainerInitializer将@HandlesTypes(WebApplicationInitializer.class)标注的所有这个类型的类都传入到onStartup方法的Set<Class<?>>;为这些WebApplicationInitializer类型的类创建实例;

4)、每一个WebApplicationInitializer都调用自己的onStartup;

5)、相当于我们的SpringBootServletInitializer的类会被创建对象,并执行onStartup方法

6)、SpringBootServletInitializer实例执行onStartup的时候会createRootApplicationContext;创建容器

protected WebApplicationContext createRootApplicationContext(
      ServletContext servletContext) {
    //1、创建SpringApplicationBuilder
   SpringApplicationBuilder builder = createSpringApplicationBuilder();
   StandardServletEnvironment environment = new StandardServletEnvironment();
   environment.initPropertySources(servletContext, null);
   builder.environment(environment);
   builder.main(getClass());
   ApplicationContext parent = getExistingRootWebApplicationContext(servletContext);
   if (parent != null) {
      this.logger.info("Root context already created (using as parent).");
      servletContext.setAttribute(
            WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, null);
      builder.initializers(new ParentContextApplicationContextInitializer(parent));
   }
   builder.initializers(
         new ServletContextApplicationContextInitializer(servletContext));
   builder.contextClass(AnnotationConfigEmbeddedWebApplicationContext.class);
    
    //调用configure方法,子类重写了这个方法,将SpringBoot的主程序类传入了进来
   builder = configure(builder);
    
    //使用builder创建一个Spring应用
   SpringApplication application = builder.build();
   if (application.getSources().isEmpty() && AnnotationUtils
         .findAnnotation(getClass(), Configuration.class) != null) {
      application.getSources().add(getClass());
   }
   Assert.state(!application.getSources().isEmpty(),
         "No SpringApplication sources have been defined. Either override the "
               + "configure method or add an @Configuration annotation");
   // Ensure error pages are registered
   if (this.registerErrorPageFilter) {
      application.getSources().add(ErrorPageFilterConfiguration.class);
   }
    //启动Spring应用
   return run(application);
}

7)、Spring的应用就启动并且创建IOC容器

public ConfigurableApplicationContext run(String... args) {
   StopWatch stopWatch = new StopWatch();
   stopWatch.start();
   ConfigurableApplicationContext context = null;
   FailureAnalyzers analyzers = null;
   configureHeadlessProperty();
   SpringApplicationRunListeners listeners = getRunListeners(args);
   listeners.starting();
   try {
      ApplicationArguments applicationArguments = new DefaultApplicationArguments(
            args);
      ConfigurableEnvironment environment = prepareEnvironment(listeners,
            applicationArguments);
      Banner printedBanner = printBanner(environment);
      context = createApplicationContext();
      analyzers = new FailureAnalyzers(context);
      prepareContext(context, environment, listeners, applicationArguments,
            printedBanner);
       
       //刷新IOC容器
      refreshContext(context);
      afterRefresh(context, applicationArguments);
      listeners.finished(context, null);
      stopWatch.stop();
      if (this.logStartupInfo) {
         new StartupInfoLogger(this.mainApplicationClass)
               .logStarted(getApplicationLog(), stopWatch);
      }
      return context;
   }
   catch (Throwable ex) {
      handleRunFailure(context, listeners, analyzers, ex);
      throw new IllegalStateException(ex);
   }
}

==启动Servlet容器,再启动SpringBoot应用==

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot使用外置的tomcat,启动的时候没有启动springboot应用 的相关文章

  • 第二讲 MySQL体系结构与存储引擎

    1 MySQL体系结构 1 1 数据库与数据库实例 数据库 物理操作系统中的文件和其他文件类型的集合 除了硬盘存储的文件 也可以是存放在内存中的文件 数据库实例 有数据库后台进程 线程以及一个共享内存区域组成 共享内存可以被后台进程 线程所
  • 【数据结构期末例题】

    前言 本文是博主自己在准备学校数据结构考试时的总结 各个知识点都贴有对应的详细讲解文章以供大家参考 当然文中还有许许多多的截图 这些是博主对主要内容的摘取 对于那些基础较好的同学可以直接看截图 减少跳转对应文章浏览全文的时间 感谢本文引用文
  • 弹性盒子(display: flex)布局超全讲解

    文章目录 什么是弹性布局 弹性布局的特点 容器的属性 justify content align items flex direction flex wrap flex flow align content order属性 flex gro
  • QT笔记-Label控件显示图片

    1 Label控件动态显示图片 动态显示图片1 int DeviceEdit OnLensPic bool checked AfCd cd QImage img img load UI lens bmp QImage imgScaled i
  • EduCoder_web实训作业--页面结点元素

    第一关 B C D A B 第二关 section section
  • LeetCode从零开始——第一题

    1 两数之和 题目描述 解题思路 代码执行 题目描述 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素不能
  • WPF图表Live Charts(四)动态折线图

    简介 前面介绍了Live Charts的基础和设置 接下将介绍如何绘制动态的折线图 实时更新数据的折线图 效果预览 前台代码
  • 容器常用函数、algorithm头文件

    偶然发现有个
  • C++ 大话设计之《代理模式》(优缺点,设计原理,常用场景)

    代理模式是一种结构型模式 优点 可以实现对原对象的访问控制 代理对象可以在访问原对象之前执行一些额外操作 例如检查权限 记录日志等 可以提供额外的功能 代理对象可以在不修改原对象的情况下 为原对象提供额外的功能 可以减少客户端代码的复杂性
  • 【QT基础入门】1、QT开发环境搭建

    文章目录 一 学习所需要的软件 二 安装 VS2012 三 win10 下安装 QT 一 学习所需要的软件 Visual Studio 2012 Qt SDK 4 7 4 Qt Creator 2 4 1 Visutal Studio 20
  • 2021-10-26尤破金10.27外汇黄金白银实时操作策略布局

    黄金行情走势分析 周二 10月26日 国际金价回落 受到美元上扬打压 投资者在本周的关键央行政策会议前评估各国央行对日益增长的通胀压力可能做出的反应 分析师说 在当前的通胀环境下 黄金应能维持相对良好的支撑 直到我们得到美联储明确的鹰派转向
  • 2017总结

    这一年还是大部分时间做着开发的工作 在创业的一年多时间里 好像自己所做的事情不太像一个创业者做的事 用了太多的时间在具体的工作当中了 对于市场 对于营销推广都是在被动的接收 没有全面的 主动的去做事情 这也可能是我们做技术的出来创业的弊端
  • Vue.js 中hash路由和history路由原理及优缺点

    Vue js 中hash路由和history路由原理及优缺点 hash模式 原理 在 url 中的 之后对应的是 hash 值 其原理是通过hashChange 事件监听hash值的变化 根据路由表对应的hash值来判断加载对应的路由加载对
  • python基础----02-----字面量、变量、数据类型及其转换、标识符以及字符串、数据输入(input语句)

    一 字面量 1 字面量 字面量 在代码中 被写下来的的固定的值称之为字面量 类似C C 的字符串常量 1 1 常见的python值类型 Python中常见的值类型 实际上在C C 字面量和这里的类型还是有区别的 体现在内存存储中 字面量存储

随机推荐

  • 批处理命令将文件合并成一个pdf_如何在 Linux 命令行操作 PDF

    pdftk 命令提供了许多处理 PDF 的命令行操作 包括合并页面 加密文件 添加水印 压缩文件 甚至还有修复 PDF Sandra Henry stocker 作者 虽然 PDF 通常被认为是相当稳定的文件 但在 Linux 和其他系统上
  • linux修改用户名

    1 开root sudo passwd 2 修改sudoer 防止过程中用户权限不够 命令 gedit etc sudoer root ALL ALL ALL ALL 下添加 xxx ALL ALL ALL ALL 3 修改shadow g
  • 数论整理之唯一质因子分解方程

    唯一质因子分解方程 每个大于1的自然数均可写为质数的积 而且这些素因子按大小排列之后 写法仅有一种方式 标称 include
  • Qt getSaveFileName Qt date 获取显示当前时间和日期 文件

    保存文件 getSaveFileName QString strSaveName QFileDialog getSaveFileName this tr 保存的文件 tr demo a txt
  • C# SolidWorks 二次开发 API --- 实例:随机上色

    随机上色这个功能做起来不算复杂 但是要想做的比较完美也不简单 这一篇文章我就只做随机给装配体中的零件上色 上色前 上色后 简单的代码 private void btn setcolor Click object sender EventAr
  • FFMPEG推流摄像头

    一般的直播网站都使用OBS推流 其实ffmpeg也可以推流 在无界面环境下就可以推流使用 本文以Windows下为例 简单介绍下使用ffmpeg工具推流的方法和步骤 下载安装 下载地址 https ffmpeg zeranoe com bu
  • 使用源码安装的方式安装杀毒软件Clamav

    使用源码安装的方式安装杀毒软件Clamav 安装过程要解决的依赖有一个 libcurl 下载clamav源码包 wget http www clamav net downloads production clamav 0 102 3 tar
  • 微信小程序和网站显示灰色方法

    一 小程序设置 此时大家发现很多网站 app 小程序的整体色调全部变为了灰色 其实并不是所有的图标全部替换了灰色 只是在css中设置了一个属性 只要加上css样式即可 page webkit filter grayscale 95 全局可以
  • CSMA/CD和CSMA/CA详解

    CSMA CD CSMA CD Carrier Sense Multiple Access Collision Detect 即载波监听多路访问 冲突检测方法 在以太网中 所有的节点共享传输介质 如何保证传输介质有序 高效地为许多节点提供传
  • JAVA中正则表达式的使用

    正则表达式 用法 一 使用正则表达式对String进行匹配 1 控制匹配长度 1 使用 n 来精确控制 2 使用 n 表示大于等于n个 3 使用 m n 控制范围 4 使用 表示可以出现 0次或一次 5 使用 表示可以出现 0次或多次 6
  • 某乎搜索接口x-zse-96参数逆向学习分析,网站:aHR0cHM6Ly93d3cuemhpaHUuY29tLw==

    目标参数 x zse 96 参数分析 全局搜索x zse 96 只有两个地方出行 打上断点后刷新网页 从图中断点地方可以看到 搞清楚u f s 的由来就解决了x zse 96 可以看到s参数是由以下几部分组成 1 101 3 2 0 固定版
  • 【Solidity】internal、private、external、public区别

    public与private 对于public和private 相信学过其他主流语言的人都能明白 public修饰的变量和函数 任何用户或者合约都能调用和访问 private修饰的变量和函数 只能在其所在的合约中调用和访问 即使是其子合约也
  • python是面向对象还是面向过程的语言_关于python是面向对象还是面向过程的分析...

    关于python是面向对象还是面向过程的分析 发布时间 2020 04 07 16 10 55 来源 亿速云 阅读 24 作者 小新 今天小编给大家分享的是关于python是面向对象还是面向过程的分析 很多人都不太了解 今天小编为了让大家更
  • mac 快速安装brew

    安装homebrew好用的文章 mac下镜像飞速安装Homebrew教程 知乎 直接执行这个命令 bin bash c curl fsSL https gitee com ineo6 homebrew install raw master
  • 医疗虚拟仿真和虚拟现实有什么区别?哪个更好?

    随着我们在仿真教育中越来越多地使用新技术 区分虚拟模式的类型很重要 虚拟仿真是一个统称 用来概括术语来描述各种基于仿真的体验 从基于屏幕的平台到沉浸式虚拟现实 然而 各虚拟平台在保真度 沉浸感和临场感的水平上有很大差异 医疗教育中存在许多虚
  • html毛玻璃背景代码,css毛玻璃背景的制作

    今天早上 听到有人说拼多多上市 然后各种黑 说什么市场倒退了二十年 然后搬出那英当年的 雾里看花 说这首歌就是在讽刺假货横行 雾里看花 代表了一种 朦胧美 如果你喜欢朦胧美 那你也可能也会喜欢毛玻璃 毛玻璃 效果 本质上是对背景图片的部分区
  • 基于灰度的模板匹配(标准)

    原图 创建模板 在加了噪声的图中识别 代码 dev close window dev open window 0 0 599 464 black WindowID read image Image pumpe dev set draw ma
  • android下的定时器在关闭屏幕后会自己停掉解决方法

    好坑 没系统的学过android 写一东西 尼玛发现连着usb线 神马都正常 但是拔掉usb线后 屏幕自动关闭后 android下的定时器就失效了 尼玛 调了好久才发现的 那么 肿么办 会遇到这个问题 一般都是学过java 然后直接跑去写a
  • 25开灯与关卡蓝图

    下了个ue5试试 这节讲的是 蓝图 点光源切换是否可视 如果初始化 点光源可视 那么运行后就会切换成不可视 如果初始化时 点光源不可视 那么运行时可视 且比较了各种光源的差别 首先看是否可视的设置 即编辑器中初始化可视 运行起来就没灯光了
  • springboot使用外置的tomcat,启动的时候没有启动springboot应用

    springboot使用外置的tomcat 启动的时候没有启动springboot应用 虽然可以访问首页 但是点击超链接访问controller却是404错误 前台