Servlet、Servlet容器、web容器、spring容器、springmvc容器
Servlet技术
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。
Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建,它是 Java 企业版的标准组成部分,Java 企业版是支持大型开发项目的 Java 类库的扩展版本。
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
根据类图我们可以看到Spring的DispatcherServlet 实际实现了HttpServlet

Web 服务器
Web 服务器使用 HTTP 协议传输数据。在一般情况下,用户在浏览器(客户端)中键入 URL(例如www.baidu.com),并获取要读取的网页。所以服务器所做的就是向客户机发送一个网页。信息的交换采用指定请求和响应消息的格式的 HTTP 协议。
!(https://img-blog.csdnimg.cn/img_convert/ba16a183d3143e0d4224c290bbc81fc5.png)
普遍意义上我们可以“HTTP服务器 + Servlet容器”,我们也叫它们Web容器。
Servlet容器
什么是 Servlet 容器
Servlet 容器的基本思想是使用 Java 动态生成服务器端的网页。所以 Servlet 容器本质上是与 Servlet 交互的 Web 服务器的一部分。

Servlet容器负责管理Servlet对象,WebServer接受到请求后转发到Servlet容器来处理请求,Servlet 容器的主要功能是将请求转发到正确的 Servlet 进行处理,并在 JVM 处理完后将动态生成的结果返回到正确的位置:

常见的Servlet容器
- WEB LOGIC
- TOMCAT(Tomcat本质上是一个 Servlet 容器,实现了对 Java Servlet 规范的支持。同时 Tomcat 也提供了处理HTTP请求的能力,所以也可以作为一个Web服务器)
- JETTY
- JBOSS
- Resin
- WebSphere
Spring容器

本质上Spring容器我们可以看做一个Servlet容器
配置
<!-- 利用Spring提供的ContextLoaderListener监听器去监听ServletContext对象的创建,并初始化WebApplicationContext对象 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Context Configuration locations for Spring XML files(默认查找/WEB-INF/applicationContext.xml) -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置Spring MVC的前端控制器:DispatchcerServlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
————————————————
版权声明:本文为CSDN博主「书呆子Rico」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/justloveyou_/article/details/74295728
一般在web.xml中,我们会配置ContextLoaderListener&DispatcherServlet,进而加载Spring容器。
ContextLoaderListener
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
public ContextLoaderListener() {
}
public ContextLoaderListener(WebApplicationContext context) {
super(context);
}
@Override
public void contextInitialized(ServletContextEvent event) {
initWebApplicationContext(event.getServletContext());
}
public void contextDestroyed(ServletContextEvent event) {
closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
}
}
我们可以看到ContextLoaderListener主要用来初始化对应的WebApplicationContext,在initWebApplicationContext方法中会启动根容器,即我们平时说的Spring容器WebApplicationContext。
WebApplicationContext是一个接口类,确切的说,其实际的实现类是XmlWebApplicationContext,它就是spring的IoC容器,其对应的Bean定义的配置由web.xml中的标签指定。
SpringMVC的容器
如上,在web.xml我们加载完WebApplicationContext后,会加载DispatcherServlet。
DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有spring mvc相关的bean。特别地,在建立DispatcherServlet自己的IoC上下文前,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初始化自己持有的上下文。
ContextLoaderListener中创建ApplicationContext主要用于整个Web应用程序需要共享的一些组件,比如DAO,数据库的ConnectionFactory等。而 由DispatcherServlet创建的ApplicationContext主要用于和该Servlet相关的一些组件,比如Controller、ViewResovler等。
这个也可以看做spring容器、springmvc容器的区别
总结
大概总结下整体的架构图,包括和tomcat相关的架构图,如下:

参考
https://dzone.com/articles/what-servlet-container
https://blog.csdn.net/justloveyou_/article/details/74295728
1812

被折叠的 条评论
为什么被折叠?



