何謂容器

對於Java程式而言,JVM(Java Virtual Machine)是其作業系統,.java編譯為.class檔案,.class對於JVM而言,就是其可執行檔,你的Java程式基本上只認得一種作業系統,就是JVM。

當你開始撰寫Servlet/JSP程式時,你必須開始接觸容器(Container)的概念,容器這個名詞也用在如List、Set這類的Collection上,也就是用來持有、保存物件的群集(Collection)物件,不過,對於撰寫Servlet/JSP來說,容器的概念更為廣泛,在最基本的功能上,它不僅持有物件,還負責物件的生命周期與相關服務的連結。

在具體層面,容器說穿了,其實就是一個用Java寫的程式,運行於JVM之上,不同類型的容器會負責不同的工作,若以Servlet/JSP所運行的Web容器(Web Container)來說,也是一個Java寫的程式,想想看,HTTP那些文字性的通訊協定,如何變成你寫的Servlet/JSP中可用的Java物件(如HttpServletRequest、HttpServletResponse等),其實就是容器為你剖析與轉換。

在抽象層面,可以將Web容器視為你寫的Servlet/JSP的運行伺服器,是的!就如同Java程式僅認得JVM這個作業系統,Servlet/JSP程式在抽象層面上,也僅認得Web容器這個概念上的Web伺服器,只要你寫的Servlet/JSP是符合Web容器的標準規範,你的Servlet/JSP就可以在各種不同廠商實作的Web容器上運行,而不用理會底層真正的Web伺服器。

當然,實際上還是要有個Web伺服器,所以回到實際層面,Web容器是個Java寫的應用程式,可以成為實體Web伺服器程式的一部份,管理Servlet物件的生命週期,提供基於HTTP請求、回應的網路服務。

若以Tomcat為例,容器的角色位置可以用下圖來表示:

就如同JVM介於Java程式與實體作業系統之間,Web容器是介於實體Web伺服器與Servlet之間,也正如你撰寫Java程式必須了解 JVM/JRE與你的應用程式之間如何互動,你撰寫Servlet/JSP也必須知道容器如何與你的Servlet/JSP互動,如何管理Servlet 等事實(JSP最後也是轉譯、編譯、載入為Servlet,在容器的世界中,真正負責請求、回應的是Servlet)。

一個請求/回應的基本例子是:

  1. 客戶端(大部份情況下是瀏覽器)對Web伺服器發出HTTP請求。
  2. Web伺服器收到HTTP請求,將請求轉由Web容器處理,Web容器會剖析HTTP請求內容,建立各種物件(像是HttpServletRequest、HttpServletResponse、HttpSession等)。
  3. Web容器由請求的URL決定要使用哪個Servlet來處理請求(事先由開發人員定義)。
  4. Servlet根據請求物件(HttpServletRequest)的資訊決定如何處理,透過回應物件(HttpServletResponse)來建立回應。
  5. Web容器與Web伺服器溝通,Web伺服器將回應轉換為HTTP回應並傳回客戶端。

不僅是寫Servet/JSP需要理解Web容器,在Java EE的領域無論是哪個技術,都與容器息息相關,寫Servlet/JSP需要理解Web容器,寫EJB需要了解EJB容器,寫應用程式客戶端需要了解應用程式客戶端容器,即使是寫個Applet,也會有個Applet容器的特性需要了解。

下圖是摘自 Java EE 6 Tutorial中 Java EE 6 APIs 文件的容器示意:

對於Java EE 6規範中Servlet 3.0/JSP 2.2等,你可以使用的實際容器可以是Tomcat 7,或者是Glassfish v3,Tomcat 7專注在Web容器的部份,Glassfish v3是個完整的應用程式伺服器,當然也包括了Web容器的功能(當然,也還有其它廠商的實現)。

 
原文请见:http://openhome.cc/Gossip/ServletJSP/

J2EE学习(2)--何謂容器【良葛格学习笔记搬】的更多相关文章

  1. Java良葛格 学习笔记

    学习一个新的事物时,如果遇到一些概念无法很快理解,这可能是因为要理解概念会需要其它概念先建立起来,所以先暂时放下这个疑问也是一个学习方法,称之为“存疑” ,在以后的学习过程中待必要的概念学会后,目前的 ...

  2. Java良葛格 学习笔记《二》

    正则表达式 . 符合任一字符\d 符合0到9任一个数字字符\D 符合0-9以外的字符\s 符合'\t'.'\n'.'\x0B'.'\f'.'\r'等空格符\w 符合a到z.A到Z.0到9等字符,也就是 ...

  3. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  4. 跟着刚哥学习Spring框架--Spring容器(二)

    Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用.  Bean是S ...

  5. Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory

    前言 在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程. 入口 从 ...

  6. iOS之学习资源收集--很好的IOS技术学习网站

    点击图片也能打开相关的网站: https://boxueio.com/skill/swift http://ios.b2mp.cn/ http://gold.xitu.io/welcome/?utm_ ...

  7. 人工智能深度学习Caffe框架介绍,优秀的深度学习架构

    人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...

  8. 深度学习之PyTorch实战(1)——基础学习及搭建环境

    最近在学习PyTorch框架,买了一本<深度学习之PyTorch实战计算机视觉>,从学习开始,小编会整理学习笔记,并博客记录,希望自己好好学完这本书,最后能熟练应用此框架. PyTorch ...

  9. 根据学习廖雪峰老师的git教程做的笔记

    根据学习廖雪峰老师的git教程做的笔记 安装git 进行git的配置 配置您的用户名和邮箱地址,使用--global 这个参数表明了在此台机器上的所有仓库都会使用该配置 $ git config -- ...

随机推荐

  1. Nginx 1.10.2 发布,高性能 Web 服务器

    Nginx 1.10.2 发布了.Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器 更新内容: Changes with n ...

  2. CodeSimth - .Net Framework Data Provider 可能没有安装

    使用CodeSimth 连接SQLite数据库库 提示错误 codesmith 6以上的版本,说是支持sqlite生成,也有对应的sqliteprovider.dll,但是使用时却说Test fail ...

  3. 一个非常有意思的css3属性filter

    filter这属性貌似可以是img图片在黑白与彩色间转换 filter:grayscale(1)为黑白色,filter:grayscale(0)位彩色,可以用于hover效果 img:hover{fi ...

  4. css2----兼容----ie67的3像素bug

    发生条件:当浮动元素和非浮动元素相邻 时候,ie67下,两个元素就会多出3像素的间隔,其实是浮动元素产生的margin值 解决办法:1:让没有浮动的元素也浮动: 2:让浮动元素产生margin-*:- ...

  5. 数据导出到excel

    jsp页面: 数据table: <form action="/export.jsp" method="post" id="expform&quo ...

  6. 六大免费网站数据采集器对比(火车头,海纳,云采集,ET,三人行,狂人采集)

    2013年02月27日 PHP开源系统 暂无评论 阅读 497 views 次 在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,云采集,ET,三人行 ...

  7. C#语言Winform防SQl注入做用户登录的例子

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  8. 未能加载文件或程序集“XXX”或它的某一个依赖项。参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))

    移除引用,并删除packagede的引用文件.重新导入引用文件和引用~ 如果是电脑异常死机后报这错误, 解决方法 是 删除 C:\WINDOWS\Microsoft.NET\Framework\v4. ...

  9. Java—从文件中读取数据

    1.FileInputStream() // 构建字节输入流对象,参数为文件名 FileInputStream fin = new FileInputStream("message" ...

  10. a* products

    Experience of black-box testing on set-top-boxes/IP-connected devices, games consoles and tablets ht ...