SpringBoot第三站:配置嵌入式服务器使用外置的Servlet容器

目录

1. 配置嵌入式服务器

1.1 如何定制和修改Servlet容器的相关配置

1.server.port=8080

2. server.context-path=/tx

3. server.tomcat.uri-encoding=UTF-8

1.2 注册Servlet三大组件【Servlet,Filter,Listener】

1. servlet

2. filter

3. 监听器Listener

2. 使用外置的Servlet容器

步骤

1)必须创建一个war项目;

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

3)配置项目的目录结构

4)部署Tomcat

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

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


1. 配置嵌入式服务器

1.1 如何定制和修改Servlet容器的相关配置

修改和server有关的配置(ServerProperties)

server.port=8080
server.context‐path=/tx
server.tomcat.uri‐encoding=UTF‐8

1.server.port=8080

  • 含义:该配置项用于指定 Spring Boot 应用启动时所监听的端口号。在 Web 应用中,服务器需要监听一个特定的端口来接收客户端的 HTTP 请求,这里将端口号设置为 8080
  • 示例说明:当启动应用后,在浏览器中输入 http://localhost:8080 (假设应用运行在本地),就可以访问该应用。如果该端口已被其他应用占用,Spring Boot 应用启动时会报错,你需要修改此端口号为其他未被占用的值,如 80819090 等。

2. server.context-path=/tx

  • 含义:此配置项用于设置应用的上下文路径。上下文路径是 URL 中位于主机名和端口号之后、具体请求路径之前的部分,它相当于为应用设置了一个访问前缀。
  • 示例说明:若配置了 server.context-path=/tx,当应用启动后,要访问应用中的资源,URL 就需要加上这个上下文路径。例如,原本访问应用首页的 URL 是 http://localhost:8080,现在则变为 http://localhost:8080/tx。如果要访问某个控制器中映射路径为 /hello 的方法,完整的 URL 就是 http://localhost:8080/tx/hello

3. server.tomcat.uri-encoding=UTF-8

  • 含义:该配置项用于指定 Tomcat 服务器在处理请求 URI 时所使用的字符编码。字符编码决定了如何将字节数据转换为字符数据,设置为 UTF-8 可以确保在处理包含中文、特殊符号等多语言字符的 URI 时不会出现乱码问题。
  • 示例说明:当客户端发送的请求 URI 中包含中文参数,如 http://localhost:8080/tx/search?keyword=你好,服务器会按照 UTF-8 编码来解析这个 URI,从而正确获取到 keyword 参数的值为 你好。如果不设置这个编码,可能会导致解析后的参数值出现乱码。

1.2 注册Servlet三大组件【Servlet,Filter,Listener】

        由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。

1. servlet

//注册三大组件
@Bean
public ServletRegistrationBean myServlet(){ServletRegistrationBean registrationBean = new ServletRegistrationBean(newMyServlet(),"/myServlet");return registrationBean;
}
package com.qcby.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class MyServlet extends HttpServlet{// 重写 doGet 方法来处理 GET 请求@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置响应内容类型resp.setContentType("text/html;charset=UTF-8");// 获取响应输出流PrintWriter out = resp.getWriter();// 输出响应内容out.println("<html>");out.println("<head><title>My Servlet</title></head>");out.println("<body>");out.println("<h1>这是自定义 Servlet 的响应内容</h1>");out.println("</body>");out.println("</html>");}// 重写 doPost 方法来处理 POST 请求@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

        自己写MyServlet类继承HttpServlet类来实现一个标准的 Servlet,并且要重写doGet 或 doPost 等方法来处理 HTTP 请求

2. filter

@Bean
public FilterRegistrationBean myFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();registrationBean.setFilter(new MyFilter());registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));return registrationBean;
}

        MyFilter 类需要实现 javax.servlet.Filter 接口,并重写接口中的 init、doFilter 和 destroy 方法,这样才能成为一个标准的过滤器。

