小马哥训练营-Java EE单体架构

news/2025/4/1 3:24:19/

什么是Servlet

Servlet 是一种基于 Java 技术的 Web 组件,用于生成动态内容,由容器管理。类似于其他 Java 技术组件,Servlet 是平台无关的 Java 类组成,并且由 Java Web 服务器加载执行。通常情况,由 Servlet 容器提供运行时环境。Servlet 容器,有时候也称作为Servlet 引擎,作为Web服务器或应用服务器的一部分。通过请求和响应对话,提供Web客户端与 Servlets 交互的能力。容器管理Servlets实例以及它们的生命周期。
相关技术:
CGI - 基于进程,php, apache httpd CGI
Servlet-基于线程

servlet主要版本

规范版本发布时间Java平台主要更新
Servlet4.02017JavaEE8支持http/2
Servlet3.12013JavaEE7非阻塞I/O,http协议更新机制(websoket)
Servlet3.02009JavaEE6可插拔、简化部署、异步servlet,安全,文件上传
Servlet2.52005JavaEE5Annotation支持
Servlet2.42003J2EE1.4web.xml支持xml scheme
Servlet2.32001J2EE1.3新增filter,事件/监听器,Wrapper
Servlet2.21999J2EE1.2作为J2ee的一部分,以.war文件作为独立web应用

补充知识:
zip,jar,war,ear 其本质都是zip的拓展,都是压缩文件。war和jar拓展名不一样内容是一样的。

Servlet 核心API

核心组件API说明起始版本SpringFrameWork代表实现
javax.servlet .Servlet动态内容组件1.0DispatcherServlet
javax.servlet.FilterServlet过滤器2.3CharacterEncodingFilter
javax.servlet .ServletContextServlet 应用上下文
javax.servlet .AsyncContext异步上下文3.0
javax.servlet.ServletContextListenerServletContext 生命周期监听器2.3ContextLoaderListener
javax.servlet.ServletRequestListenerServletRequest 生命周期监听器2.3RequestContextListener
javaxservlet.http.HttpSessionListenerHttpSession 生命周期监听器2.3HttpSessionMutexListener
javax.servlet.AsyncListener异步上下文监听器3.0StandardServletAsyncWebRequest
javax.servlet.ServletContainerInitializerServlet 容器初始化器3.0Springservletcoptelyong

Servlet 组件注册方式

  • 传统web.xml注册方式 (写xml)
  • 注解方式(servlet 3.0 +)注解@WebServlet
  • 编码注册方式(servlet 3.0 +)
    在这里插入图片描述
    注册完成以后返回句柄,可以添加映射:
    在这里插入图片描述

Servlet 生命周期

  • 声明(应用行为)
  • 注册(容器行为 )
  • 初始化: Servlet#initServletConfig)
  • 服务: Servlet#service(ServletRequest, ServletResponse)
  • 销毁: Servlet#destroy()

Filter生命周期

  • 声明(应用行为)
  • 注册(容器行为)
  • 初始化:Filter#init(FilterConfig)
  • 过滤:Filter#doFilter(ServletRequest,ServletResponse,FilterChain)
  • 毁:Filter#destroy()

ServletContext 生命周期

  • 声明(应用行为)
  • 注册(容器行为)
  • 初始化:ServletContextListener#contextInitialized
  • 销毁:ServletContextListener#contextDestroyed

注:
Servlet规范重点章节 2,3,4,5,9,11,12 规范链接
CHAPTER 2 The Servlet Interface
CHAPTER 3 The Request
CHAPTER 4 Servlet Context
CHAPTER 5 The Response
CHAPTER 9 Dispatching Requests(非常重要)
CHAPTER 11Application Lifecycle Events
CHAPTER 12 Mapping Requests to Servlets(非常重要)
还需要看TomcatNIO
并非请求头(header)和请求体(body)都是异步读取的,要看Servlet容器的实现模型。
Tomcat官方文档
在这里插入图片描述

关于Tomcat 的一个优化

目前我们都不使用jsp了所以我们可以将jsp的servlet关掉。在tomcat中将此Servlet注释掉。

<servlet><servlet-name>jsp</servlet-name><servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class><init-param><param-name>fork</param-name><param-value>false</param-value></init-param><init-param><param-name>xpoweredBy</param-name><param-value>false</param-value></init-param><load-on-startup>3</load-on-startup>
</servlet>

关于Tomcat处理静态文件,使用了默认的servlet 来处理

因为jspServerlet 只是匹配jsp文件,要匹配静态文件我们需要用DefaultServlet来匹配。各个服务平台往往都是用default来命名,在springboot里静态文件的处理是forward(这个就是转发请求到下一个servlet) 到对应平台的Servlet来处理,从而适配了。所以在springboot 里面将css 和js文件放到static文件下面就可以读取到。
源码:

