Java Web 与 Tomcat

一、Web 服务器、中间件与容器

1、Web 服务器

web服务器(Web Server):web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序。
Web服务器可以处理 HTTP 协议,响应针对静态页面或图片的请求,进行页面跳转,或者把动态请求委托其它程序(它的扩展、某种语言的解释引擎(php)、Web容器)。它可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。
目前最主流的三个Web服务器是Apache、 Nginx 、IIS。

2、中间件

中间件(Middleware)是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。他充当的功能是:将应用程序运行环境与操作系统隔离,从而实现应用程序开发者不必为更多系统问题忧虑,而直接关注该应用程序在解决问题上的能力 。容器就是中间件的一种。
在这里插入图片描述
Web 中间件就是提供web应用软件和系统软件连接的软件的一个总称。

3、容器

(1)容器

容器是中间件的一种,作为操作系统和应用程序之间的桥梁,给处于其中的应用程序组件提供一个环境,使应用程序直接跟容器中的环境变量交互,而不必关注其它系统问题。例如:tomcat(servlet容器),Jboss(EJB容器)。这些容器提供的接口严格遵守J2EE规范中的web application 标准。

(2)web 容器

web 容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求。实际上,Web容器是一种服务程序,给处于其中的应用程序组件提供环境,使其直接跟容器中的环境变量交互,不必关注其它系统问题,是中间件的一个组成部分,它实现了对动态语言的解析,比如tomcat可以解析 jsp,是因为其内部有一个 servlet 容器。一个服务器可以有多个容器。
web容器的行为是将内部的应用程序组件与外界的通信协议交互进行了隔离,从而减轻内部应用程序组件的负担。

(3)EJB 容器(Enterprise java bean )

EJB 容器更具有行业领域特色。他提供给运行在其中的组件 EJB 各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。

WEB容器和EJB容器在原理上是大体相同的,更多的区别是被隔离的外界环境。WEB容器更多的是跟基于HTTP的请求打交道。而 EJB容器不是。它是更多的跟数据库、其它服务打交道。但他们都是把与外界的交互实现从而减轻应用程序的负担。例如servlet不用关心http的细 节,直接引用环境变量session,request,response就行、EJB不用关心数据库连接速度、各种事务控制,直接由容器来完成。
所以说,我们也可以把 IIS(asp容器)、Tomcat(servlet容器)、Jboss(EJB容器)等叫做Web容器

常见的 web 服务器、中间件和 web 容器

(1)常见的web服务器:Apache、IIS、Nginx、tomcat、weblogic、websphere等
(2)常见的中间件:tomcat 、jboss、weblogic、websphere、jetty、apache httpd、glasshfish等
(3)常见的web容器::tomcat、jboss、resin、weblogic、websphere、glassfish等
在这里插入图片描述

tomcat 与 nginx,apache 的区别

(1)Apache

Apache 指的是 Apache 软件基金会下的一个项目 — Apache HTTP Server Project。
Apache HTTP 服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机平台上,其属于应用服务器。Apache支持支持模块多,性能稳定。Apache本身是静态解析,适合静态HTML、图片等,但可以通过扩展脚本、模块等支持动态页面等。

HTTP 服务器本质上也是一种应用程序——它通常运行在服务器之上,绑定服务器的 IP 地址并监听某一个 tcp 端口来接收并处理 HTTP 请求,这样客户端(一般来说是IE, Firefox,Chrome这样的浏览器)就能够通过 HTTP 协议来获取服务器上的网页(HTML格式)、文档(PDF格式)、音频(MP4格式)、视频(MOV格式)等等资源。下图描述的就是这一过程:
在这里插入图片描述

(2)Nginx
Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。
Nginx 常用作静态内容服务、代理服务器和负载均衡等,直面外来请求然后转发给后面的应用服务

(2)Tomcat

Apache Tomcat 则是 Apache 基金会下的另外一个项目,与 Apache HTTP Server 相比,Tomcat 能够动态的生成资源并返回到客户端。Apache HTTP Server 和 Nginx 都能够将某一个文本文件的内容通过HTTP协议返回到客户端,但是这个文本文件的内容是固定的——也就是说无论何时、任何人访问它得到的内容都是完全相同的,这样的资源我们称之为静态资源。动态资源则与之相反,在不同的时间、不同的客户端访问得到的内容是不同的。

Tomcat 是一个 Servlet 容器,实现了对 Servlet 和 JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于 Tomcat 本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器是一个用C语言实现的HTTPWeb服务器;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。
在这里插入图片描述
Tomcat运行在JVM之上,它和HTTP服务器一样,绑定IP地址并监听TCP端口,同时还包含以下指责:
在这里插入图片描述
虽然Tomcat也可以认为是HTTP服务器,但通常它仍然会和Nginx配合在一起使用:
在这里插入图片描述

