Servlet容器与Web容器详解

本文介绍了容器的概念,包括Web容器和应用服务器的区别,并详细解析了ServletContext的作用及其实现原理。同时,文章还探讨了Spring环境下的IOC容器初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【1】容器

所谓容器(服务器、中间件等),就是提供一些底层的、业务无关的基本功能,为真正的Servlet提供服务。简单来说:容器负责根据请求的信息找到对应的Servlet,传递Request和Response参数,调用Servlet的service方法,完成请求的响应。

Servlet规范定义了一个API标准,这一标准的实现通常称为Servlet容器,比如开源的Tomcat、JBoss。

Web容器更准确的说应该叫web服务器,它是来管理和部署 web应用的。Web容器最典型的就是tomcat了,Tomcat是web容 器也是servlet容器。

还有一种服务器叫做应用服务器,它的功能比web服务器要强大的多,因为它可以部署EJB应用,可以实现容器管理的事务,一般的应用服务器 有weblogic和websphere等,它们都是商业服务器,功能强大但都是收费的。

【2】ServletContext

JavaEE标准规定了,servlet容器需要在应用项目启动时,给应用项目初始化一个ServletContext作为公共环境容器存放公共信息。

ServletContext 是Servlet与Servlet容器之间直接通信的接口,Servlet容器在启动一个web应用时,会为它创建一个ServletContext对象。

每个web应用有唯一的ServletContext对象,同一个web应用的所有Servlet对象共享一个 ServletContext,Servlet对象可以通过它来访问容器中的各种资源

在应用程序中能够获取运行环境或容器信息的对象通常称之为"上下文对象"。ServletContext中的信息都是由Web容器提供的,通常是配置web.xml,其执行流程如下所示。

web.xml在<context-param></context-param>标签中声明应用范围内的初始化参数。

  • ① 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:<listener></listener> 和 <context-param></context-param>

  • ② 紧接着,容器创建一个ServletContext(上下文),在该应用内全局共享。

  • ③ 容器将<context-param></context-param>转化为键值对,并交给ServletContext.

  • ④ 容器创建<listener></listener>中的类实例,即创建监听。该监听器必须实现自ServletContextListener接口。

  • ⑤ 在监听中会有contextInitialized(ServletContextEvent event)初始化方法 在这个方法中获得这个context-param的值之后,你就可以做一些操作了。

    ServletContext = ServletContextEvent.getServletContext();
    
    contextParamValue = ServletContext.getInitParameter("context-param的键");
    

注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行。

web.xml中可以定义两种参数:

  • 一个是全局参数(ServletContext),通过<context-param></context-param>配置;

  • 一个是servlet参数,通过在servlet中声明:

     <init-param>
    	 <param-name>param1</param-name> 
    	 <param-value>avalible in servlet init()</param-value>
     </init-param>
    

其中第一种参数在servlet里面可以通过ServletContext得到:

String contextParamVale= getServletContext().getInitParameter("context-param")

第二种参数有两种取值方式:

  • ① 在servlet的init()方法中通过this.getInitParameter("param1")取得

  • ② 使用ServletConfig:

    ServletConfig config = getServletConfig();
    String paramValue=config.getInitParameter("paramName");
    

【3】Spring环境下IOC容器

spring环境下通常会配置如下监听:

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

① Web容器启动,为应用创建一个“全局上下文环境”:ServletContext(即,ApplicationContext);

② 容器调用web.xml中配置的ContextLoaderListener(如果配置了该监听),根据ServletContext和context-param指定的配置文件信息(application.xml)初始化WebApplicationContext上下文环境(即IOC容器)。

这里写图片描述

WebApplicationContext在ServletContext中以键值对的形式保存;

键–WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;

值–webApplicationContext。

③ 容器初始化web.xml中配置的servlet(<load-on-startup>1</load-on-startup>),为其初始化自己的servletConfig(拥有对ServletContext的引用),并加载其设置的参数信息到该实例中。

获取初始化参数示例如下:

ServletConfig config = getServletConfig();
String paramValue=config.getInitParameter("paramName");

④ 此后的所有servlet(<load-on-startup>1</load-on-startup>)的初始化都按照3步中方式创建,初始化自己的上下文环境。

当Spring在执行ApplicationContext的getBean时,如果在自己context中找不到对应的bean,则会在父ApplicationContext中去找。
这也解释了为什么我们可以在DispatcherServlet中获取到由ContextLoaderListener对应的ApplicationContext中的bean。

更多详情参考博文:Spring、SpringMVC和SpringBoot框架中那些容器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值