tomcat的結(jié)構(gòu)
<Server>??????????????????????????????????? 頂層類元素:可包含多個(gè)Service
?????? <Service>??????????????????????????? 頂層類元素:可包含一個(gè)Engine,多個(gè)Connector
????????????? <Connector/>?????????????? 連接器類元素:代表通信接口
????????????? <Engine>????????????????????? 容器類元素:為特定的Service組件處理所有客戶請(qǐng)求,
???????????????????????????????????????????????? 可包含多個(gè)Host。
???????????????????? <Host>????????????????? 容器類元素:為特定的虛擬主機(jī)處理所有客戶請(qǐng)求
???????????????????????????????????????????????? 可包含多個(gè)Context。
??????????????????????????? <Context>????? 容器類元素:為特定的Web應(yīng)用處理所有客戶請(qǐng)求
??????????????????????????? </Context>
???????????????????? </Host>
????????????? </Engine>
?????? </Service>
</Server>
Tomcat的工作模式
獨(dú)立的Servelet容器:
進(jìn)程內(nèi)的Servlet容器:JNI通信機(jī)制
進(jìn)程外的Servlet容器:IPC通信機(jī)制
Tomcat的環(huán)境變量
Windows環(huán)境:
JAVA_HOME:Java安裝根目錄(如:c:\j2sdk1.4.2)。
CATALINA_HOME:Tomcat安裝的根目錄(如:c:\tomcat 5.0)。
Linux環(huán)境:(假設(shè)Java安裝在/home/java/j2sdk1.4.2,Tomcat安裝在/home/tomcat下)
SHELL類型 |
設(shè)置JAVA_HOME環(huán)境變量的命令 |
bash |
JAVA_HOME=/home/java/j2sdk1.4.2;export JAVA_HOME |
tsh |
Setenv JAVA_HOME /home/java/j2sdk1.4.2 |
SHELL類型 |
設(shè)置CATALINA_HOME環(huán)境變量的命令 |
bash |
CATALINA_HOME=/home/tomcat;export CATALINA_HOME |
tsh |
Setenv CATALINA_HOME /home/tomcat |
Tomcat運(yùn)行腳本(catalina.bat的使用方法)
命令行參數(shù) |
描述 |
start |
在新的DOS窗口啟動(dòng)TOMCAT服務(wù)器 |
run |
在當(dāng)前DOS窗口啟動(dòng)TOMCAT服務(wù)器 |
debug |
在跟蹤模式下啟動(dòng)TOMCAT服務(wù)器 |
stop |
關(guān)閉TOMCAT服務(wù)器 |
???????????????????????????????? 創(chuàng)建和發(fā)布Web應(yīng)用
Tomcat的目錄結(jié)構(gòu)
目錄 |
描述 |
/bin |
存放Windows平臺(tái)以及Linux平臺(tái)上啟動(dòng)和關(guān)閉Tomcat的腳本文件 |
/conf |
存放Tomcat服務(wù)器的各種配置文件,其中最重要的配置文件是server.xml |
/server |
包含3個(gè)子目錄:classes、lib和、webapps |
/server/lib |
存放Tomcat服務(wù)器所需的各種Jar文件(其它應(yīng)用不可訪問(wèn)) |
/server/webapps |
存放Tomcat自帶的兩個(gè)Web應(yīng)用:admin應(yīng)用和manager應(yīng)用 |
/common/lib |
存放Tomcat服務(wù)器以及所有Web應(yīng)用都可以訪問(wèn)的Jar文件 |
/shared/lib |
存放所有Web應(yīng)用都可以訪問(wèn)的Jar文件(Tomcat不可訪問(wèn)) |
/logs |
存放Tomcat日志文件 |
/webapps |
當(dāng)發(fā)布Web應(yīng)用時(shí),默認(rèn)情況下把Web應(yīng)用文件放于此目錄下 |
/work |
Tomcat把由JSP生成的Servlet放于此目錄下 |
可以在Java Web應(yīng)用下的WEB-INF目錄中建立lib子目錄,存放各種Jar文件,這些Jar文件只能被當(dāng)前Web應(yīng)用訪問(wèn)。
在運(yùn)行過(guò)程中,Tomcat類裝載器先裝載classes目錄下的類,再裝載lib目錄下的類。如果兩個(gè)目錄下存在同名的類,classes目錄下的類具有優(yōu)先權(quán)。
Web應(yīng)用的目錄結(jié)構(gòu)
目錄 |
描述 |
/helloapp |
根目錄,所有的JSP和HTML文件都存放于此目錄下 |
/helloapp/WEB-INF |
存放Web應(yīng)用的發(fā)布描述文件web.xml |
/helloapp/WEB-INF/classes |
存放各種class文件,Servlet類文件也放于此目錄下 |
/helloapp/WEB-INF/lib |
存放Web應(yīng)用所需的各種Jar文件。例如:JDBC驅(qū)動(dòng)Jar |
關(guān)于Context的一點(diǎn)體會(huì)
Context 可以直接加在Server.xml的Host中,可是據(jù)我的觀察,如果我們通過(guò)Tomcat的可視化管理界面(Tomcat Administration)來(lái)產(chǎn)生Context,就會(huì)發(fā)現(xiàn),Tomcat5.0會(huì)自動(dòng)在..\Tomcat 5.0\conf\Catalina\localhost下面添加一個(gè)以Context名為文件名的Xml文件(如:你的Context叫做 "/Hello",那它就會(huì)產(chǎn)生一個(gè)"Hello.xml"的文件)。并且,如果你是第一次使用Tomcat Administration,它會(huì)把它的Server.xml及其它現(xiàn)存的所有Context都進(jìn)行一次重寫(表現(xiàn)為:原來(lái)Server.xml中的注釋全部沒(méi)有了)。對(duì)于Server.xml的改寫,它還會(huì)產(chǎn)生一個(gè)備份文件。而且我發(fā)現(xiàn),只要更改過(guò)Context,就會(huì)重寫一次Server.xml。
Context元素的屬性
屬性 |
描述 |
path |
指定訪問(wèn)該Web應(yīng)用的URL入口(可以隨便取名) |
docBase |
指定Web應(yīng)用的文件路徑,可以給定絕對(duì)路徑,也可以指定相對(duì)于Host的appBase屬性的相對(duì)路徑。如果Web采用開(kāi)放目錄結(jié)構(gòu),則指定Web應(yīng)用的根目錄;如果Web應(yīng)用是個(gè)WAR文件,則指定WAR文件的路徑。 |
reloadable |
如果這個(gè)屬性設(shè)為true,Tomcat服務(wù)器在運(yùn)行狀態(tài)下會(huì)監(jiān)視在WEB-INF/classes和WEB-INF/lib目錄下class文件的改動(dòng)。如果監(jiān)測(cè)到有class文件被更新,服務(wù)器會(huì)自動(dòng)重新加載Web應(yīng)用。 |
開(kāi)發(fā)階段,將reloadable屬性設(shè)為true,有助于調(diào)試Servlet和其他的class文件。但是由于這一功能會(huì)加重服務(wù)器的運(yùn)行負(fù)荷,因此建議在Web應(yīng)用的產(chǎn)品發(fā)布階段,將它改為false。
<servlet>元素的屬性
屬性 |
描述 |
<servlet-name> |
定義Sevlet的名字(可以隨便?。? |
<servlet-class> |
指定實(shí)現(xiàn)這個(gè)Servlet的類 |
<init-param> |
定義Servlet的初始化參數(shù)(包括參數(shù)名和參數(shù)值),一個(gè)<servlet>可以有多個(gè)<init-param> |
<load-on-startup> |
指定Web應(yīng)用啟動(dòng)時(shí),裝載Servlet的次序。當(dāng)這個(gè)值為正數(shù)或零,Servlet容器先加載數(shù)值小的Servlet,如果這個(gè)值為負(fù)或者沒(méi)有設(shè)定,那么Servlet容器將在Web客戶首次訪問(wèn)Servlet時(shí)加載 |
配置虛擬主機(jī)
???????????????????????????????? Servlet技術(shù)
Servlet是與平臺(tái)無(wú)關(guān)的服務(wù)器端組件,它可以運(yùn)行在Servlet容器中。
Servlet框架是由兩個(gè)Java包組成:javax.servlet和javax.servlet.http。
Servlet的框架的核心里javax.servlet.Servlet接口,所有的Servlet都必須實(shí)現(xiàn)這一接口。
有3個(gè)方法代表了Servlet的生命周期:
l?????????? init方法,負(fù)責(zé)初始化Servlet對(duì)象。
l?????????? service方法,負(fù)責(zé)響應(yīng)客戶的請(qǐng)求。
l?????????? destroy方法,當(dāng)Servlet對(duì)象退出生命周期時(shí),負(fù)責(zé)釋放占用的資源。
Servlet類必須擴(kuò)展以下兩個(gè)類中的一個(gè)。
l?????????? 擴(kuò)展GenericServlet類
必須實(shí)現(xiàn)service方法,因?yàn)镚enericServlet類中的service方法被聲明為抽象方法。
Public abstract void service(ServletRequest request,ServletResponse response) thows ServletException,IOException
l?????????? 擴(kuò)展HttpServlet類
HTTP的請(qǐng)求方式包括DELETE、GET、OPTION、POST、PUT、TRACT,在HttpServlet類中分別提供了相應(yīng)的doXXX()方法,我們只需要重寫相應(yīng)方法即可。
下面,介紹一下ServletRequest和ServletResponse接口。
l?????????? ServletRequest接口
它封裝了客戶請(qǐng)求信息,如客戶請(qǐng)求方式、參數(shù)名和參數(shù)值、客戶端正在使用的協(xié)議,以及發(fā)出客戶請(qǐng)求的遠(yuǎn)程主機(jī)信息等。還為Servlet提供了直接以二進(jìn)制方式讀取客戶請(qǐng)求數(shù)據(jù)流的ServletInputStream。
ServletRequest接口的部分方法
方法名 |
描述 |
getAttribute |
根據(jù)參數(shù)給定的屬性名返回屬性值。 |
getContentType |
返回客戶請(qǐng)求數(shù)據(jù)的MIME類型 |
getInputStream |
返回以二進(jìn)制數(shù)方式直接讀取客戶請(qǐng)求數(shù)據(jù)的輸入流 |
getParameter |
根據(jù)給定的參數(shù)名返回參數(shù)值 |
getRemoteAddr |
返回遠(yuǎn)程客戶主機(jī)的IP地址 |
getRemoteHost |
返回遠(yuǎn)程客戶主機(jī)名 |
getRemotePort |
返回遠(yuǎn)程客房主機(jī)端口 |
setAttribute |
在ServletRequest中設(shè)置屬性(包括屬性名和屬性值) |
l?????????? ServletResponse接口
為Servlet提供了返回結(jié)果的方法。它允許Servlet設(shè)置返回?cái)?shù)據(jù)的長(zhǎng)度和MIME類型,并且提供輸出流ServletOutputStream。
ServletResponse接口的部分方法
方法名 |
描述 |
getOutputStream |
返回可以向客戶端發(fā)送二進(jìn)制數(shù)據(jù)的輸出流對(duì)象ServletOutputStream |
getWriter |
返回可以向客戶端發(fā)送字符數(shù)據(jù)的PrintWriter對(duì)象 |
getCharacterEncoding |
返回Servlet發(fā)送的響應(yīng)數(shù)據(jù)的字符編碼 |
getContentType |
返回Servlet發(fā)送的響應(yīng)數(shù)據(jù)的MIME類型 |
setCharacterEncoding |
設(shè)置Servlet發(fā)送的響應(yīng)數(shù)據(jù)的字符編碼 |
setContentType |
設(shè)置Servlet發(fā)送的響應(yīng)數(shù)據(jù)的MIME類型 |
Servlet的生命周期
1. 初始化階段
下列情形下Servlet容器裝載Servlet
l?????????? Servlet容器啟動(dòng)時(shí)自動(dòng)裝載某些Servlet
l?????????? 在Servlet容器啟動(dòng)后,客戶首次向Servlet發(fā)出請(qǐng)求
l?????????? Servlet的類文件被更新后,重新裝載Servlet
Servlet是否在啟動(dòng)時(shí)自動(dòng)裝載Servlet,是由在web.xml中為Servlet設(shè)置的<load-on-startup>屬性決定的。
Init方法有兩種形式:
public void init(ServletConfig config) throws ServletException
public void init() throws ServletException
初始化階段,Servlet容器會(huì)為Servlet創(chuàng)建一個(gè)ServletConfig對(duì)象,用來(lái)存放Servlet的初始化配置信息,如Servlet的初始參數(shù)。如果Servlet類覆蓋了第一種帶參數(shù)的init方法,應(yīng)該先調(diào)用super.init(config)方法確保參數(shù)config引用 ServletConfig對(duì)象;如果覆蓋的是第二種不帶參數(shù)的init方法,可以不調(diào)用super.init()方法,如果要在init方法中訪問(wèn) ServletConfig對(duì)象,可以調(diào)用Servlet類的getServletConfig()方法。
HTTP請(qǐng)求
由3部分組成,分別是:
l?????????? 請(qǐng)求方法URI協(xié)議/版本
l?????????? 請(qǐng)求頭(Request Header)
l?????????? 請(qǐng)求正文
示例:
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響應(yīng)
由3部分組成,分別是:
l?????????? 協(xié)議 狀態(tài)代碼 描述
l?????????? 響應(yīng)頭(Response Header)
l?????????? 響應(yīng)正文
示例:
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響應(yīng)示例</title>
</head>
<body>
Hello HTTP!
</body>
</html>
HttpServlet的功能
它首先必須讀取HTTP請(qǐng)求的內(nèi)容。Servlet容器負(fù)責(zé)創(chuàng)建HttpRequest對(duì)象,并把HTTP請(qǐng)求信息封裝到HttpRequest對(duì)象中。
HttpServletRequest的常用方法
方法名 |
描述 |
getCookies() |
返回HTTP請(qǐng)求的Cookies |
getHeader(String name) |
返回參數(shù)指定的HTTP請(qǐng)求的Header數(shù)據(jù) |
getRequestURI() |
返回HTTP請(qǐng)求的URI |
getQueryString() |
返回HTTP請(qǐng)求數(shù)據(jù)中的查詢字符串 |
getMethod() |
返回HTTP請(qǐng)求方法 |
HttpServletResponse的常用方法
方法名 |
描述 |
addCookie(Cookie cookie) |
向HTTP響應(yīng)中加入Cookie |
setHeader(String name,String value) |
設(shè)置HTTP響應(yīng)的Header,如果參數(shù)name對(duì)應(yīng)的Header已經(jīng)存在,則覆蓋原來(lái)的Header數(shù)據(jù) |
addHeader(String name,String value) |
向HTTP響應(yīng)中加入Header |
除了這兩張表列出的方法外,在HttpServletRequest的ServletRequest中提供了讀取客戶請(qǐng)求的通用方法,在HttpServletResponse的父類ServletResponse中提供了生成服務(wù)器響應(yīng)的通用方法。
創(chuàng)建HttpServlet的步驟
(1)擴(kuò)展HttpServlet抽象類.
(2)覆蓋HttpServlet的部分方法,如覆蓋doGet()或doPost()方法。
(3)獲取HTTP請(qǐng)求信息,例如通過(guò)HttpServletRequest對(duì)象來(lái)檢索HTML表單所提交的數(shù)據(jù)或URL上的查詢字符串。無(wú)論是HTML表單數(shù)據(jù)還是URL上的查詢字符串,在HttpServletRequest對(duì)象中都以參數(shù)名/參數(shù)值的形式存放,可以通過(guò)以下方法檢索參數(shù)信息:
l?????????? getParameterNames():返回一個(gè)Enumeration對(duì)象,它包含了所有的參數(shù)名信息。
l?????????? getParameter(String name):返回參數(shù)名name對(duì)象的參數(shù)值。
l?????????? getParameterValue():返回一個(gè)Enumeration對(duì)象,它包含了所有參數(shù)值信息。
(4)生成HTTP響應(yīng)結(jié)果。
通過(guò)利用HttpServletResponse對(duì)象的getWriter()方法,可以獲得一個(gè)PrintWriter對(duì)象。使用PrintWriter的print()或println()方法可以向客戶端發(fā)送字符串?dāng)?shù)據(jù)流。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
