Servlet容器与Web容器详解

简介: Servlet容器与Web容器详解

【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容器)。


41115da965475ae5b3367b6763543763.png

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。


目录
相关文章
|
29天前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
24 1
|
1月前
|
Kubernetes 应用服务中间件 nginx
基于容器化的Web服务器管理
【8月更文第28天】随着云原生技术的发展,容器化已经成为部署和管理应用程序的标准方式之一。Docker 和 Kubernetes 等工具提供了强大的容器管理和编排能力,使得开发者能够轻松地部署、扩展和维护 Web 服务器。本文将详细介绍如何使用 Docker 和 Kubernetes 实现 Web 服务器的容器化部署,并提供详细的步骤和代码示例。
22 1
|
27天前
|
开发者 容器 Docker
JSF与Docker,引领容器化浪潮!让你的Web应用如虎添翼,轻松应对高并发!
【8月更文挑战第31天】在现代Web应用开发中,JSF框架因其实用性和灵活性被广泛应用。随着云计算及微服务架构的兴起,容器化技术变得日益重要,Docker作为该领域的佼佼者,为JSF应用提供了便捷的部署和管理方案。本文通过基础概念讲解及示例代码展示了如何利用Docker容器化JSF应用,帮助开发者实现高效、便携的应用部署。同时也提醒开发者注意JSF与Docker结合使用时可能遇到的限制,并根据实际情况做出合理选择。
28 0
|
29天前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
17 0
|
1月前
|
监控 前端开发 Java
揭秘Web开发神器:Servlet、过滤器、拦截器、监听器如何联手打造无敌博客系统,让你的用户欲罢不能!
【8月更文挑战第24天】在Java Web开发中,Servlet、过滤器(Filter)、拦截器(Interceptor,特指Spring MVC中的)及监听器(Listener)协同工作,实现复杂应用逻辑。以博客系统为例,Servlet处理文章详情请求,过滤器(如LoginFilter)检查登录状态并重定向,Spring MVC拦截器(如LoggingInterceptor)提供细粒度控制(如日志记录),监听器(如SessionListener)监控会话生命周期事件。这些组件共同构建出高效、有序的Web应用程序。
30 0
|
1月前
|
Kubernetes 安全 JavaScript
Docker 与 Podman:探索用于现代 Web 开发的容器技术
在软件开发中,Docker 和 Podman 作为主流容器化技术,各具特色。本文深入对比两者优缺点,探讨其实用场景与部署Web应用的最佳实践。Docker 凭借成熟生态和跨平台能力引领潮流;Podman 以无守护进程架构提升安全与效率。通过具体示例展示如何构建和运行Node.js与Angular应用,帮助读者理解核心命令与配置要点。无论是在开发环境还是生产部署,选择合适的工具能显著增强应用的安全性和稳定性。
124 0
|
1月前
|
移动开发 小程序 前端开发
跨端技术演进问题之Web容器方案在跨端开发中的优势和不足如何解决
跨端技术演进问题之Web容器方案在跨端开发中的优势和不足如何解决
|
3月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
82 10
|
3月前
|
缓存 负载均衡 安全
Servlet与JSP在Java Web应用中的性能调优策略
【6月更文挑战第23天】在Java Web中,Servlet和JSP调优至关重要,以应对高并发和复杂业务带来的性能挑战。优化包括Servlet复用、线程安全、数据库连接池,以及JSP的编译优化、使用JSTL、页面缓存和静态内容分离。全局优化涉及负载均衡、异步处理和缓存策略。通过这些实践,开发者能提升应用响应速度和吞吐量,确保高负载下的稳定运行。
59 7
|
3月前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
48 7