初识Servlet
-
SUN公司制定了一系列Web应用与Web服务器进行协作的标准Java接口,统称为Java Servlet API,还对Web服务器发布及运行Web应用的一些细节做了规约。SUN公司把这一系列标准Java接口和规约统称为Servlet规范。Servlet就是Web服务器与Web应用进行协作的标准接口。
-
Servlet规范把能够发布和运行JavaWeb应用的Web服务器称为Servlet容器,它的最主要的特征就是动态执行JavaWeb应用中的Servlet实现类中的程序代码。
-
Servlet是一种运行在服务器上的小插件,其最常见的用途是扩展Web服务器的功能,可作为非常安全的、可移植的、易于使用的CGI替代品。具有以下特点:
-
提供了可被服务器动态加载并执行的程序代码,为来自客户端的请求提供相应的服务;
-
Servlet完全用Java语言编写,因此要求运行Servlet的服务器必须支持Java语言;
-
Servlet完全在服务器端运行,因此它的运行不依赖于浏览器。不管浏览器是否支持Java语言,都能请求访问服务器端的Servlet。
Tomcat
Tomcat作为运行Servlet的容器,其基本功能是负责接收和解析来自客户端的请求,同时把客户端的请求传送给相应的Servlet,并把Servlet的响应结果返回给客户端。
Tomcat组件,分为4类:
-
顶层类元素:包括
<Server>
元素和<Service>
元素,它们位于整个配置文件的顶层; -
连接器类元素:为
<Connector>
元素,代表介于客户端与服务器端之间的通信接口,负责将客户端的请求发送给服务器端,并将服务器的响应结果返回给客户端; -
容器类元素:代表处理客户端请求并生成响应结果的组件,共有四类,分别为
<Engine>
、<Host>
、<Context>
和<Cluster>
元素。Engine
组件为特定的Service
组件处理所有客户端请求,Host
组件为特定的虚拟主机处理所有的客户端请求,Context
组件为特定的Web应用处理所有的客户端请求。Cluster
组件负责为Tomcat
集群系统进行会话复制、Context
组件的属性的复制,以及集群范围内WAR
文件的发布。 -
嵌套类元素:代表可以被嵌入到容器中的组件,如
<Valve>
元素和<Realm>
元素等。
Tomcat元素:
-
<Server>
元素:代表整个Servlet
容器组件,是Tomcat
的顶级元素。在<Server>
元素中可包含一个或多个<Service>
元素; -
<Service>
元素:包含一个<Engine>
元素,以及一个或多个<Connector>
元素,这些<Connector>
元素共享同一个<Engine>
元素; -
<Connector>
元素:代表和客户端实际交互的组件,负责接收客户端请求,以及向客户端返回响应结果; -
<Engine>
元素:每个<Service>
元素只能包含一个<Engine>
元素。<Engine>
元素处理在同一个<Service>
中所有<Connector>
元素接收到的客户端请求; -
<Host>
元素:在一个<Engine>
元素中可以包含多个<Host>
元素。每个<Host>
元素定义了一个虚拟主机,它可以包含一个或多个Web
应用; -
<Context>
元素:每个<Context>
元素代表了运行在虚拟主机上的单个Web
应用。在一个<Host>
元素中可以包含多个<Context>
元素。
Tomcat的工作模式:
(1)独立的Servlet
容器
Tomcat作为独立的web服务器来单独运行,Servlet容器组件作为web服务器中的一部分存在,这是Tomcat的默认工作模式。 在这种模式下,Tomcat是一个独立进行的Java程序。和运行其他Java程序一样,运行Tomcat需要启动一个Java虚拟机进程,由该进程来运行Tomcat。
(2)其他web服务器进程内的Servlet容器
在这种模式下,Tomcat分为web服务器插件和Servlet容器插件两部分。web服务器插件在其他web服务器进程的内部地址空间启动一个JVM,Servlet在此JVM中运行。如有客户端发出调用Servlet的请求,web服务器插件获得对此请求的控制并将它转发(JNI通信机制)给Servlet容器组件。
(3)其他web服务器进程外的Servlet容器
在这种模式下,Tomcat分为web服务器插件和Servlet容器组件两部分。web服务器插件在其他web服务器的外部地址空间启动一个JVM进程,Servlet容器组件再次JVM中运行。如有客户端发出调用Servlet的请求,web服务器插件获得对此请求的控制并将它转发(IPC通信机制)给Servlet容器组件。
当Tomcat作为独立的Servlet容器来运行时,可看做是能运行Java Servlet的独立web服务器。此外,Tomcat还可作为其他web服务器进程内或进程外的Servlet容器,从而与其他web服务器集成,集成的意义在于:对于不支持运行Java Servlet的其web服务器,可通过集成Tomcat来提供运行Servlet的功能。
Tomcat的目录结构
-
bin
:存放启动和关闭Tomcat的脚本文件及所用到的类; -
conf
:存放Tomcat的各种配置文件,其中最重要的配置文件是server.xml
; -
logs
:存放Tomcat的日志文件; -
lib
:存放Tomcat服务器及所有Web应用都可以访问的jar文件; -
webapps
:Web应用的默认部署目录; -
work
:Tomcat的工作目录,Tomcat在运行时把生成的一些工作文件放于此目录下。在默认情况下,Tomcat把编译JSP而生成的Servlet类文件放于此目录下; -
tmp
:临时文件目录。
NOTE:
-
Tomcat的lib子目录:存放的jar文件不仅能被Tomcat访问,还能被所有在Tomcat中发布的JavaWeb应用访问;
-
JavaWeb应用的lib子目录:存放的jar文件只能被当前JavaWeb应用访问。
NOTE:
Tomcat在加载Web应用时,会把相应的web.xml文件中的数据读入到内存中。
Context元素
主要属性:
-
path:指定访问该Web应用的URL入口,什么都不写表示根路径;
-
docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于
<Host>
的appBase属性的相对路径。如果Web应用采用开放目录结构,则指定Web应用的根路径;如果Web应用是个war文件,则是定war文件的路径; -
className:指定实现Context组件的Java类的名字,这个类必须实现
org.apache.catalina.Context
接口; -
reloadable:如果这个属性设为true,Tomcat服务器在运行状态下会监视在
WEB-INF/classes
和WEB-INF/lib
目录下的class文件的改动,以监视Web应用的WEB-INF/web.xml
文件的改动。如果检测到有class
文件或web.xml
文件被更新,服务器会自动重新加载Web应用。
专有属性:
-
cachingAllowed:如果为true,表示允许启用静态资源的缓存,默认值为true;
-
cacheMaxSize:设定静态资源缓存的最大容量,默认为10m;
-
workDir:指定Web应用的工作目录,Tomcat在运行时会把与这个web应用相关的临时文件放在这个目录下;
-
uppackWar:如果设为true,表示将把Web应用的WAR文件展开为开放目录结构后再运行。如果设为false,则直接运行war文件。默认为true。
Host元素
主要属性
-
name:指定虚拟主机的名字
-
className:指定实现虚拟主机的Java类的名字,这个Java类必须实现
org.apache.catalina.Host
接口; -
appBase:指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于
<CATALINA_HOME>
的相对路径; -
autoDeploy:如果设定为true,表示当Tomcat服务器处于运行状态时,能够检测appBase下的文件,如果有新的Web应用加进来,则会自动发布这个Web应用;
-
deployOnStart:如果此项设置为true,则表示当Tomcat启动时会自动发布appBase目录下的所有Web应用。如果web应用没有相应的context元素,那么Tomcat会提供一个默认的context组件。默认值为true。
专有属性:
-
unpackWARS:如果设置为true,表示将把appBase属性指定的目录下的web应用的war文件先展开为开放的目录结构后再运行,如果设置为false,则直接运行war文件;
-
workDir:指定虚拟主机的工作目录,Tomcat在运行时会把与这个虚拟主机的所有web应用相关的临时文件放在此目录下,默认值为
<CATALINA_HOME>/work
。如果<Host>
元素下的一个<Context>
元素也设置了workDIR属性,那么<Context>
的workDir属性会覆盖<Host>
元素的workDir属性; -
deployXML:如果设置为false,那么Tomcat不会解析web应用中的用于设置context元素的
META-INF/context.xml
文件。默认值为true。
JavaWeb
SUN的Servlet规范对JavaWeb应用的定义:JavaWeb应用由一组Servlet/JSP、HTML文件、相关Java类,以及其他可以绑定的资源构成,它可以在由各种供应商提供的符合Servlet规范的Servlet容器中运行。
JavaWeb应用包含的内容:
-
Srvlet
组件:标准Servlet接口的实现类,运行在服务器端,包含了被Servlet容器动态调用的程序代码。 -
JSP
组件:包含Java程序代码的HTML文档,运行在服务器端。当客户端请求JSP文件时,Servlet容器先把它翻译成Servlet类,然后动态调用它的程序代码。 -
相关的Java类:开发人员自定义的与Web应用相关的Java类。
-
静态文档:存放在存放在服务器端的文件系统中,如HTML文件、图片文件等。当客户端请求访问这些文件时,Servlet容器先从本地文件系统中读取这些文件的数据,再把它发送到客户端。
-
web.xml
文件:JavaWeb应用的配置文件,采用XML格式。该文件必须位于Web应用的WEB-INF
目录下。
Servlet规范规定:JavaWeb应用必须采用固定的目录结构,即每种类型的组件在web应用中都有固定的存放目录。
JavaWeb应用的目录结构,以helloapp为例
-
/helloapp
:此Web应用的根目录,所有的JSP和HTML文件都存放于此目录或用户自定义的子目录下(WEB-INF
子目录除外); -
/helloapp/WEB-INF
:存放此Web应用的配置文件web.xml
; -
/helloapp/WEB-INF/classes
:存放各种.class
文件,Servlet类的.class
文件也存放于此目录下; -
/helloapp/WEB-INF/lib
:存放此Web应用所需的各种jar文件; -
/helloapp/META-INF
:当前Webapp的私有资源目录,通常存放自用的context.xml
; -
/helloapp/classes
:此Webapp的私有类; -
/helloapp/lib
:此Webapp的私有类,被打包为jar格式; -
/helloapp/index.jsp
:此Webapp的主页。
NOTE:在WEB-INF目录的classes及lib子目录下都可以存放类文件。在运行时,Servlet容器的类加载器先加载classes目录下的类,再加载lib目录下的jar文件中的类。
Tomcat阀(Valve)
Tomcat阀能够对Catalina容器接收到的http请求进行预处理。Tomcat阀可以可以加入到3种Catalina容器中,它们是Engine、Host和Context。
Tomcat阀主要包括以下几种:
-
客户访问日志阀(Access Log Valve)
-
远程地址过滤器(Remote Address Filter)
-
远程主机过滤器(Remote Host Filter)
-
客户请求记录器(Request Dumper)
1.客户访问日志阀
能够将客户端的请求信息写到日志文件中,这些日志文件可以记录网页的访问次数、访问时间、用户的会话活动和用户的安全验证信息等。客户访问日志阀可以加入到Engine、Host或Context容器。
属性:
-
className:指定阀的实现类,此处为
org.apache.catalina.valves.AccessLogValve
; -
directory:设定存放日志文件的绝对或相对于
<CATALINA_HOME>
的目录,默认为<CATALINA_HOME>/logs
; -
pattern:设定日志的格式和内容;
-
prefix:设定日志文件名前缀,默认为
access_log
; -
resolveHosts:如果设为true,表示把远程IP地址解析为主机名;如果设为false,表示直接记录远程IP地址,默认为false;
-
suffix:设定日志文件的扩展名,默认为
""
;
pattern属性的可选值:
%a:远程IP地址; %A:本地IP地址; %b:发送的字节数,不包括HTTP头部,符号“-”表示发送字节为零; %B:发送的字节数,不包括HTTP头部; %h:远程主机名; %H:客户端请求所用的协议; %l:远程逻辑用户名(目前总是返回符号“-”); %m:客户端的请方式; %p:接收到客户端请求的本地服务器端口; %q:客户端请求中的查询字符串(Query String),即HTTP请求的第一行的URI部分的“?”后面的内容; %r:客户端请求的第一行内容(包括请求方式、请求URI及HTTP协议版本); %s:服务器响应结果中的HTTP状态代码; %S:用户的额Session ID; %t:时间和日期; %u:通过安全认证的远程用户名,符号“-”表示不存在远程用户名; %U:客户端请求的URL路径; %v:本地服务器名;
2.远程地址过滤器
可以根据远程客户端的IP地址来决定是否接受客户端的请求。在远程地址过滤器中,事先保存了一份被拒绝的IP地址清单和允许访问的IP地址清单。
属性
-
className:指定阀实现类,此处为
org.apache.catalina.valves.AccessLogValve
; -
allow:指定允许访问的客户端IP地址,如果没有设定,则表示只要客户端IP地址不在deny清单中,就允许访问,多个IP地址用逗号隔开;
-
deny:指定不允许访问的IP地址;
3.远程主机过滤器
与远程地址多滤器基本上相同,只是一个是基于ip,一个是基于主机名。
4.客户请求记录器
用于把客户端请求的详细信息记录到日志文件,是一个有效的跟踪工具,尤其是当HTTP请求中的Header或Cookie有错误时,它可以跟踪客户请求的详细信息。
原创文章,作者:Jeason,如若转载,请注明出处:http://www.178linux.com/62239