搭建簡單的Web服務(wù)器
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,搭建一個簡單的服務(wù)器,貝毅君,浙江大學(xué)軟件學(xué)院,主要內(nèi)容,Tomcat,總體結(jié)構(gòu),HTTP,請求與響應(yīng),Socket,與,ServerSocket,搭建簡單的,web,服務(wù)器,Tomcat,是一個基于組件的服務(wù)器,它的構(gòu)成組件都是可配置的,其中最外層的組件是,Catalina Servlet,容器,其他的組件按照一定的格式要求配置在這個頂層容器中。,Tomcat,簡介,Tomcat,簡介,/bin,:存放,windows,或,Linux,平臺上啟動和關(guān)閉,Tomcat,的腳本文件,/conf,:存放,Tomcat,服務(wù)器的各種全局配置文件,其中最重要的是,server.xml,和,web.xml,/doc,:存放,Tomcat,文檔,/server,:包含三個子目錄:,classes,、,lib,和,webapps,/server/lib,:存放,Tomcat,服務(wù)器所需的各種,JAR,文件,Tomca,t,簡介,-,目錄結(jié)構(gòu),/server/webapps,:存放,Tomcat,自帶的兩個,WEB,應(yīng)用,admin,應(yīng)用和,manager,應(yīng)用,/common/lib,:存放,Tomcat,服務(wù)器以及所有,web,應(yīng)用都可以訪問的,jar,文件,/shared/lib,:存放所有,web,應(yīng)用都可以訪問的,jar,文件(但是不能被,Tomcat,服務(wù)器訪問),/logs,:存放,Tomcat,執(zhí)行時的日志文件,Tomcat,簡介,-,目錄結(jié)構(gòu),/src,:存放,Tomcat,的源代碼,/work,:存放,JSP,產(chǎn)生的,servlet,文件,/webapps,:,Tomcat,的主要,Web,發(fā)布目錄,默認情況下把,Web,應(yīng)用文件放于此目錄,/helloapp,:,Web,應(yīng)用的根目錄,所有的,jsp,文件和,html,文件都在此目錄下,/helloapp/WEB_INF,:存放該,web,應(yīng)用發(fā)布時的描述文件,web.xml,/helloapp/WEB_INF/class,:存放各種,class,文件,,Servlet,文件也存放于此目錄下,/helloapp/WEB_INF/lib,:存放各鐘,Web,應(yīng)用所需要的,jar,文件。比如可以存放,JDBC,驅(qū)動程序的,JAR,文件,Tomcat,簡介,-,目錄結(jié)構(gòu),以,helloapp,應(yīng)用為例,helloapp,(,/webapps/helloapp/Web-INF/,下的,classes,,,lib,子目錄中*,.calss,及*,.jar,,僅,helloapp,可以加載),Bootstrap,(,$JAVA_HOME/jre/lib/ext/*.jar,),System,(,$CLASSPATH/*.class,和,CLASSPATH,中指定的,jar,),Tomcat,簡介,加載資源順序,Common,(,$CATALINA_HOME/common/,下的,classes,,,lib,,,endores,子目錄中*,.class,及*,.jar,),Catalina,(,$CATALINA_HOME/server/,下的,classes,,,lib,子目錄中*,.calss,及*,.jar,,僅,Tomcat,可以加載),Shared,(,$CATALINA_HOME/shared/,下的,classes,,,lib,子目錄中*,.calss,及*,.jar,,僅所有,Web,應(yīng)用可以加載),Tomcat,簡介,加載資源順序,Tomcat,總體結(jié)構(gòu),Tomcat,的各個組件是在,conf server.xml,文件中配置的,下面通過分析,server.xml,文件來理解,Tomcat,的各個組件是如何組織的。,Tomcat,總體結(jié)構(gòu),Tomcat,簡介,Server,組件對應(yīng),元素,它是配置文件的最頂層元素,代表一個服務(wù)器。一個配置文件中只能有一個,元素。,Service,組件是一些,Connector,組件的集合,它本身不是一個容器。一個,Service,組件中只能有一個,Engine,組件,可以包含多個,Connector,組件。,Connector,組件表示一個接口,通過這個接口接收客戶的請求,然戶發(fā)送給其他的容器組件,最后再把服務(wù)器的響應(yīng)結(jié)果傳遞給客戶。,容器類元素:為特定的虛擬主機處理所有客戶請求,可包含多個,Context,容器類元素:為特定的,Service,組件處理所有客戶請求,可包含多個,Host,。,容器類元素:為特定的,Web,應(yīng)用處理所有客戶請求,Tomcat,總體結(jié)構(gòu),Server:,一個,Server,代表整個,Catalina Servlet,容器。,Service,:,由多個,Connector,組成,以及一個,Engine,,處理所有,Connector,所獲得的客戶請求。,Tomcat,總體結(jié)構(gòu),基本組件,Connector:,一個,Connector,將在某個指定端口上偵聽客戶請求,并將獲得的請求交給,Engine,來處理,從,Engine,處獲得回應(yīng)并返回客戶。,TOMCAT,有兩個典型的,Connector,Coyote Http/1.1 Connector,在端口,8080,處偵聽來自客戶,browser,的,http,請求,Coyote JK2 Connector,在端口,8009,處偵聽來自其它,WebServer(Apache),的,servlet/jsp,代理請求,Tomcat,總體結(jié)構(gòu),基本組件,Engine:E,ngine,下可以配置多個虛擬主機,Virtual Host,,每個虛擬主機都有一個域名。,當,Engine,獲得一個請求時,它把該請求匹配到某個,Host,上,然后把該請求交給該,Host,來處理,Engine,有一個默認虛擬主機,當請求無法匹配到任何一個,Host,上的時候,將交給該默認,Host,來處理。,Tomcat,總體結(jié)構(gòu),基本組件,Host,:代表一個,Virtual Host,,虛擬主機,每個虛擬主機和某個網(wǎng)絡(luò)域名,Domain Name,相匹配每個虛擬主機下都可以部署,(deploy),一個或者多個,Web App,,每個,Web App,對應(yīng)于一個,Context,,有一個,Context path,當,Host,獲得一個請求時,將把該請求匹配到某個,Context,上,然后把該請求交給該,Context,來處理匹配的方法是“最長匹配”,所以一,path=,的,Context,將成為該,Host,的默認,Context,所有無法和其它,Context,的路徑名匹配的請求都將最終和該默認,Context,匹配,Tomcat,總體結(jié)構(gòu),基本組件,Context:,一個,Context,對應(yīng)于一個,Web Application,,一個,Web Application,由一個或者多個,Servlet,組成。,Context,在創(chuàng)建的時候?qū)⒏鶕?jù)配置文件,$CATALINA_HOME/conf/web.xml,和,$WEBAPP_HOME/WEB-INF/web.xml,載入,Servlet,類。當,Context,獲得請求時,將在自己的映射表,(mapping table),中尋找相匹配的,Servlet,類如果找到,則執(zhí)行該類,獲得請求的回應(yīng),并返回。,Tomcat,總體結(jié)構(gòu),基本組件,假設(shè)來自客戶的請求為:,http:/localhost:8080/wsota/wsota_index.jsp,請求被發(fā)送到本機端口,8080,,被在那里偵聽的,Coyote HTTP/1.1 Connector,獲得,Connector,把該請求交給它所在的,Service,的,Engine,來處理,并等待來自,Engine,的回應(yīng),Engine,獲得請求,localhost/wsota/wsota_index.jsp,,匹配它所擁有的所有虛擬主機,Host,Tomcat,處理,Http,請求過程,Engine,匹配到名為,localhost,的,Host,(即使匹配不到也把請求交給該,Host,處理,因為該,Host,被定義為該,Engine,的默認主機),localhost Host,獲得請求,/wsota/wsota_index.jsp,,匹配它所擁有的所有,Context,Host,匹配到路徑為,/wsota,的,Context,(如果匹配不到就把該請求交給路徑名為,的,Context,去處理),Tomcat,處理一個,Http,請求過程,path=/wsota,的,Context,獲得請求,/wsota_index.jsp,,在它的,mapping table,中尋找對應(yīng)的,servlet,Context,匹配到,URL PATTERN,為*,.jsp,的,servlet,,對應(yīng)于,JspServlet,類,構(gòu)造,HttpServletRequest,對象和,HttpServletResponse,對象,作為參數(shù)調(diào)用,JspServlet,的,doGet,或,doPost,方法,Tomcat,處理一個,Http,請求過程,Context,把執(zhí)行完了之后的,HttpServletResponse,對象返回給,Host,Host,把,HttpServletResponse,對象返回給,Engine,Engine,把,HttpServletResponse,對象返回給,Connector,Connector,把,HttpServletResponse,對象返回給客戶,browser,Tomcat,處理一個,Http,請求過程,Servlet,容器是一個復(fù)雜的系統(tǒng),對每個請求,,servlet,容器會為其完成以下,3,個操作:,創(chuàng)建一個,request,對象,用可能會調(diào)用的,Servlet,中使用的信息填充該,request,對象,如參數(shù)、頭、,cookie,、查詢字符串、,URI,等。,創(chuàng)建一個調(diào)用,Servlet,的,response,對象,用來向,Web,客戶端發(fā)送響應(yīng)。,調(diào)用,Servlet,的,service(),方法,將,request,對象和,response,對象作為參數(shù)傳入。,Servlet,從,requset,對象中讀取信息,并通過,response,對象發(fā)送響應(yīng)信息。,Tomcat,總體結(jié)構(gòu),servlet,容器是如何工作的,Tomcat,總體結(jié)構(gòu),Catalina,Catalina,是一個設(shè)計和開發(fā)得十分優(yōu)美,功能結(jié)構(gòu)也模塊化的成熟軟件。,Catalina,是,Tomcat,的核心結(jié)構(gòu)。,連接器負責