package com.qcby.servlet;import javax.servlet.*;
import java.io.IOException;public class MyFilter implements Filter {// 过滤器初始化方法,在过滤器创建时调用@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 可以在这里进行一些初始化操作,例如读取配置文件等System.out.println("MyFilter 初始化");}// 过滤方法,每次请求匹配到该过滤器时都会调用@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 在请求处理之前可以进行一些预处理操作,例如设置字符编码request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");System.out.println("MyFilter 开始过滤请求");// 调用 FilterChain 的 doFilter 方法将请求传递给下一个过滤器或目标 Servletchain.doFilter(request, response);System.out.println("MyFilter 处理完响应");}// 过滤器销毁方法,在过滤器销毁时调用@Overridepublic void destroy() {// 可以在这里进行一些资源释放操作,例如关闭数据库连接等System.out.println("MyFilter 销毁");}
}

3. 监听器Listener

@Bean
public ServletListenerRegistrationBean myListener(){ServletListenerRegistrationBean<MyListener> registrationBean = newServletListenerRegistrationBean<>(new MyListener());return registrationBean;
}

        MyListener 类需要实现 Servlet 监听器接口,这样才能发挥监听器的作用。Servlet 监听器有多种类型,常见的有 ServletContextListener(用于监听 ServletContext 的创建和销毁)、HttpSessionListener(用于监听 HttpSession 的创建和销毁)、ServletRequestListener(用于监听 ServletRequest 的创建和销毁)等

package com.qcby.servlet;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyListener implements ServletContextListener {// 当 ServletContext 被创建时调用@Overridepublic void contextInitialized(ServletContextEvent sce) {// 可以在这里进行一些初始化操作,例如加载配置文件、初始化数据库连接池等System.out.println("ServletContext 初始化,应用启动");}// 当 ServletContext 被销毁时调用@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 可以在这里进行一些资源释放操作,例如关闭数据库连接池等System.out.println("ServletContext 销毁,应用关闭");}
}
  • contextInitialized 方法:当 ServletContext 被创建时调用,通常用于执行一些初始化操作,如加载配置文件、初始化数据库连接池等。
  • contextDestroyed 方法:当 ServletContext 被销毁时调用,通常用于执行一些资源释放操作,如关闭数据库连接池等。
        将 MyListener  注册为监听器。这样,当应用启动和关闭时,MyListener  中的 contextInitialized  和 contextDestroyed  方法会相应地被调用。
        SpringBoot帮我们自动SpringMVC的时候,自动的注册SpringMVC的前端控制器DispatcherServlet;
DispatcherServletAutoConfiguration中:


2. 使用外置的Servlet容器

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

        优点:简单、便携;

        缺点:默认不支持JSP、优化定制比较复杂.;

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

步骤

1)必须创建一个war项目;

jar包和war包:

        springboot的jar包是一个可执行的归档文件,它遵循 “胖 JAR”(Fat JAR)的理念,即将应用程序代码、依赖的所有库(包括 Spring Boot 自身的库)以及嵌入式服务器(如 Tomcat、Jetty 等)都打包在一个 JAR 文件中。

        WAR(Web Application Archive)包是传统的 Web 应用程序打包格式,主要用于部署到外部的 Servlet 容器(如 Tomcat、WebLogic 等)中。它的结构遵循标准的 Web 应用程序目录结构,不包含嵌入式服务器。

(利用idea创建好目录结构)

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

        如果要将 Spring Boot 项目打包成 WAR 包,需要进行一些额外的配置。以 Maven 为例,需要在pom.xml中进行如下配置:

<packaging>war</packaging><dependencies><!-- 排除嵌入式Tomcat依赖 --><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>

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

3)配置项目的目录结构

 

 

 

4)部署Tomcat

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


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

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

原理

        jar包:

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

        war包:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35409.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AdaLoRA 参数 配置:CAUSAL_LM“ 表示因果语言模型任务