总结

Nginx优点:

负载均衡、反向代理、处理静态文件优势。nginx处理静态请求的速度高于apache;

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

Apache优点:

相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。

Tomcat:

动态解析容器,处理动态请求,是编译JSP\Servlet的容器Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理

Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache较适合。

二、Web 运作原理探析

1、Web 的概念

Web 是一种分布式应用架构,旨在共享分布在网络上的各个 Web 服务器中所有互相连接的信息。Web采用客户/服务器通信模式,客户与服务器之间用 HTTP 协议通信

Web 具有以下三个特征:
在这里插入图片描述
(1)HTML 简介

HTML(Hyper Text Markup Language)超文本标记语言具有以下特点:
在这里插入图片描述
(2)URL简介

当用户打开浏览器,输入一个URL地址时,就能接收远程Web服务器发送过来的数据。统一资源定位器(Uniform Resource Locator,URL)是专为标记网络上统一资源的位置而设的一种编址方式。URL一般由以下3个部分组成:
在这里插入图片描述
URL的格式:

应用层协议://主机IP地址或域名/资源所在路径/文件名
eg:http://www.javathinker.net/Java Web/javabook.htm

(3)HTTP 简介

HTTP 超文本传输协议(Hypertext Transfer Protocol ,HTTP)是关于如何在网络上传输超级文本(HTML)的协议
HTTP 规定了Web的基本运作过程,以及浏览器与服务器之间的通信细节
HTTP 采用客户/服务器通信模式。
在分层的网络结构中,HTTP位于应用层,建立在TCP/IP的基础上,HTTP使用可靠的TCP连接,默认端口是80

客户端与服务器之间的一次通信过程:

在这里插入图片描述
在HTTP/1.1中,为了提高服务器相应客户端请求的性能,在一个TCP连接中,允许处理多个HTPP请求

浏览器应该具备的功能:
在这里插入图片描述
Web服务应具备的功能:
在这里插入图片描述

2、Web的发展历程

Web按照其所提供的功能,其发展历程大致可分为以下几个阶段:
在这里插入图片描述
(1)处理静态web

所谓静态HTML文档或静态多媒体信息,就是指事先存放在Web服务器文件系统中的HTML文档。当用户在浏览器中输入对应的URL时,Web服务器就会把对应的HTML文档的数据发送到浏览器上。
在这里插入图片描述
(2)处理动态Web

动态页面是当服务器处理客户请求时动态执行程序特定代码产生的。
在这里插入图片描述
浏览器与用户的动态交互,其特征是浏览器会在运行时执行JavaScript和VBScript等脚本程序代码。

Web服务器动态执行的程序可分为两种方式:
在这里插入图片描述
说明:
Web服务器动态执行特定的程序代码,其特征是Web服务器在运行时加载并执行第三方提供的程序代码。所谓Web服务器动态生成HTML文档,就是指Web服务器在运行时通过执行特定的代码来生成HTML文档,而不是直接从文件系统中获取已存在的HTML文档
在这里插入图片描述

三、Tomcat

1、Tomcat概述

Tomcat 是完全由Java语言编写的 Servlet容器。
Tomcat除了能够充当运行 Servlet 的容器,还提供了作为 Web 服务器的一些实用功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。

2、Tomcat 作为 Servlet 容器的基本功能

Servle t是一种运行在服务器上的小插件。Servlet 最常见的用途是扩展 Web 服务器的功能,可作为非常安全的、可移植的、易于使用的 CGI 的替代品。Servlet具有以下特点:
在这里插入图片描述
Tomcat 作为 Servlet 的容器,其基本功能是负责接收和解析来自客户的请求,把客户的请求传送给响应的 Servlet,并把 Serlvet 的响应结果返回给客户
在这里插入图片描述
Servlet 容器响应客户请求访问特定Servlet的基本流程:
在这里插入图片描述
在这里插入图片描述

3、Tomcat的组成结构

Tomcat本身由一系列的可配置组件构成,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器。用<CATALINA_HOME>来表示Tomcat安装的根目录。
Tomcat的容器组件可以在<CATALINA_HOME>/conf/server.xml文件中配置,每个Tomcat组件在Server.xml文件中对应一种配置元素。

<Server>
	<Service>
		<Connector/>
		<Engine>
			<Host>
				<Context>
				</Context>
			</Host>
		</Engine>
	</Service>
</Server>

Tomcat的元素可以分为四类:

● 顶层类元素:<Server>和<Service>,它们位于配置文件的顶层。
● 连接器类元素:<Connector>代表介于客户与服务器之间的通信接口,负责将客户的请求信息发送给服务器,并将服务器的响应结果发送给客户
● 容器类元素:代表处理客户请求并生成响应结果的组件。<Engine>、<Host>、<Context>和<Cluster>。

