tomcat的结构
tomcat的结构
<Server> 顶层类元素:可包含多个Service
<Service> 顶层类元素:可包含一个Engine,多个Connector
<Connector/> 连接器类元素:代表通信接口
<Engine> 容器类元素:为特定的Service组件处理所有客户请求,
可包含多个Host。
<Host> 容器类元素:为特定的虚拟主机处理所有客户请求
可包含多个Context。
<Context> 容器类元素:为特定的Web应用处理所有客户请求
</Context>
</Host>
</Engine>
</Service>
</Server>
Tomcat的工作模式
独立的Servelet容器:
进程内的Servlet容器:JNI通信机制
进程外的Servlet容器:IPC通信机制
Tomcat的环境变量
Windows环境:
JAVA_HOME:Java安装根目录(如:c:\j2sdk1.4.2)。
CATALINA_HOME:Tomcat安装的根目录(如:c:\tomcat 5.0)。
Linux环境:(假设Java安装在/home/java/j2sdk1.4.2,Tomcat安装在/home/tomcat下)
| 
 SHELL类型  | 
 设置JAVA_HOME环境变量的命令  | 
| 
 bash  | 
 JAVA_HOME=/home/java/j2sdk1.4.2;export JAVA_HOME  | 
| 
 tsh  | 
 Setenv JAVA_HOME /home/java/j2sdk1.4.2  | 
| 
 SHELL类型  | 
 设置CATALINA_HOME环境变量的命令  | 
| 
 bash  | 
 CATALINA_HOME=/home/tomcat;export CATALINA_HOME  | 
| 
 tsh  | 
 Setenv CATALINA_HOME /home/tomcat  | 
Tomcat运行脚本(catalina.bat的使用方法)
| 
 命令行参数  | 
 描述  | 
| 
 start  | 
 在新的DOS窗口启动TOMCAT服务器  | 
| 
 run  | 
 在当前DOS窗口启动TOMCAT服务器  | 
| 
 debug  | 
 在跟踪模式下启动TOMCAT服务器  | 
| 
 stop  | 
 关闭TOMCAT服务器  | 
创建和发布Web应用
Tomcat的目录结构
| 
 目录  | 
 描述  | 
| 
 /bin  | 
 存放Windows平台以及Linux平台上启动和关闭Tomcat的脚本文件  | 
| 
 /conf  | 
 存放Tomcat服务器的各种配置文件,其中最重要的配置文件是server.xml  | 
| 
 /server  | 
 包含3个子目录:classes、lib和、webapps  | 
| 
 /server/lib  | 
 存放Tomcat服务器所需的各种Jar文件(其它应用不可访问)  | 
| 
 /server/webapps  | 
 存放Tomcat自带的两个Web应用:admin应用和manager应用  | 
| 
 /common/lib  | 
 存放Tomcat服务器以及所有Web应用都可以访问的Jar文件  | 
| 
 /shared/lib  | 
 存放所有Web应用都可以访问的Jar文件(Tomcat不可访问)  | 
| 
 /logs  | 
 存放Tomcat日志文件  | 
| 
 /webapps  | 
 当发布Web应用时,默认情况下把Web应用文件放于此目录下  | 
| 
 /work  | 
 Tomcat把由JSP生成的Servlet放于此目录下  | 
可以在Java Web应用下的WEB-INF目录中建立lib子目录,存放各种Jar文件,这些Jar文件只能被当前Web应用访问。
在运行过程中,Tomcat类装载器先装载classes目录下的类,再装载lib目录下的类。如果两个目录下存在同名的类,classes目录下的类具有优先权。
Web应用的目录结构
| 
 目录  | 
 描述  | 
| 
 /helloapp  | 
 根目录,所有的JSP和HTML文件都存放于此目录下  | 
| 
 /helloapp/WEB-INF  | 
 存放Web应用的发布描述文件web.xml  | 
| 
 /helloapp/WEB-INF/classes  | 
 存放各种class文件,Servlet类文件也放于此目录下  | 
| 
 /helloapp/WEB-INF/lib  | 
 存放Web应用所需的各种Jar文件。例如:JDBC驱动Jar  | 