AdaLoRA 参数 配置:CAUSAL_LM" 表示因果语言模型任务 config = AdaLoraConfig( init_r=16, # 增加 LoRA 矩阵的初始秩 lora_alpha=32, target_modules=[“q_proj”, “v_proj”], lora_dropout=0.1, bias=“none”, task_type=“CAUSAL_LM” ) 整体功能概述 AdaLoraCon…

IP 协议

文章目录 IP 协议概述数据包格式首部校验和实例分析实例一 分片抓包分析参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均附有参考链接&#xff0c;如侵权&#xff0c;请联系删除。 IP 协议 概述 IP 协议是 TCP/IP 协议簇中的核心协议&#xff0c;也…

日常开发记录-radioGroup组件

日常开发记录-radioGroup组件 1.前提2.问题&#xff1a;无限循环调用3.解释Vue 事件传播机制分析与无限循环原因解释4.解决 1.前提 在上一章的&#xff0c;我们实现了radio组件。从这进入了解 新增个radioGroup组件呢。 <template><divclass"q-radio-group&quo…

API调用comfyui工作流,做一个自己的app,chatgpt给我写的前端,一键创建自己的卡通形象,附源码

前言 工具介绍 首先 comfyui你是少不了的&#xff0c;这个是工作流的后端支持&#xff0c;用这个去调试工作流和生成API可调用文件 前端我们就用很流行的gradio吧&#xff0c;什么你一时半会没有学gradio的计划&#xff0c;没事&#xff0c;笔者也没系统学过&#xff0c;我干…

【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)

在图片中&#xff0c;数据流&#xff08;Data Workflow&#xff09;描述了应用程序中数据的流动过程&#xff0c;涉及 Routes&#xff08;路由&#xff09;、Controllers&#xff08;控制器&#xff09;、Models&#xff08;模型&#xff09; 和 Middleware&#xff08;中间件&…

【通义千问】蓝耘智算 | 智启未来:蓝耘MaaS×通义QwQ-32B引领AI开发生产力

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…

Scratch 3.0安装包,支持Win7/10/11、Mac电脑手机平板、少儿便编程的启蒙软件。

Scratch是一款由麻省理工学院&#xff08;MIT&#xff09; 设计开发的少儿编程工具。其特点是&#xff1a;使用者可以不认识英文单词&#xff0c;也可以不使用键盘&#xff0c;就可以进行编程。构成程序的命令和参数通过积木形状的模块来实现。用鼠标拖动指令模块到脚本区就可以…

Deepseek学习--工具篇之Ollama

Deepseek学习--工具篇之Ollama 用途特点简化部署‌轻量级与可扩展性‌API支持‌预构建模型库‌模型导入与定制‌跨平台支持‌命令行工具与环境变量‌ 来源缘起诞生爆发持续 安装使用方法下载安装安装模型调用API 用途 我们在进行Deepseek本地部署的时候&#xff0c;通常会用到…

Flask多参数模版使用

需要建立目录templates&#xff1b; 把建好的html文件放到templates目录里面&#xff1b; 约定好参数名字&#xff0c;单个名字可以直接使用&#xff1b;多参数使用字典传递&#xff1b; 样例&#xff1a; from flask import render_template # 模板 (Templates) #Flask 使用…

LabVIEW旋转设备状态在线监测系统

为了提高大型旋转设备如电机和水泵的监控效率和故障诊断能力&#xff0c;用LabVIEW软件开发了一套实时监测与故障诊断系统。该系统集成了趋势分析、振动数据处理等多项功能&#xff0c;可实时分析电机电流、压力、温度及振动数据&#xff0c;以早期识别和预报故障。 ​ 项目背…

汽车PKE无钥匙进入系统一键启动系统定义与原理