Engine组 件为特定的Service组件处理所有客户请求。
Host 组件为特定的虚拟主机处理所有的客户请求,
Context组件为特定的Web应用处理所有的客户请求。
Cluster组件负责为Tomcat集群系统进行会话复制、Context组件的属性复制以及集群范围内WAR文件的发布。

● 嵌套类元素:代表可以嵌入到容器中的组件,如<Vlaue>和<Realm>元素等。
在这里插入图片描述

Tomcat 的组成结构是由自身的实现决定的,它与 Servlet 的规范无关。不同的服务器开发商可以用不同的方式来实现服务Servlet规范的 Servlet 容器。

在这里插入图片描述
上图可以表明,Connector组件负责接收客户的请求并向客户返回一个响应结果,同一个Service中多个Connector共用一个Engine,同一个Engine组件可以有多个Host组件,同一个Host组件可以有多个Context组件。

<Server port="8005" shutdown="SHUTDOWN">   
	<Service name="Catalina">
    	<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    	<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     	<Engine name="Catalina" defaultHost="localhost">
      		<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
        		<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               		   prefix="localhost_access_log" suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      		</Host>
    	</Engine>   
    </Service> 
</Server> 

4、Tomcat 的工作模式

Tomcat 作为 Servlet 容器有三种工作模式:

(1)独立的Servlet容器

Tomcat 作为独立的 Web 服务器来单独运行,Servlet 容器组件作为 Web 服务器的一部分而存在。这是Tomcat的默认工作模式。
在这种模式下,Tomcat 是一个独立运行 Java 程序。和运行其他 Java 程序一样,需要启动一个 Java 虚拟机进程来运行 Tomcat 。
在这里插入图片描述

(2)其他Web进程内的Servlet容器

在这种模式下,Tomcat 分为 Web 服务器插件和 Servlet 容器组件两部分。Web 服务器插件在其他 Web 服务器进程的内部地址空间启动一个 Java 虚拟机,Servlet 容器组件在此 Java 虚拟机中运行。如有客户端发出调用 Servlet 的请求,Web 服务器插件获得此请求的控制并将它转发(JNI通信机制)给Servlet容器组件。
注:JNI(Java Nativ Interface),Java本地调用接口,Java程序可以采用其他语言编写的本地程序进行通信。
在这里插入图片描述

(3)其他Web服务器进程外的Servlet容器

在这种模式下,Tomcat分 为 Web 服务器插件和 Servlet 容器组件两部分。Web 服务器插件在其他 Web 服务器外部地址空间启动一个 Java 虚拟机进程,Servlet 组件在此虚拟机中运行。采用 IPC 通信(进程间通信)。
在这里插入图片描述
进程外的 Servlet 容器对客户请求的响应速度不如进程内 Servlet 容器,但进程外容器有更好的伸缩性和稳定性。

5、Tomcat 加载资源顺序

在这里插入图片描述
Tomcat启动时加载资源主要有三个阶段:

(1)第一阶段:JVM 相关资源