关于Context的一点体会
Context 可以直接加在Server.xml的Host中,可是据我的观察,如果我们通过Tomcat的可视化管理界面(Tomcat Administration)来产生Context,就会发现,Tomcat5.0会自动在..\Tomcat 5.0\conf\Catalina\localhost下面添加一个以Context名为文件名的Xml文件(如:你的Context叫做 "/Hello",那它就会产生一个"Hello.xml"的文件)。并且,如果你是第一次使用Tomcat Administration,它会把它的Server.xml及其它现存的所有Context都进行一次重写(表现为:原来Server.xml中的注释全部没有了)。对于Server.xml的改写,它还会产生一个备份文件。而且我发现,只要更改过Context,就会重写一次Server.xml。
Context元素的属性
| 
 属性  | 
 描述  | 
| 
 path  | 
 指定访问该Web应用的URL入口(可以随便取名)  | 
| 
 docBase  | 
 指定Web应用的文件路径,可以给定绝对路径,也可以指定相对于Host的appBase属性的相对路径。如果Web采用开放目录结构,则指定Web应用的根目录;如果Web应用是个WAR文件,则指定WAR文件的路径。  | 
| 
 reloadable  | 
 如果这个属性设为true,Tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动。如果监测到有class文件被更新,服务器会自动重新加载Web应用。  | 
开发阶段,将reloadable属性设为true,有助于调试Servlet和其他的class文件。但是由于这一功能会加重服务器的运行负荷,因此建议在Web应用的产品发布阶段,将它改为false。
<servlet>元素的属性
| 
 属性  | 
 描述  | 
| 
 <servlet-name>  | 
 定义Sevlet的名字(可以随便取)  | 
| 
 <servlet-class>  | 
 指定实现这个Servlet的类  | 
| 
 <init-param>  | 
 定义Servlet的初始化参数(包括参数名和参数值),一个<servlet>可以有多个<init-param>  | 
| 
 <load-on-startup>  | 
 指定Web应用启动时,装载Servlet的次序。当这个值为正数或零,Servlet容器先加载数值小的Servlet,如果这个值为负或者没有设定,那么Servlet容器将在Web客户首次访问Servlet时加载  | 
配置虚拟主机
Servlet技术
Servlet是与平台无关的服务器端组件,它可以运行在Servlet容器中。
Servlet框架是由两个Java包组成:javax.servlet和javax.servlet.http。
Servlet的框架的核心里javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。
有3个方法代表了Servlet的生命周期:
l init方法,负责初始化Servlet对象。
l service方法,负责响应客户的请求。
l destroy方法,当Servlet对象退出生命周期时,负责释放占用的资源。
Servlet类必须扩展以下两个类中的一个。
l 扩展GenericServlet类
必须实现service方法,因为GenericServlet类中的service方法被声明为抽象方法。
Public abstract void service(ServletRequest request,ServletResponse response) thows ServletException,IOException
l 扩展HttpServlet类
HTTP的请求方式包括DELETE、GET、OPTION、POST、PUT、TRACT,在HttpServlet类中分别提供了相应的doXXX()方法,我们只需要重写相应方法即可。
下面,介绍一下ServletRequest和ServletResponse接口。
l ServletRequest接口
它封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等。还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream。
ServletRequest接口的部分方法
| 
 方法名  | 
 描述  | 
| 
 getAttribute  | 
 根据参数给定的属性名返回属性值。  | 
| 
 getContentType  | 
 返回客户请求数据的MIME类型  | 
| 
 getInputStream  | 
 返回以二进制数方式直接读取客户请求数据的输入流  | 
| 
 getParameter  | 
 根据给定的参数名返回参数值  | 
| 
 getRemoteAddr  | 
 返回远程客户主机的IP地址  | 
| 
 getRemoteHost  | 
 返回远程客户主机名  | 
| 
 getRemotePort  | 
 返回远程客房主机端口  | 
| 
 setAttribute  | 
 在ServletRequest中设置属性(包括属性名和属性值)  | 
l ServletResponse接口
为Servlet提供了返回结果的方法。它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutputStream。
ServletResponse接口的部分方法
| 
 方法名  | 
 描述  | 
| 
 getOutputStream  | 
 返回可以向客户端发送二进制数据的输出流对象ServletOutputStream  | 
| 
 getWriter  | 
 返回可以向客户端发送字符数据的PrintWriter对象  | 
