J2EE学习(2)--何謂容器【良葛格学习笔记搬】
何謂容器
當你開始撰寫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)。
一個請求/回應的基本例子是:
- 客戶端(大部份情況下是瀏覽器)對Web伺服器發出HTTP請求。
- Web伺服器收到HTTP請求,將請求轉由Web容器處理,Web容器會剖析HTTP請求內容,建立各種物件(像是HttpServletRequest、HttpServletResponse、HttpSession等)。
- Web容器由請求的URL決定要使用哪個Servlet來處理請求(事先由開發人員定義)。
- Servlet根據請求物件(HttpServletRequest)的資訊決定如何處理,透過回應物件(HttpServletResponse)來建立回應。
- 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容器的功能(當然,也還有其它廠商的實現)。
J2EE学习(2)--何謂容器【良葛格学习笔记搬】的更多相关文章
- Java良葛格 学习笔记
学习一个新的事物时,如果遇到一些概念无法很快理解,这可能是因为要理解概念会需要其它概念先建立起来,所以先暂时放下这个疑问也是一个学习方法,称之为“存疑” ,在以后的学习过程中待必要的概念学会后,目前的 ...
- Java良葛格 学习笔记《二》
正则表达式 . 符合任一字符\d 符合0到9任一个数字字符\D 符合0-9以外的字符\s 符合'\t'.'\n'.'\x0B'.'\f'.'\r'等空格符\w 符合a到z.A到Z.0到9等字符,也就是 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- 跟着刚哥学习Spring框架--Spring容器(二)
Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用. Bean是S ...
- Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory
前言 在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程. 入口 从 ...
- iOS之学习资源收集--很好的IOS技术学习网站
点击图片也能打开相关的网站: https://boxueio.com/skill/swift http://ios.b2mp.cn/ http://gold.xitu.io/welcome/?utm_ ...
- 人工智能深度学习Caffe框架介绍,优秀的深度学习架构
人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...
- 深度学习之PyTorch实战(1)——基础学习及搭建环境
最近在学习PyTorch框架,买了一本<深度学习之PyTorch实战计算机视觉>,从学习开始,小编会整理学习笔记,并博客记录,希望自己好好学完这本书,最后能熟练应用此框架. PyTorch ...
- 根据学习廖雪峰老师的git教程做的笔记
根据学习廖雪峰老师的git教程做的笔记 安装git 进行git的配置 配置您的用户名和邮箱地址,使用--global 这个参数表明了在此台机器上的所有仓库都会使用该配置 $ git config -- ...
随机推荐
- Windows 10 RTM 官方正式版
Windows 10 各版本区别: Windows 10 家庭版:供家庭用户使用Windows 10 专业版:供小型企业使用 在家庭版基础上增加了域账号加入.bitlocker.企业商店等功能Wind ...
- js③
while(true){ console.log('hello'); }/每次执行完语句块之后,又会跳回去检查小括号里面的布尔值,如果为true,那么又会执行语句块一次. //while循环//var ...
- app接口测试-bug分类
前段时间在测试一个项目,任务是测试app的API.总结下遇到的问题类型: 1 通过app提交数据,隐形数据有误.(主要通过验证数据库) 比如用户通过app输入工单提交.接口数据中,用户输入的信息都正确 ...
- Consistent hashing —— 一致性哈希
原文地址:http://www.codeproject.com/Articles/56138/Consistent-hashing 基于BSD License What is libconhash l ...
- JPA 各种基本用法
查询部分属性 通常来说,都是针对 Entity 类的查询,返回的也是被查询的 Entity 类的实体.J P QL 也允许我们直接查询返回我们需要的属性,而不是返回整个 Entity .在一些 Ent ...
- Excel的python读写
实际工作中可能需要整理一些文档,或者记录一些数据,这时候使用python来操作Excel可能会帮得上你. 读操作: # encoding : utf-8 #设置编码方式 import xlrd #导入 ...
- 转载--提高C++性能的编程技术
读书笔记:提高C++性能的编程技术 第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到日志文件中.Trace对象会带来一定的开销,因此在默认情况 ...
- 支持向量机(SVM)——python3实现
今天看完soft-margin SVM就又搜了下相关的代码,最后搜到这个,第一次看懂了SVM的实现. 关于代码中cvxopt的使用,可以看下这个简单的介绍. 这里还是将代码贴在这里,里面加了自己的一下 ...
- BZOJ 2743 树状数组
不能用分块. #include <bits/stdc++.h> using namespace std; ; struct Info{int l,r,Id;}Q[Maxn]; int a[ ...
- C++复数类对除法运算符 / 的重载
C8-1 复数加减乘除 (100.0/100.0 points) 题目描述 求两个复数的加减乘除. 输入描述 第一行两个double类型数,表示第一个复数的实部虚部 第二行两个double类型数,表示 ...