汽车智能钥匙&#xff08;PKE无钥匙进入系统&#xff09;一键启动介绍 系统定义与原理 汽车无钥匙进入系统&#xff0c;简称PKE&#xff08;Passive Keyless Entry&#xff09;&#xff0c;该系统采用了RFID无线射频技术和车辆身份编码识别系统&#xff0c;率先应用小型化、小…

【Idea】 xml 文本粘贴保持原有文本的缩进格式

Idea xml 文本粘贴保持原有文本的缩进格式 在使用 IntelliJ IDEA 2018 版本中的 MyBatis 时&#xff0c;粘贴 SQL 语句会自动对齐&#xff0c;此时需要进行相关设置来禁用此功能。 setting——>Editor——>Code Style——>XML 勾选“Keep white spaces”

Unity 和 Python 的连接(通过SocketIO)附源码

在游戏或者项目开发中&#xff0c;Unity 通常用于创建前端&#xff0c;而 Python 则因其强大的数据处理能力常被用作后端。通过 Socket.IO&#xff0c;我们可以轻松地实现 Unity 和 Python 的实时通信。本文将介绍如何通过 Socket.IO 连接 Unity 和 Python&#xff0c;并附上完…

[IP]UART

UART 是一个简易串口ip&#xff0c;用户及配置接口简单。 波特率从9600至2000000。 该 IP 支持以下特性&#xff1a; 异步串行通信&#xff1a;标准 UART 协议&#xff08;1 起始位&#xff0c;8 数据位&#xff0c;1 停止位&#xff0c;无奇偶校验&#xff09;。 参数化配置…

vue2实现可拖拽菜单栏,及根据菜单内容自动扩展宽度

分为两个功能 基本的html: <el-scrollbarid"leftmenu"v-resize"MuneResize"wrap-class"scrollbar-wrapper"><el-menu:default-active"activeMenu":collapse"isCollapse":background-color"variables.menuBg&…

【软件工程】03_软件需求分析

3.1 系统分析 1. 系统分析概述 系统分析是一组统称为计算机系统工程的活动。它着眼于所有的系统元素,而非仅仅局限于软件。系统分析主要探索软件项目的目标、市场预期、主要的技术指标等,其目的在于帮助决策者做出是否进行软件项目立项的决定。 2. 可行性分析(Feasibility …

父组件中循环生成多个子组件时,有且只有最后一个子组件的watch对象生效问题及解决办法

提示&#xff1a;父组件中循环生成多个子组件时&#xff0c;有且只有最后一个子组件的watch对象生效问题及解决办法 文章目录 [TOC](文章目录) 前言一、问题二、解决方法——使用function函数代替箭头函数()>{}总结 前言 ‌‌‌‌‌问题&#xff1a;子组件用that解决watch无…

SpringMVC(八)Knife4j 接口文档

目录 一 基础使用 1 配置pom.xml相关依赖 2 项目配置 3 输入指定路径&#xff08;http://localhost:8080/doc.html&#xff09; 二 一些使用方法 1 Tag 2 Operation 3 Schema 4 Parameter 5 可以根据需求来设置 补充&#xff1a;日期的格式化 Knife4j 是基于 Swag…

二分算法--整数二分

二分算法–整数二分 假如给定一个整数序列&#xff0c;{ a 1 a_1 a1​, a 2 a_2 a2​, a 3 a_3 a3​, …, a n a_n an​} 我们将整个数列根据某个元素 a x a_x ax​将数列分成左右两个部分&#xff08;某一部分可以包含 a x a_x ax​&#xff09; 首先我们定义一个mid 如…

有效的括号 力扣20

一、题目 二、思路 这题算是栈的经典应用。 主要有三种情况&#xff1a; 第一种情况&#xff1a;已经遍历完了字符串&#xff0c;但是栈不为空&#xff0c;说明有相应的左括号没有右括号来匹配&#xff0c;所以return false 第二种情况&#xff1a;遍历字符串匹配的过程中&…