提交 f2de5ee0 编写于 作者: W wizardforcel

2020-06-11 11:11:10

上级 cf964f8a
...@@ -34,7 +34,7 @@ Table of Contents ...@@ -34,7 +34,7 @@ Table of Contents
我总是更加强调代码注释。 配置文件也是如此。 添加配置文件标头总是非常有帮助的,该标头总结了配置文件中定义的 bean /属性。 我总是更加强调代码注释。 配置文件也是如此。 添加配置文件标头总是非常有帮助的,该标头总结了配置文件中定义的 bean /属性。
春季配置中,您可以像添加 XML 注释一样添加注释,也可以使用 description 元素。 例如: Spring配置中,您可以像添加 XML 注释一样添加注释,也可以使用 description 元素。 例如:
```java ```java
<beans> <beans>
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
**i)**您有一个用 Struts 编写的旧应用,并且想要使用 spring 来提高应用的功能很多倍。 **i)**您有一个用 Struts 编写的旧应用,并且想要使用 spring 来提高应用的功能很多倍。
**ii)**您确实想根据自己的原因来学习它。 **ii)**您确实想根据自己的原因来学习它。
否则,我不知道为什么有人会在春季选择支柱。 如果您知道其他一些好的理由,请与我们所有人分享。 那挺棒的。 否则,我不知道为什么有人会在Spring选择支柱。 如果您知道其他一些好的理由,请与我们所有人分享。 那挺棒的。
继续,在本教程中,我将**委托从 Struts 到 Spring** 进行动作管理。 进行委派的原因是,通过 Spring 上下文实例化 Action 类时,它可以使用 spring 在其自己的 MVC 实现中为其提供的 Controller 类的所有其他功能。 因此,您将获得所有 spring 功能以及 struts Action 类,以具有包括 ActionForm 概念在内的控制器逻辑。 继续,在本教程中,我将**委托从 Struts 到 Spring** 进行动作管理。 进行委派的原因是,通过 Spring 上下文实例化 Action 类时,它可以使用 spring 在其自己的 MVC 实现中为其提供的 Controller 类的所有其他功能。 因此,您将获得所有 spring 功能以及 struts Action 类,以具有包括 ActionForm 概念在内的控制器逻辑。
......
...@@ -238,11 +238,11 @@ ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor ...@@ -238,11 +238,11 @@ ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor
仍然有实力阅读更多。 在此处浏览更多 Java 面试问题。 仍然有实力阅读更多。 在此处浏览更多 Java 面试问题。
## 4.春季面试题 ## 4.Spring面试题
#### 4.1 [春季核心面试问题](https://howtodoinjava.com/interview-questions/top-spring-core-interview-questions-with-answers/) #### 4.1 [Spring核心面试问题](https://howtodoinjava.com/interview-questions/top-spring-core-interview-questions-with-answers/)
我已经尝试收集一些春季热门核心面试问题,您将在下次技术面试中面对这些问题,例如 我已经尝试收集一些Spring热门核心面试问题,您将在下次技术面试中面对这些问题,例如
* 什么是控制反转(IoC)和依赖注入(DI)? * 什么是控制反转(IoC)和依赖注入(DI)?
* BeanFactory 和 ApplicationContext 之间的区别? * BeanFactory 和 ApplicationContext 之间的区别?
...@@ -255,7 +255,7 @@ ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor ...@@ -255,7 +255,7 @@ ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor
* 构造函数注入和设置器注入之间的区别? * 构造函数注入和设置器注入之间的区别?
* 命名 Spring 框架中使用的一些设计模式? * 命名 Spring 框架中使用的一些设计模式?
#### 4.2 [春季 AOP 面试问题](https://howtodoinjava.com/interview-questions/top-spring-aop-interview-questions-with-answers/) #### 4.2 [Spring AOP 面试问题](https://howtodoinjava.com/interview-questions/top-spring-aop-interview-questions-with-answers/)
Spring **AOP** (面向方面​​的编程)在某种意义上补充了 OOP,因为它也提供了模块化。 在 OOP 中,关键单位是“对象”,但在 AOP 中,关键单位是方面或横切关注点,例如日志记录和安全性。 AOP 提供了一种使用简单的可插拔配置在实际逻辑之前,之后或周围动态添加横切关注点的方法 Spring **AOP** (面向方面​​的编程)在某种意义上补充了 OOP,因为它也提供了模块化。 在 OOP 中,关键单位是“对象”,但在 AOP 中,关键单位是方面或横切关注点,例如日志记录和安全性。 AOP 提供了一种使用简单的可插拔配置在实际逻辑之前,之后或周围动态添加横切关注点的方法
...@@ -263,7 +263,7 @@ Spring **AOP** (面向方面​​的编程)在某种意义上补充了 OOP ...@@ -263,7 +263,7 @@ Spring **AOP** (面向方面​​的编程)在某种意义上补充了 OOP
* 关注点和跨领域关注点之间的区别? * 关注点和跨领域关注点之间的区别?
* 有哪些可用的 AOP 实现? * 有哪些可用的 AOP 实现?
* 春季 AOP 中有哪些不同的建议类型? * Spring AOP 中有哪些不同的建议类型?
* 什么是 Spring AOP 代理? * 什么是 Spring AOP 代理?
* 什么是**接合点****切点** * 什么是**接合点****切点**
* 什么是纵横编织? * 什么是纵横编织?
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/tomcat/running-multiple-instances-of-tomcat-with-single-server-installation/](https://howtodoinjava.com/tomcat/running-multiple-instances-of-tomcat-with-single-server-installation/) > 原文: [https://howtodoinjava.com/tomcat/running-multiple-instances-of-tomcat-with-single-server-installation/](https://howtodoinjava.com/tomcat/running-multiple-instances-of-tomcat-with-single-server-installation/)
很多时候,我们遇到需要修改服务器配置以使其特定于应用的情况。 而且,如果我们有多个这样的应用,并且希望每个应用都具有自己定义的配置选项,那么它就需要某种配置。 在本教程中,我将讨论为每个应用使用**不同的 tomcat 实例而应进行的更改。** 很多时候,我们遇到需要修改服务器配置以使其特定于应用的情况。 而且,如果我们有多个这样的应用,并且希望每个应用都具有自己定义的配置选项,那么它就需要某种配置。 在本教程中,我将讨论为每个应用使用**不同的 tomcat 实例而应进行的更改**
## 配置 Tomcat 服务器的多个实例的步骤 ## 配置 Tomcat 服务器的多个实例的步骤
...@@ -10,23 +10,23 @@ ...@@ -10,23 +10,23 @@
## 步骤 1)安装 Tomcat 服务器 ## 步骤 1)安装 Tomcat 服务器
这是非常明显的第一步。 假设我们的 tomcat 安装目录为“ **C:/ tomcatServer** ”。 这是非常明显的第一步。 假设我们的 tomcat 安装目录为“`C:/tomcatServer`”。
## 步骤 2)在不同位置创建 2 个新的不同文件夹 ## 步骤 2)在不同位置创建 2 个新的不同文件夹
这些文件夹用于存储实例特定的配置和其他数据,例如日志,临时数据。 这些文件夹用于存储实例特定的配置和其他数据,例如日志,临时数据。
假设新文件夹为“ **C:/ tomcatInstanceOne** ”和“ **C:/ tomcatInstanceTwo** ”。 假设新文件夹为“`C:/tomcatInstanceOne`”和“`C:/tomcatInstanceTwo`”。
## 步骤 3)将“ conf”文件夹从服务器文件夹复制到 instances 文件夹 ## 步骤 3)将“`conf`”文件夹从服务器文件夹复制到实例文件夹
为了使每个实例具有不同的配置,必须执行此步骤。 任何与实例特定的配置相关的更改应仅在相关实例文件夹中进行。 为了使每个实例具有不同的配置,必须执行此步骤。 任何与实例特定的配置相关的更改应仅在相关实例文件夹中进行。
## 步骤 4)创建实例特定的 startup.bat 和 shutdown.bat ## 步骤 4)创建实例特定的`startup.bat`和`shutdown.bat`
启动和关闭特定实例将需要这些文件。 文件内容如下: 启动和关闭特定实例将需要这些文件。 文件内容如下:
#### 启动.bat #### `startup.bat`
```java ```java
...@@ -36,7 +36,7 @@ C:\tomcatServer\bin\startup.bat ...@@ -36,7 +36,7 @@ C:\tomcatServer\bin\startup.bat
``` ```
#### 关机 #### `shutdown.bat`
```java ```java
...@@ -46,19 +46,19 @@ C:\tomcatServer\bin\shutdown.bat ...@@ -46,19 +46,19 @@ C:\tomcatServer\bin\shutdown.bat
``` ```
将两个文件都放在两个实例特定文件夹内的“ **bin** ”文件夹中。 [ ***例如,创建文件夹 C:/ tomcatInstanceOne / bin 并复制两个文件*** ] 将两个文件都放在两个实例特定文件夹内的“`bin`”文件夹中。 例如,创建文件夹`C:/tomcatInstanceOne/bin`并复制两个文件
The first properties (**CATALINA_HOME**) points to the location of the common information shareable between all running instances, while the other property (**CATALINA_BASE**) points to the directory where all the instance specific information are stored. 第一个属性(`CATALINA_HOME`)指向所有正在运行的实例之间可共享的公共信息的位置,而其他属性(`CATALINA_BASE`)指向所有实例特定信息的存储目录。
## 步骤 5)创建 setenv.bat 以设置实例特定的环境配置 ## 步骤 5)创建`setenv.bat`以设置实例特定的环境配置
在“ **C:\ tomcatInstanceOne \ bin** ”(以及第二个实例文件夹)目录中创建一个名为 setenv.bat 的文件,以设置 **C:\ tomcatServer \ bin \中提到的任何环境变量。 catalina.bat** 。 在这里设置系统属性,JPDA 地址等。 在“`C:\tomcatInstanceOne\bin`”(以及第二个实例文件夹)目录中创建一个名为`setenv.bat`的文件,以设置`C:\tomcatServer\bin\catalina.bat`中提到的任何环境变量。 在这里设置系统属性,JPDA 地址等。
## 步骤 6)为日志,温度等创建更多文件夹 ## 步骤 6)为日志,临时文件等创建更多文件夹
现在是时候创建更多文件夹了,这些文件夹将在您的应用实际运行时使用。 这些文件夹类似于日志,临时文件,Web 应用和工作文件夹。 在两个实例文件夹中分别创建它们。 现在是时候创建更多文件夹了,这些文件夹将在您的应用实际运行时使用。 这些文件夹类似于日志,临时文件,Web 应用和工作文件夹。 在两个实例文件夹中分别创建它们。
Just be sure to edit your **conf\server.xml** file so that the shutdown ports and HTTP connector ports don’t interfere with other tomcat instances that may be running. 只需确保编辑`conf\server.xml`文件,以使关闭端口和 HTTP 连接器端口不会干扰其他可能正在运行的 tomcat 实例。
例如,更改 tomcat 将要运行/调试的端口。 例如,更改 tomcat 将要运行/调试的端口。
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
当您想在由于某些原因无法安装实际 tomcat 的开发人员的机器上测试应用时,此功能非常有用。 当您想在由于某些原因无法安装实际 tomcat 的开发人员的机器上测试应用时,此功能非常有用。
Plugin’s latest version is `2.2`. It has Apache Tomcat7 support. 插件的最新版本是“2.2”。 它具有 Apache Tomcat7 支持。
## 如何添加 tomcat Maven 插件 ## 如何添加 tomcat Maven 插件
......
# 春季,Tomcat – 在负载均衡器后面获取真实 IP # Spring,Tomcat – 在负载均衡器后面获取真实 IP
> 原文: [https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/](https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/) > 原文: [https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/](https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/)
...@@ -9,9 +9,9 @@ String httpServletAddress = request.getRemoteAddr(); ...@@ -9,9 +9,9 @@ String httpServletAddress = request.getRemoteAddr();
``` ```
但是,如果您的应用在负载均衡器代理后面运行,并且您希望转换用户使用的真实请求 IP 而不是我们的应用实例收到请求时来自代理的 IP,那么上述语句即可获取 IP 仅衡器代理的地址。 但是,如果您的应用在负载均衡器代理后面运行,并且您希望转换用户使用的真实请求 IP 而不是我们的应用实例收到请求时来自代理的 IP,那么上述语句即可获取 IP 仅衡器代理的地址。
## 使用 Tomcat 的 RemoteIpFilter ## 使用 Tomcat 的`RemoteIpFilter`
在上述情况下,可以使用 tomcat 提供的[`RemoteIpFilter`](https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/filters/RemoteIpFilter.html) servlet 过滤器。 在上述情况下,可以使用 tomcat 提供的[`RemoteIpFilter`](https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/filters/RemoteIpFilter.html) servlet 过滤器。
...@@ -28,7 +28,7 @@ public class WebConfiguration { ...@@ -28,7 +28,7 @@ public class WebConfiguration {
``` ```
或使用 XML 配置,例如 web.xml – 使用`filter`标签。 或使用 XML 配置,例如`web.xml` – 使用`filter`标签。
```java ```java
<filter> <filter>
...@@ -48,10 +48,10 @@ public class WebConfiguration { ...@@ -48,10 +48,10 @@ public class WebConfiguration {
现在,当您使用`request.remoteAddr()`方法时,您将获得呼叫客户端的正确 IP 地址。 现在,当您使用`request.remoteAddr()`方法时,您将获得呼叫客户端的正确 IP 地址。
Read More: [RemoteIpFilter](https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/filters/RemoteIpFilter.html) 阅读更多:[`RemoteIpFilter`](https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/filters/RemoteIpFilter.html)
`RemoteIpFilter`在内部集成了`X-Forwarded-For``X-Forwarded-Proto` HTTP 标头。 `RemoteIpFilter`在内部集成了`X-Forwarded-For``X-Forwarded-Proto` HTTP 标头。
该 Servlet 过滤器的另一个功能是通过请求标头(例如“ X-Forwarded-Proto”),用代理或负载均衡器提供的方案替换表观方案(http / https)和服务器端口。 该 Servlet 过滤器的另一个功能是通过请求标头(例如“`X-Forwarded-Proto`”),用代理或负载均衡器提供的方案替换表观方案(http / https)和服务器端口。
学习愉快! 学习愉快!
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/tomcat/a-birds-eye-view-on-how-web-servers-work/](https://howtodoinjava.com/tomcat/a-birds-eye-view-on-how-web-servers-work/) > 原文: [https://howtodoinjava.com/tomcat/a-birds-eye-view-on-how-web-servers-work/](https://howtodoinjava.com/tomcat/a-birds-eye-view-on-how-web-servers-work/)
许多时候,我们想知道 **Web 容器/ Web 服务器(例如 tomcat 或 jboss)如何工作?** 他们如何处理来自世界各地的传入 HTTP 请求? 幕后发生的原因是什么? Java Servlet API(例如 ServletContext,ServletRequest,ServletResponse 和 Session 之类的类)如何适应图片? 这些是非常重要的问题/概念,如果您是 Web 应用开发人员或渴望成为,则必须知道。 在这篇文章中,我将尝试找出上述问题的答案,即使不是全部。 从这里保持集中。 许多时候,我们想知道 **Web 容器 / Web 服务器(例如 tomcat 或 jboss)如何工作?** 他们如何处理来自世界各地的传入 HTTP 请求? 幕后发生的原因是什么? Java Servlet API(例如`ServletContext``ServletRequest``ServletResponse``Session`之类的类)如何适应图片? 这些是非常重要的问题/概念,如果您是 Web 应用开发人员或渴望成为,则必须知道。 在这篇文章中,我将尝试找出上述问题的答案,即使不是全部。 从这里保持集中。
```java ```java
Table of Contents: Table of Contents:
...@@ -19,31 +19,31 @@ How thread safety should be ensured? ...@@ -19,31 +19,31 @@ How thread safety should be ensured?
我将首先讨论 **Web 服务器**和应用服务器。 我说一句 我将首先讨论 **Web 服务器**和应用服务器。 我说一句
Historically they were different, but these two previously distinct categories slowly merged, and now should be seen as one entity in most of the cases and uses. 从历史上看,它们是不同的,但是这两个以前截然不同的类别逐渐合并,现在在大多数情况和用途中应被视为一个实体。
[**Mosaic**](https://en.wikipedia.org/wiki/Mosaic_%28web_browser%29 "Mosaic") 浏览器(通常被称为第一个图形化 Web 浏览器)和超链接内容的早期,出现了一种新概念“ Web 服务器”,用于服务静态网页内容 [**HTTP**](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol "http") 协议上的图像。 很简单。 如今,大多数内容都是静态的,HTTP 1.0 协议只是一种随身携带文件的方式。 但是很快,Web 服务器就发展为具有 [**CGI**](http://www.invir.com/int-prog-cgi.html "cgi") 功能。 这意味着在每个 Web 请求上有效启动一个流程以生成动态内容。 到那时,HTTP 协议也已经成熟,Web 服务器变得更加复杂,并具有诸如缓存,安全性和会话管理之类的附加功能。 随着技术的进一步成熟,我们从 Kiva 和 [**NetDynamics**](https://en.wikipedia.org/wiki/NetDynamics_Application_Server) 中获得了基于公司的基于 Java 的服务器端技术,最终它们全部合并为 JSP(java 服务器页面), 在当今大多数应用开发中使用。 [**Mosaic**](https://en.wikipedia.org/wiki/Mosaic_%28web_browser%29 "Mosaic") 浏览器(通常被称为第一个图形化 Web 浏览器)和超链接内容的早期,出现了一种新概念“Web 服务器”,用于服务静态网页内容[**HTTP**](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol "http") 协议上的图像。 很简单。 如今,大多数内容都是静态的,HTTP 1.0 协议只是一种随身携带文件的方式。 但是很快,Web 服务器就发展为具有 [**CGI**](http://www.invir.com/int-prog-cgi.html "cgi") 功能。 这意味着在每个 Web 请求上有效启动一个流程以生成动态内容。 到那时,HTTP 协议也已经成熟,Web 服务器变得更加复杂,并具有诸如缓存,安全性和会话管理之类的附加功能。 随着技术的进一步成熟,我们从 Kiva 和 [**NetDynamics**](https://en.wikipedia.org/wiki/NetDynamics_Application_Server) 中获得了基于公司的基于 Java 的服务器端技术,最终它们全部合并为 JSP(java 服务器页面), 在当今大多数应用开发中使用。
![web server application server](img/05bc1ad5a4f3b2a157a34589c114d54b.png) ![web server application server](img/05bc1ad5a4f3b2a157a34589c114d54b.png)
这是关于网络服务器的。 现在,我们来讨论**应用服务器** 这是关于网络服务器的。 现在,我们来讨论**应用服务器**
在并行类别中,应用服务器已经发展并存在了很长时间。 一些公司为 Unix 提供了诸如 [**Tuxedo**](https://en.wikipedia.org/wiki/Tuxedo_%28software%29 "Tuxedo") (面向事务的中间件), **TopEnd****Encina** 等产品,这些产品从大型机应用管理中衍生而来 和监视环境,例如 IMS 和 CICS。 这些产品大多数都指定了“封闭式”产品特定的通信协议,以将“胖”客户端互连到服务器。 在 90 年代,这些传统的应用服务器产品首先通过网关开始嵌入基本的 HTTP 通信功能。 很快,这两类之间的界限开始模糊。 在并行类别中,应用服务器已经发展并存在了很长时间。 一些公司为 Unix 提供了诸如 [**Tuxedo**](https://en.wikipedia.org/wiki/Tuxedo_%28software%29 "Tuxedo")(面向事务的中间件),**TopEnd****Encina** 等产品,这些产品从大型机应用管理中衍生而来 和监视环境,例如 IMS 和 CICS。 这些产品大多数都指定了“封闭式”产品特定的通信协议,以将“胖”客户端互连到服务器。 在 90 年代,这些传统的应用服务器产品首先通过网关开始嵌入基本的 HTTP 通信功能。 很快,这两类之间的界限开始模糊。
到那时,Web 服务器在处理更高的负载,更多的并发和更好的功能方面变得越来越成熟。 应用服务器开始提供越来越多的基于 HTTP 的通信功能。 所有这些都导致 Web 服务器和应用服务器之间的界限很窄。 到那时,Web 服务器在处理更高的负载,更多的并发和更好的功能方面变得越来越成熟。 应用服务器开始提供越来越多的基于 HTTP 的通信功能。 所有这些都导致 Web 服务器和应用服务器之间的界限很窄。
在这一点上,“应用服务器”和“网络服务器”之间的界线是模糊的。 但是,作为重点,人们继续使用不同的术语。 在这一点上,“应用服务器”和“网络服务器”之间的界线是模糊的。 但是,作为重点,人们继续使用不同的术语。
When someone says “web server” you often think HTTP-centric, web UI oriented applications. When someone says “Application server” you may think “heavier loads, enterprise features, transactions and queuing, multi-channel communication (HTTP + more)”. But mostly it is the same product that serves both sets of requirements now-a-days. 当有人说“Web 服务器”时,您通常会想到以 HTTP 为中心,面向 Web UI 的应用。 当有人说“应用服务器”时,您可能会认为“负载较重,企业功能,事务和排队,多通道通信(HTTP 及其他)”。 但是大多数情况下,这是同一款产品,如今可以同时满足这两种要求。
这就是有关 Web 服务器和应用服务器的一切。 现在进入第三学期,即网络容器。 这就是有关 Web 服务器和应用服务器的一切。 现在进入第三个术语,即网络容器。
![web server servlet container](img/c1f4d661c48b66f7c54aff95ede27403.png) ![web server servlet container](img/c1f4d661c48b66f7c54aff95ede27403.png)
[**Web 容器**](https://en.wikipedia.org/wiki/Web_container) ,尤其是 java 中的,应引用 servlet 容器。 Servlet 容器是与 Java Servlet 交互的 Web 服务器的组件。 Web 容器负责管理 Servlet 的生命周期,将 URL 映射到特定的 Servlet,并确保 URL 请求者具有正确的访问权限以及更多此类服务。 基本上,综合以上所有事实, **Servlet 容器是 Servlet 运行**并维持其生命周期的运行时环境。 [**Web 容器**](https://en.wikipedia.org/wiki/Web_container),尤其是 java 中的,应引用 servlet 容器。 Servlet 容器是与 Java Servlet 交互的 Web 服务器的组件。 Web 容器负责管理 Servlet 的生命周期,将 URL 映射到特定的 Servlet,并确保 URL 请求者具有正确的访问权限以及更多此类服务。 基本上,综合以上所有事实, **Servlet 容器是 Servlet 运行**并维持其生命周期的运行时环境。
## 什么是 Servlet? 他们如何提供帮助? ## 什么是 Servlet? 他们如何提供帮助?
在 Java 中, **servlet 使您可以编写服务器端组件,以根据请求帮助生成动态内容**。 实际上,Servlet 是在 javax.servlet 包中定义的接口。 它声明了 Servlet 生命周期的三种基本方法 -init(),service()和 destroy()。 它们由每个 servlet(在 SDK 中定义或由用户定义)实现,并在服务器的生命周期中由服务器在特定时间调用。 在 Java 中,**servlet 使您可以编写服务器端组件,以根据请求帮助生成动态内容**。 实际上,Servlet 是在`javax.servlet`包中定义的接口。 它声明了 Servlet 生命周期的三种基本方法 - `init()``service()``destroy()`。 它们由每个 servlet(在 SDK 中定义或由用户定义)实现,并在服务器的生命周期中由服务器在特定时间调用。
Servlet 类由其类加载器通过**延迟加载或急切加载**动态地加载到容器中。 **每个请求都在其自己的线程**中,并且 servlet 对象可以同时服务多个线程。 当不再使用它时,它将被 JVM 垃圾回收。 Servlet 类由其类加载器通过**延迟加载或急切加载**动态地加载到容器中。 **每个请求都在其自己的线程**中,并且 servlet 对象可以同时服务多个线程。 当不再使用它时,它将被 JVM 垃圾回收。
...@@ -55,25 +55,25 @@ Servlet 类由其类加载器通过**延迟加载或急切加载**动态地加 ...@@ -55,25 +55,25 @@ Servlet 类由其类加载器通过**延迟加载或急切加载**动态地加
![Eagerly Loaded Servlet1](img/e917129361e32f00d214586083a50705.png) ![Eagerly Loaded Servlet](img/e034256511cf921b395c7f9f60892c0a.png) ![Eagerly Loaded Servlet1](img/e917129361e32f00d214586083a50705.png) ![Eagerly Loaded Servlet](img/e034256511cf921b395c7f9f60892c0a.png)
## 什么是 ServletContext? 谁创造的? ## 什么是`ServletContext`? 谁创造的?
当 Servlet 容器启动时,它将部署并加载所有 Web 应用。 加载 Web 应用后,Servlet 容器将为每个应用创建一次 **ServletContext,并将其保留在服务器的内存中。 该 Web 应用的 web.xml 将被解析,并且在 web.xml 中找到的每个 Servlet,Filter 和 Listener 都将被创建一次并保存在服务器的内存中。 当 Servlet 容器关闭时,它将卸载所有 Web 应用,并且 ServletContext 以及所有 Servlet,Filter 和 Listener 实例都将被丢弃。** 当 Servlet 容器启动时,它将部署并加载所有 Web 应用。 加载 Web 应用后,Servlet 容器将为每个应用创建一次` ServletContext`,并将其保留在服务器的内存中。 该 Web 应用的`web.xml`将被解析,并且在`web.xml`中找到的每个 Servlet,过滤器和监听器都将被创建一次并保存在服务器的内存中。 当 Servlet 容器关闭时,它将卸载所有 Web 应用,并且`ServletContext`以及所有 Servlet,过滤器和监听器实例都将被丢弃。
根据 Java 文档, **ServletContext 定义了 Servlet 用于与其 Servlet 容器**通信的一组方法,例如,获取文件的 MIME 类型,调度请求或写入日志文件。 对于 Web 应用**在其部署描述符**中标记为“已分发”的情况,每个虚拟机都有一个上下文实例。 在这种情况下,上下文**不能用作共享全局信息**的位置(因为该信息不是真正的全局信息)。 请改用外部资源,例如数据库。 根据 Java 文档, `ServletContext`定义了 Servlet 用于与其 Servlet 容器通信的一组方法,例如,获取文件的 MIME 类型,调度请求或写入日志文件。 对于 Web 应用**在其部署描述符**中标记为“已分发”的情况,每个虚拟机都有一个上下文实例。 在这种情况下,上下文**不能用作共享全局信息**的位置(因为该信息不是真正的全局信息)。 请改用外部资源,例如数据库。
## ServletRequest 和 ServletResponse 适合生命周期的地方? ## `ServletRequest`和`ServletResponse`适合生命周期的地方?
Servlet 容器连接到 Web 服务器,该服务器在特定端口号(通常为 80)上监听 HTTP 请求。当客户端(具有 Web 浏览器的用户)发送 HTTP 请求时, **Servlet 容器将创建新的 HttpServletRequest。** **和 HttpServletResponse** 对象将其传递给 URL 样式与请求 URL 匹配的已创建 Filter 和 Servlet 实例的方法,所有这些都在同一线程中。 Servlet 容器连接到 Web 服务器,该服务器在特定端口号(通常为 80)上监听 HTTP 请求。当客户端(具有 Web 浏览器的用户)发送 HTTP 请求时, Servlet 容器将创建新的`HttpServletRequest``HttpServletResponse`对象将其传递给 URL 样式与请求 URL 匹配的已创建过滤器和 Servlet 实例的方法,所有这些都在同一线程中。
请求对象提供对 HTTP 请求的所有信息的访问,例如请求标头和请求正文。 响应对象提供了以所需方式控制和发送 HTTP 响应的功能,例如设置标头和正文(通常带有 JSP 文件中的 HTML 内容)。 提交并完成 HTTP 响应后,请求和响应对象都将被丢弃。 请求对象提供对 HTTP 请求的所有信息的访问,例如请求标头和请求正文。 响应对象提供了以所需方式控制和发送 HTTP 响应的功能,例如设置标头和正文(通常带有 JSP 文件中的 HTML 内容)。 提交并完成 HTTP 响应后,请求和响应对象都将被丢弃。
## 如何管理会话? 知道 cookie 吗? ## 如何管理会话? 知道 cookie 吗?
当客户端首次访问 Web 应用和/或要通过 request.getSession()首次获取 HttpSession 时,则 Servlet 容器将创建它,并生成一个长而唯一的 ID(您可以 通过 session.getId()获取并存储在服务器的内存中。 servlet 容器还将在 HTTP 响应中设置 Cookie,其中 **JSESSIONID** 为 cookie 名称,唯一会话 ID 为 cookie 值。 当客户端首次访问 Web 应用和/或要通过`request.getSession()`首次获取`HttpSession`时,则 Servlet 容器将创建它,并生成一个长而唯一的 ID(您可以通过`session.getId()`获取并存储在服务器的内存中。 servlet 容器还将在 HTTP 响应中设置 Cookie,其中`JSESSIONID`为 cookie 名称,唯一会话 ID 为 cookie 值。
根据 [**HTTP cookie 规范**](http://www.faqs.org/rfcs/rfc2965.html "http cookie") (体面的 Web 浏览器和 Web 服务器必须遵守的合同),要求客户端(Web 浏览器)在后续请求中将该 Cookie 发送回 只要 Cookie 有效即可。 Servlet 容器将确定每个传入的 HTTP 请求标头中是否存在名为 JSESSIONID 的 cookie,并使用其值从服务器的内存中获取关联的 HttpSession 根据 [**HTTP cookie 规范**](http://www.faqs.org/rfcs/rfc2965.html "http cookie")(体面的 Web 浏览器和 Web 服务器必须遵守的合同),要求客户端(Web 浏览器)在后续请求中将该 Cookie 发送回 只要 Cookie 有效即可。 Servlet 容器将确定每个传入的 HTTP 请求标头中是否存在名为`JSESSIONID`的 cookie,并使用其值从服务器的内存中获取关联的`HttpSession`
HttpSession 会一直存在,直到没有被使用为止,您可以在 web.xml 中指定该设置,该设置**默认为 30 分钟**。 因此,如果客户端超过 30 分钟不再访问该 Web 应用,则 Servlet 容器将破坏该会话。 即使指定了 cookie,每个后续请求都将无法再访问同一会话。 servlet 容器将创建一个新的。 `HttpSession`会一直存在,直到没有被使用为止,您可以在`web.xml`中指定该设置,该设置**默认为 30 分钟**。 因此,如果客户端超过 30 分钟不再访问该 Web 应用,则 Servlet 容器将破坏该会话。 即使指定了 cookie,每个后续请求都将无法再访问同一会话。 servlet 容器将创建一个新的。
**现有会话** **现有会话**
...@@ -83,11 +83,11 @@ HttpSession 会一直存在,直到没有被使用为止,您可以在 web.xml ...@@ -83,11 +83,11 @@ HttpSession 会一直存在,直到没有被使用为止,您可以在 web.xml
![New session](img/adf2d37562aa73ff0230458f2450106e.png) ![New session](img/adf2d37562aa73ff0230458f2450106e.png)
另一方面,客户端上的会话 cookie **具有默认生存期,该生存期只要浏览器实例正在运行**即可。 因此,当客户端关闭浏览器实例(所有选项卡/窗口)时,会话将在客户端被丢弃。 在新的浏览器实例中,与该会话关联的 cookie 将不再发送。 一个新的 request.getSession()将返回一个全新的 HttpSession 并设置一个具有全新会话 ID 的 cookie。 另一方面,客户端上的会话 cookie **具有默认生存期,该生存期只要浏览器实例正在运行**即可。 因此,当客户端关闭浏览器实例(所有选项卡/窗口)时,会话将在客户端被丢弃。 在新的浏览器实例中,与该会话关联的 cookie 将不再发送。 一个新的`request.getSession()`将返回一个全新的`HttpSession`并设置一个具有全新会话 ID 的 cookie。
## 应如何确保线程安全? ## 应如何确保线程安全?
您现在应该已经了解到,Servlet 和过滤器在所有请求之间共享。 这是 Java 的优点,因为它是 [**多线程**](//howtodoinjava.com/category/java/multi-threading/ "multi-threading") ,并且不同的线程(即 HTTP 请求)可以使用同一实例。 否则,在每个请求上重新创建它会太昂贵。 您现在应该已经了解到,Servlet 和过滤器在所有请求之间共享。 这是 Java 的优点,因为它是[**多线程**](//howtodoinjava.com/category/java/multi-threading/ "multi-threading"),并且不同的线程(即 HTTP 请求)可以使用同一实例。 否则,在每个请求上重新创建它会太昂贵。
![thread-safety](img/f3fdaad0cb730dedd690a45f7d2bb4c7.png) ![thread-safety](img/f3fdaad0cb730dedd690a45f7d2bb4c7.png)
......
...@@ -54,7 +54,7 @@ Swagger2 Project Structure ...@@ -54,7 +54,7 @@ Swagger2 Project Structure
将项目解压缩并将其作为现有的 maven 项目导入 Eclipse。 在此步骤中,将从 maven 仓库下载所有必需的依赖项。 在此步骤中执行全新的`mvn clean install`,以便正确下载所有与春季启动相关的工件。 将项目解压缩并将其作为现有的 maven 项目导入 Eclipse。 在此步骤中,将从 maven 仓库下载所有必需的依赖项。 在此步骤中执行全新的`mvn clean install`,以便正确下载所有与Spring启动相关的工件。
2. 打开`application.properties`并添加以下属性。 这将在`/swagger2-demo`上下文路径中启动应用。 2. 打开`application.properties`并添加以下属性。 这将在`/swagger2-demo`上下文路径中启动应用。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册