● $JAVA_HOME/jre/lib/ext/*.jar
● 系统classpath环境变量中的*.jar和*.class

(2)第二阶段:Tomcat自身相关资源

● $CATALINA_HOME/common/classes/*.class
● $CATALINA_HOME/commons/endorsed/*.jar
● $CATALINA_HOME/commons/i18n/*.jar
● $CATALINA_HOME/common/lib/*.jar
● $CATALINA_HOME/server/classes/*.class
● $CATALINA_HOME/server/lib/*.jar
● $CATALINA_BASE/shared/classes/*.class
● $CATALINA_BASE/shared/lib/*.jar

(3)第三阶段:Web应用相关资源

● 具体应用的webapp目录: /WEB-INF/classes/*.class
● 具体应用的webapp: /WEB-INF/lib/*.jar

在同一个文件夹下,jar包是按顺序从上到下依次加载,由ClassLoader的双亲委托模式加载机制我们可以知道,假设两个包名和类名完全相同的class文件不再同一个jar包,如果一个class文件已经被加载java虚拟机里了,那么后面的相同的class文件就不会被加载了。
但 tomcat 的加载运行机制与 JAVA 虚拟机的父类委托机制稍有不同:

首先加载TOMCAT_HOME/lib目录下的jar包
然后加载TOMCAT_HOME/webapps/项目名/WEB-INF/lib的jar包
最后加载的是TOMCAT_HOME/webapps/项目名/WEB-INF/classes下的类文件

值得注意的关键是:tomcat按上述顺序依次加载资源,当后加载的资源与之前加载的资源相重时,后加载的资源会继续加载并将之前的资源覆盖。
在这里插入图片描述

四、Java Web

Tomcat 是服务 Servlet 规范的优秀 Servelt 容器。Java Web 应用运行在 Servlet 容器中,Servlet 容器能够动态的调用 Java Web 应用中的 Servlet。

1、Java Web 应用简介

Oracle公司的Servlet规范对Java Web应用做了如下定义:
“Java Web应用由一组 Servlet/JSP、HTML文件、相关 Java 类,以及其他可以被绑定的资源个构成。它可以在各种供应商提供的符合 Servlet 规范的 Servlet 容器中运行。”

Java Web应用可以包含如下内容:

Servelt组件:标准Servlet接口的实现类,运行在服务器端,包含了被Servlet容器动态调用的程序代码。
JSP组件:包含Java程序代码的HTML文档。运行在服务器端,当客户端请求访问JSP文件时,Servlet容器先把它编译成Servlet类,然后动态调用它的程序代码
● 相关的Java类:开发人员自定义的Web应用相关的Java类。
● 静态文档:存放在服务器端的文件系统中,如HTML文件、图片文件等。
● 客户端脚本程序:由客户端运行的程序,JavaScript时典型的客户端脚本程序。
web.xml文件: Java Web应用的配置文件,该文件采用XML格式。该文件必须位于Web应用的WEN-INF子目录下

2、Java Web 应用的生命周期

Java Web 应用的生命周期是由 Servlet 容器控制的,分为3各阶段:

(1) 启动阶段

Servlet容器在启动web应用时:

● 把web.xml文件中的数据加载到内存中。
● 为Java Web 应用创建ServletContext对象。

ServletContext 与 Web 应用具有同样的生命周期,因为 Servlet 容器在启动 Web 应用时,就会创建一个唯一的ServletContext对象,当Servlet容器终止一个Web应用时就会销毁ServletContext对象。
ServletContext 是被 Web 应用中的所有 Servlet 共享的,所以在 Web 应用范围内可以用 ServeltContext 来存取共享数据

● 对所有的Filter进行初始化。
● 对需要在Web应用启动时就需要初始化的Servlet进行初始化。

(2)运行时阶段

为客户提供相应的服务。

(3)终止阶段

Servlet容器在终止Java Web应用时,会完成以下操作:

● 销毁应用中所有处于运行状态的Servlet。
● 销毁处于运行状态的Filter。
● 销毁所有与应用相关的对象。如ServletContext等。

3、创建Java Web应用

Servlet 规范规定,Java Web 应用必须采用固定的目录结构。还规定 Java Web 应用的配置信息存放在 WEB-INF/web.xml 文件中,Servlet 容器从该文件中读取配置信息

(1)Java Web应用的目录结构
在这里插入图片描述
在这里插入图片描述
上图中,src 目录是 helloapp 应用开发阶段开发人员自定义的目录,用于存放java类源文件。而到了应用发布阶段,一般是不会对外开放源代码的,所以会将src目录转移到其他地方。

helloapp应用包含如下组件:
在这里插入图片描述
它们之间的关系:
在这里插入图片描述
(2)创建web.xml文件

web.xml 文件是 Java Web 应用的 XML 格式的配置文件,存放于WEB-INF子目录下Servlet容器在加载和启动Java Web应用时会读取它的web.xml文件,从而获得当前Web应用的发布信息
web.xml文件中可包含如下配置信息:
在这里插入图片描述

4、在Tomcat中发布Java Web应用

(1)Tomcat 的目录结构
在这里插入图片描述
以上lib目录用于存放JAR文件,Java Web应用下WEB-INF目录下也可以包含lib目录。区别在于:

● Tomcat的lib子目录存放的JAR文件不仅能被Tomcat访问,还能被所有在Tocmat中发布的Java Web应用访问。
Java Web应用的lib目录只能被自己访问

(2)按照默认方式发布Java Web应用

直接把Java Web应用的所有文件复制到tomcat的webapps目录下

(3)Web组件的URL

Web应用的默认入口是web应用的根目录,如对helloapp应用,它的URL入口为“/hellapp”。

注意:浏览器不能直接访问Web应用的WEB-INF目录文件,因此,如果处于安全的原因,不希望浏览器直接访问某个JSP,可以把它放到WEB-INF目录或其子目录下。在这种情况下,只有通过服务器端的组件才能访问该JSP文件,例如Servlet可以把请求转发个JSP文件

(4)Web.xml 解读

  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>mypack.DispatcherServlet</servlet-class>
      <load-on-startup></load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/dispatcher</url-pattern>
  </servlet-mapping>

对于以上配置,当浏览器需要请求访问mypack.DispatcherServlet时,其URL为:http:\localhost:8080\helloapp\dispacher。其步骤为:
在这里插入图片描述

注意:Tomcat 在加载Web应用的时候就会把web.xml文件中的数据读取到内存中,因此,当Tomcat需要参考web.xml文件的时候,只需要从内存中读取就行了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值