何謂容器

對於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. Sql Server 查看表修改记录

    可以尝试如下建议:1.可以使用默认的Log工具或者第三方的(比如:LiteSpeed)的工具.2.做Trace机制,下次出现问题可以溯源.3.一个简单的办法: --Step #1: USE DBNam ...

  2. Android 中dp和px

    dp是虚拟像素,在不同的像素密度的设备上会自动适配,比如: 在320x480分辨率,像素密度为160,1dp=1px 在480x800分辨率,像素密度为240,1dp=1.5px 计算公式: 1dp* ...

  3. Enterprise Architect 学习 之 用例图

    用例模型 用例模型用来记录系统的需求,它提供系统与用户及其他参与者的一种通信手段. 执行者 用例图显示了系统和系统外实体之间的交互.这些实体被引用为执行者.执行者代表角色,可以包括:用户,外部硬件和其 ...

  4. std::vector<bool>中的坑

    http://www.cplusplus.com/reference/vector/vector/?kw=vector C++中,vector<bool>为了达到节省内存的目的,专门做了特 ...

  5. query语句的拼接.

    在外网服务器上的网页,不能排序了,原因是query语句拼接时,sort没有能拼上,. 小小的思路: 1.是不是网页请求出了问题: 和我本机上的的请求一一对比,并没有发现什么问题. 2.代码除了问题吗: ...

  6. 关于学习C++编程语言对中国软件发展的的一些思考!

    从2000年UCanCode E-Form++ 图形可视化源码库2.0在国外开始销售以来,弹指一挥间已经快14年了.这14年里见惯了各种新技术的不断涌现.也见惯了各种科技公司的不断出现和消亡,仔细想来 ...

  7. Life of a triangle - NVIDIA's logical pipeline

    Home GameWorks Blog Life of a triangle - NVIDIA's logical pipeline   Life of a triangle - NVIDIA's l ...

  8. 使用自定的Adapter绑定ListView/GridView数据

    使用自定的Adapter绑定ListView/GridView数据(地址) 对于ListView/Gridview的数据绑定, google提供了一些Adapter的模板, 自己也可以自定义一些个性化 ...

  9. collections系列

    一.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 c = Counter('abcdeabcdabcaba') prin ...

  10. iredmail安装脚本分析(三)---conf/global DISTRO值的来源及操作系统的判断

    作者在引入conf/global 文件时,就已经对操作系统的类型进行判断,同时也对DISTRO进行了赋值. 部分代码,如图: 显然文件里的KERNEL_NAME的值就是判断完成的操作系统,具体分析该值 ...