public class DefaultServletHttpRequestHandler implements HttpRequestHandler, ServletContextAware {// 这里定义了不同平台处理静态文件的servlet 名称private static final String COMMON_DEFAULT_SERVLET_NAME = "default";private static final String GAE_DEFAULT_SERVLET_NAME = "_ah_default";private static final String RESIN_DEFAULT_SERVLET_NAME = "resin-file";private static final String WEBLOGIC_DEFAULT_SERVLET_NAME = "FileServlet";private static final String WEBSPHERE_DEFAULT_SERVLET_NAME = "SimpleFileServlet";@Nullableprivate String defaultServletName;@Nullableprivate ServletContext servletContext;public DefaultServletHttpRequestHandler() {}public void setDefaultServletName(String defaultServletName) {this.defaultServletName = defaultServletName;}public void setServletContext(ServletContext servletContext) {this.servletContext = servletContext;if (!StringUtils.hasText(this.defaultServletName)) {if (this.servletContext.getNamedDispatcher("default") != null) {this.defaultServletName = "default";} else if (this.servletContext.getNamedDispatcher("_ah_default") != null) {this.defaultServletName = "_ah_default";} else if (this.servletContext.getNamedDispatcher("resin-file") != null) {this.defaultServletName = "resin-file";} else if (this.servletContext.getNamedDispatcher("FileServlet") != null) {this.defaultServletName = "FileServlet";} else {if (this.servletContext.getNamedDispatcher("SimpleFileServlet") == null) {throw new IllegalStateException("Unable to locate the default servlet for serving static content. Please set the 'defaultServletName' property explicitly.");}this.defaultServletName = "SimpleFileServlet";}}}public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Assert.state(this.servletContext != null, "No ServletContext set");RequestDispatcher rd = this.servletContext.getNamedDispatcher(this.defaultServletName);if (rd == null) {throw new IllegalStateException("A RequestDispatcher could not be located for the default servlet '" + this.defaultServletName + "'");} else {// 分发到对应的servlet 进行处理 因为他们都遵循了同一个规范rd.forward(request, response);}}
}

关于default servlet 处理静态文件的一个配置示例

<!--映射路径-->
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.css</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.js</url-pattern></servlet-mapping><servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>listings</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup></servlet>

注解:
关于forward 的时候会不会经过过滤链,这需要在过滤链进行配置。关于执行顺序,先定义mapping的filter优先。

<filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/*</url-pattern><!-- 配置 各种操作的时候也经过过滤器--><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher><dispatcher>ERROR</dispatcher>
</filter-mapping>

课堂上的补充知识点:
SPI:spi加载机制


http://www.ppmy.cn/news/520654.html

相关文章

plt保存图像

plt.figure() plt.plot(img) plt.show() plt.savefig(***)

C++处理YTB faces 标注信息

&#xff23;编写程序&#xff1a; 1.采用windows api; 2.创建结构体 struct Object { double o_x, o_y; // 中心坐标 double o_width, o_height; // 长宽 }; 3.创建上述结构体类型的数组; 4.读取.\Aaron_Eckhart文件夹下的txt文件&#xff0c;将文件中的字符按行处理…

如何快速把mkv转为mp4格式,并保留字幕!

mkv文件其实属于封装格式&#xff0c;包括视频、音频、字幕等文件&#xff0c;像一些PR等剪辑软件就不能直接调用&#xff0c;而且很多播放器在识别这些文件时也可能因为兼容性问题导致不能播放。解决办法很简单&#xff0c;把mkv文件转为mp4格式就可以了。不过值得注意的是&am…

MS7024-数字编解码/TV编码器

1.基本介绍 MS7024是一款TV编码器芯片&#xff0c;用于手持式、便捷式视频应用&#xff0c;例如数码相机和类似的便携嵌入式系统。将视频信号编码并产生同步信号&#xff0c;符合NTSC和PAL标准。TV输出制式支持NTSC-M,NTSC-J,NTSC-433,PAL-B/D/G/H/I,PAL-M.PAL-N和PAL-60。具有…

mkv文件如何转为mp4?

mkv文件如何转为mp4?mkv格式并非是压缩格式的一种&#xff0c;而是Matroska的一种媒体文件&#xff0c;其最大的特点就是能容纳多种不同类型编码的视频、音频及字幕流。也因其格式的特殊性&#xff0c;使得很多软件不能打开mkv格式的视频。那为了不影响使用mkv视频&#xff0c…

mkv容器格式1---EBML语言

1. EBML(Extensible Binary Meta Language) 参考&#xff1a;http://blog.csdn.net/LBO4031/article/details/7591945 http://www.matroska.org/technical/specs/rfc/index.html mkv是建立在EBML语言基础上的&#xff0c;因此要了解mkv需要先了解EBML语言。 1. EBML元素(EBM…

MKVToolNix for Mac(mkv视频编辑工具)

MKVToolNix mac版是Macos上一款mkv视频编辑工具,支持将多种视频、音频、字幕等格式封装成mkv格式&#xff0c;MKVtoolnix mac版一款专业的MKV无损处理编辑工具&#xff0c;可以轻松实现MKV视频封装的功能。 MKVToolNix mac下载安装教程 下载完成后&#xff0c;双击.pkg文件打开…

H.264编码器基本原理

1.编码器 相关概念 编码器采用的是变换和预测的混合编码法&#xff1a;采用混合编码时候主要将图像分为固定大小的块&#xff0c;对块进行压缩编码处理。 1.混合编码&#xff1a;即将预测编码和变换编码结合起来。 1.1 预测编码&#xff1a; 1.1.1 帧内预测&#xff1a…