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,*,*,搭建一个简单的服务器,贝毅君,浙江大学软件学院,主要内容,Tomcat,总体结构,HTTP,请求与响应,Socket,与,ServerSocket,搭建简单的,web,服务器,Tomcat,是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的组件是,Catalina Servlet,容器,其他的组件按照一定的格式要求配置在这个顶层容器中。
Tomcat,简介,Tomcat,简介,/bin,:存放,windows,或,Linux,平台上启动和关闭,Tomcat,的脚本文件,/conf,:存放,Tomcat,服务器的各种全局配置文件,其中最重要的是,server.xml,和,web.xml,/doc,:存放,Tomcat,文档,/server,:包含三个子目录:,classes,、,lib,和,webapps,/server/lib,:存放,Tomcat,服务器所需的各种,JAR,文件,Tomca,t,简介,-,目录结构,/server/webapps,:存放,Tomcat,自带的两个,WEB,应用,admin,应用和,manager,应用,/common/lib,:存放,Tomcat,服务器以及所有,web,应用都可以访问的,jar,文件,/shared/lib,:存放所有,web,应用都可以访问的,jar,文件(但是不能被,Tomcat,服务器访问),/logs,:存放,Tomcat,执行时的日志文件,Tomcat,简介,-,目录结构,/src,:存放,Tomcat,的源代码,/work,:存放,JSP,产生的,servlet,文件,/webapps,:,Tomcat,的主要,Web,发布目录,默认情况下把,Web,应用文件放于此目录,/helloapp,:,Web,应用的根目录,所有的,jsp,文件和,html,文件都在此目录下,/helloapp/WEB_INF,:存放该,web,应用发布时的描述文件,web.xml,/helloapp/WEB_INF/class,:存放各种,class,文件,,Servlet,文件也存放于此目录下,/helloapp/WEB_INF/lib,:存放各钟,Web,应用所需要的,jar,文件。
比如可以存放,JDBC,驱动程序的,JAR,文件,Tomcat,简介,-,目录结构,以,helloapp,应用为例,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,应用可以加载),Tomcat,简介,加载资源顺序,Tomcat,总体结构,Tomcat,的各个组件是在,conf server.xml,文件中配置的,下面通过分析,server.xml,文件来理解,Tomcat,的各个组件是如何组织的。
Tomcat,总体结构,Tomcat,简介,Server,组件对应,元素,它是配置文件的最顶层元素,代表一个服务器一个配置文件中只能有一个,元素Service,组件是一些,Connector,组件的集合,它本身不是一个容器一个,Service,组件中只能有一个,Engine,组件,可以包含多个,Connector,组件Connector,组件表示一个接口,通过这个接口接收客户的请求,然户发送给其他的容器组件,最后再把服务器的响应结果传递给客户容器类元素:为特定的虚拟主机处理所有客户请求,可包含多个,Context,容器类元素:为特定的,Service,组件处理所有客户请求,可包含多个,Host,容器类元素:为特定的,Web,应用处理所有客户请求,Tomcat,总体结构,Server:,一个,Server,代表整个,Catalina Servlet,容器Service,:,由多个,Connector,组成,以及一个,Engine,,处理所有,Connector,所获得的客户请求Tomcat,总体结构,基本组件,Connector:,一个,Connector,将在某个指定端口上侦听客户请求,并将获得的请求交给,Engine,来处理,从,Engine,处获得回应并返回客户。
TOMCAT,有两个典型的,Connector,Coyote Http/1.1 Connector,在端口,8080,处侦听来自客户,browser,的,http,请求,Coyote JK2 Connector,在端口,8009,处侦听来自其它,WebServer(Apache),的,servlet/jsp,代理请求,Tomcat,总体结构,基本组件,Engine:E,ngine,下可以配置多个虚拟主机,Virtual Host,,每个虚拟主机都有一个域名当,Engine,获得一个请求时,它把该请求匹配到某个,Host,上,然后把该请求交给该,Host,来处理,Engine,有一个默认虚拟主机,当请求无法匹配到任何一个,Host,上的时候,将交给该默认,Host,来处理Tomcat,总体结构,基本组件,Host,:代表一个,Virtual Host,,虚拟主机,每个虚拟主机和某个网络域名,Domain Name,相匹配每个虚拟主机下都可以部署,(deploy),一个或者多个,Web App,,每个,Web App,对应于一个,Context,,有一个,Context path,当,Host,获得一个请求时,将把该请求匹配到某个,Context,上,然后把该请求交给该,Context,来处理匹配的方法是“最长匹配”,所以一,path=,的,Context,将成为该,Host,的默认,Context,所有无法和其它,Context,的路径名匹配的请求都将最终和该默认,Context,匹配,Tomcat,总体结构,基本组件,Context:,一个,Context,对应于一个,Web Application,,一个,Web Application,由一个或者多个,Servlet,组成。
Context,在创建的时候将根据配置文件,$CATALINA_HOME/conf/web.xml,和,$WEBAPP_HOME/WEB-INF/web.xml,载入,Servlet,类当,Context,获得请求时,将在自己的映射表,(mapping table),中寻找相匹配的,Servlet,类如果找到,则执行该类,获得请求的回应,并返回Tomcat,总体结构,基本组件,假设来自客户的请求为:,http:/localhost:8080/wsota/wsota_index.jsp,请求被发送到本机端口,8080,,被在那里侦听的,Coyote HTTP/1.1 Connector,获得,Connector,把该请求交给它所在的,Service,的,Engine,来处理,并等待来自,Engine,的回应,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,中寻找对应的,servlet,Context,匹配到,URL PATTERN,为*,.jsp,的,servlet,,对应于,JspServlet,类,构造,HttpServletRequest,对象和,HttpServletResponse,对象,作为参数调用,JspServlet,的,doGet,或,doPost,方法,Tomcat,处理一个,Http,请求过程,Context,把执行完了之后的,HttpServletResponse,对象返回给,Host,Host,把,HttpServletResponse,对象返回给,Engine,Engine,把,HttpServletResponse,对象返回给,Connector,Connector,把,HttpServletResponse,对象返回给客户,browser,Tomcat,处理一个,Http,请求过程,Servlet,容器是一个复杂的系统,对每个请求,,servlet,容器会为其完成以下,3,个操作:,创建一个,request,对象,用可能会调用的,Servlet,中使用的信息填充该,request,对象,如参数、头、,cookie,、查询字符串、,URI,等。
创建一个调用,Servlet,的,response,对象,用来向,Web,客户端发送响应调用,Servlet,的,service(),方法,将,request,对象和,response,对象作为参数传入Servlet,从,requset,对象中读取信息,并通过,response,对象发送响应信息Tomcat,总体结构,servlet,容器是如何工作的,Tomcat,总体结构,Catalina,Catalina,是一个设计和开发得十分优美,功能结构也模块化的成熟软件Catalina,是,Tomcat,的核心结构连接器负责。