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()方法可以向客户端发送字符串数据流。