| 
 getCharacterEncoding  | 
 返回Servlet发送的响应数据的字符编码  | 
| 
 getContentType  | 
 返回Servlet发送的响应数据的MIME类型  | 
| 
 setCharacterEncoding  | 
 设置Servlet发送的响应数据的字符编码  | 
| 
 setContentType  | 
 设置Servlet发送的响应数据的MIME类型  | 
Servlet的生命周期
1. 初始化阶段
下列情形下Servlet容器装载Servlet
l Servlet容器启动时自动装载某些Servlet
l 在Servlet容器启动后,客户首次向Servlet发出请求
l Servlet的类文件被更新后,重新装载Servlet
Servlet是否在启动时自动装载Servlet,是由在web.xml中为Servlet设置的<load-on-startup>属性决定的。
Init方法有两种形式:
public void init(ServletConfig config) throws ServletException
public void init() throws ServletException
初始化阶段,Servlet容器会为Servlet创建一个ServletConfig对象,用来存放Servlet的初始化配置信息,如Servlet的初始参数。如果Servlet类覆盖了第一种带参数的init方法,应该先调用super.init(config)方法确保参数config引用 ServletConfig对象;如果覆盖的是第二种不带参数的init方法,可以不调用super.init()方法,如果要在init方法中访问 ServletConfig对象,可以调用Servlet类的getServletConfig()方法。
HTTP请求
由3部分组成,分别是:
l 请求方法URI协议/版本
l 请求头(Request Header)
l 请求正文
示例:
GET /sample.jsp HTTP/1.1
Accept:image/gif,image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:locakhost
User-Agent:Mozilla/4.0(compatible;MSIE5.01;Windows NT 5.0)
Accept-Encoding:gzip,deflate
userName=werqin&password=1234
HTTP响应
由3部分组成,分别是:
l 协议 状态代码 描述
l 响应头(Response Header)
l 响应正文
示例:
HTTP/1.1 200 OK
Server:ApacheTomcat/5.0.12
Date:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112
<html>
<head>
<title>HTTP响应示例</title>
</head>
<body>
Hello HTTP!
</body>
</html>
HttpServlet的功能
它首先必须读取HTTP请求的内容。Servlet容器负责创建HttpRequest对象,并把HTTP请求信息封装到HttpRequest对象中。
HttpServletRequest的常用方法
| 
 方法名  | 
 描述  | 
| 
 getCookies()  | 
 返回HTTP请求的Cookies  | 
| 
 getHeader(String name)  | 
 返回参数指定的HTTP请求的Header数据  | 
| 
 getRequestURI()  | 
 返回HTTP请求的URI  | 
| 
 getQueryString()  | 
 返回HTTP请求数据中的查询字符串  | 
| 
 getMethod()  | 
 返回HTTP请求方法  | 
HttpServletResponse的常用方法
| 
 方法名  | 
 描述  | 
| 
 addCookie(Cookie cookie)  | 
 向HTTP响应中加入Cookie  | 
| 
 setHeader(String name,String value)  | 
 设置HTTP响应的Header,如果参数name对应的Header已经存在,则覆盖原来的Header数据  | 
| 
 addHeader(String name,String value)  | 
 向HTTP响应中加入Header  | 
除了这两张表列出的方法外,在HttpServletRequest的ServletRequest中提供了读取客户请求的通用方法,在HttpServletResponse的父类ServletResponse中提供了生成服务器响应的通用方法。
创建HttpServlet的步骤
(1)扩展HttpServlet抽象类.
(2)覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法。
(3)获取HTTP请求信息,例如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串。无论是HTML表单数据还是URL上的查询字符串,在HttpServletRequest对象中都以参数名/参数值的形式存放,可以通过以下方法检索参数信息:
l getParameterNames():返回一个Enumeration对象,它包含了所有的参数名信息。
l getParameter(String name):返回参数名name对象的参数值。
l getParameterValue():返回一个Enumeration对象,它包含了所有参数值信息。
(4)生成HTTP响应结果。
通过利用HttpServletResponse对象的getWriter()方法,可以获得一个PrintWriter对象。使用PrintWriter的print()或println()方法可以向客户端发送字符串数据流。
                    
                
                
            
        
浙公网安备 33010602011771号