Java EE的设计者把基础平台分成了若干层,同样,应用的开发者也可以按照特定的功能把应用逻辑分成多个层次。目前为止,Java EE的设计者们已经很好地实现了这些基础结构,包括安全性、数据访问、事务处理、命名、资源定位,服务器端和客户端互连的网络通信核心等,所以我们自己没有必要再去实现它们。Java EE为此提供了一套接口,允许把应用逻辑插入到基础平台中来访问这些服务。
容器的作用,就像视频游戏机上插的那种游戏卡一样。如图1ˉ6所示,游戏机上有一个游戏接口,用户可以通过这个接口访问游戏和进行交互。游戏卡只需关注游戏本身,它不需要关心游戏是如何显示出来的以及应该用哪种操作柄,甚至不用关心家里的电压是120V还是220V。这种游戏机就像一个容器,它对游戏的输入输出进行了抽象,这样编写游戏的人不用担心基础平台的问题,而只需要关注游戏本身就足够了。
如果你编写过applet,那么已经对容器的概念有所了解。大多数的Web浏览器都为applet提供了一个容器,如图1ˉ7所示。浏览器的applet容器为applet提供了一个运行环境。由于所有 的applet都实现了java.applet.Applet类接口,所以浏览器及其容器都知道如何与applet进行交互。当我们开发applet时,就不必考虑与Web浏览器的交互了,可以把主要的时间和精力都放在applet的逻辑实现上,而根本不需要关心应用程序如何在Web浏览器中显示的问题。
Java EE的服务端容器也有同样的目的:提供明确定义的接口和服务,让应用开发者不必担心“水管和电线”这样的基础结构,可以集中精力解决业务问题。容器主要处理服务器端的服务的启动、应用逻辑的执行,以及组件的清理等。
Java EE和Java平台包含了Web组件和业务组件的容器。这些容器就像本章前面提到的游戏机一样,为组件提供了运行的环境和接口。Java EE中定义的容器包含了可以运行Servlet、JSP和EJB的容器。