一、Tomcat 架构
1、Http服务器请求处理
浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后,需要调用服务端程序来处理,所谓的服务端程序就是你写的Java类,一般来说不同的请求需要由不同的Java类来处理。
HTTP服务器不直接调用业务类,而是把请求交给容器来处理,容器通过Servlet接口调用业务类。因此Servlet接口和Servlet容器的出现,达到了HTTP服务器与业务类解耦的目的。而Servlet接口和Servlet容器这一整套规范叫作Servlet规范。Tomcat按照Servlet规范的要求实现了Servlet容器,同时它们也具有HTTP服务器的功能。作为Java程序员,如果我们要实现新的业务功能,只需要实现一个Servlet,并把它注册到Tomcat(Servlet容器)中,剩下的事情就由Tomcat帮我们处理了。
2、Servlet容器工作流程
为了解耦,HTTP服务器不直接调用Servlet,而是把请求交给Servlet容器来处理,那Servlet容器又是怎么工作的呢?
当客户请求某个资源时,HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来,然后调用Servlet容器的service方法,Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系,找到相应的Servlet,如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化,接着调用Servlet的service方法来处理请求,把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端。
二、Tomcat架构和执行流程
1、首先介绍几个概念
Server:服务器,启动一个tomcat就是启动了一个服务器,一个Server可以有多个Service,一个Service可以有多个Connectior和Engine
Service:服务,一个server可以包含多个service 一个service维护多个Connector和一个Engine
Engine:叫引擎,也有资料叫Container,一个服务可以开一个引擎,就是一个公司可以有很多个门,不同身份的人从不同的门进,但是具体干活的就一个部门。引擎负责处理请求,不需要考虑请求链接,协议等。
Context:一个Context管理一个应用,其实就是我们写的程序。
Wrapper:每个都封装着一个Servlet(当然只局限于普通的Http请求)。
dns www.ydl.com —> 127.0.0.1,www.ydl2.com—>127.0.0.1
2、Tomcat运行流程
客户发送一个请求:http://localhost:8080/test/index.html。请求被发送到本机端口8080后,执行流程如下:
- 被在那里侦听的Coyote HTTP/1.1 Connector获得,然后引擎负责处理请求,不需要考虑请求链接,协议等。
- Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
- Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host。
- Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)。
- localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context。
- Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)。
- path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet。
- Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类,构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
- Context把执行完了之后的HttpServletResponse对象返回给Host。
- Host把HttpServletResponse对象返回给Engine。
- Engine把HttpServletResponse对象返回给Connector。
- Connector把HttpServletResponse对象返回给客户browser。
我们在使用tomcat的时候可以不理会中间的实现的任何过程,专心于我们的业务代码的编写,不停的写servlet就行了,极大的提升了写代码的效率。
3、Tomcat 服务器配置
Tomcat 服务器的配置主要集中于 tomcat/conf 下的 catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml 文件。
(1)server.xml
server.xml 是tomcat 服务器的核心配置文件,包含了Tomcat的 Servlet 容器(Catalina)的所有配置。由于配置的属性特别多,我们在这里主要讲解其中的一部分重要配置。
【Server】是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是 org.apache.catalina.core.StandardServer。
<Server port="8005" shutdown="SHUTDOWN">
...
</Server>
port : Tomcat 监听的关闭服务器的端口。
shutdown: 关闭服务器的指令字符串。
【Connector】 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进行优化。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
属性说明:
1) port: 端口号,Connector 用于创建服务端Socket 并进行监听, 以等待客户端请求链接。如果该属性设置为 0,Tomcat将会随机选择一个可用的端口号给当前Connector 使用。
2) protocol : 当前Connector 支持的访问协议。 默认为 HTTP/1.1 。
3) connectionTimeOut : Connector 接收链接后的等待超时时间, 单位为 毫秒。 -1 表示不超时。
完整的配置如下:
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
我们能得知的信息是:有个默认的服务是Catalina,这个服务默认开放了8080端口的连接器,默认的引擎也叫Catalina,它管理一个默认的主机localhost,localhost的根目录是webapp。
不妨我们打开webapp,我们能看到这里边已经有了几个项目了。
这里边已经有了几个工程,这几个工程有管理工具,有例子程序,我们以后项目就可以放在这里。如果输入的后没有加项目名字,默认会进入ROOT,比如我们看到的首页就是ROOT中的工程。
我们不妨在webapp中新建,app文件
重新启动tomcat,访问localhost:8080/app/index.html
结果如下。
给一个service增加监听端口:
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="9090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="9443" />
...
</Service>
意思就是同时开了8080、9090以及8443和9443四个端口。这里只是测试,一般是没有必要的。
9090端口一样能打开,这就相当于给我们的服务开了好几个门,通过这几个门,数据都能进来。
比如我们可以这样去操作:
我们在hosts文件中再配置一个主机域名
路径是:C:\Windows\System32\drivers\etc
受用notepad++修改hosts文件:
再给我们本机配置一个主机域名:这时不管是localhost还是www.ydl.com都会指向本机:
接着就该位置文件:
<Engine name="Catalina" defaultHost="localhost">
<!-- 配置一个新的host指向d盘的目录 -->
<Host name="www.ydl.com" appBase="D:\\webapps"
unpackWARs="true" autoDeploy="true">
</Host>
<!-- 原有的也是默认的host -->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
...
</Host>
</Engine>
当然我们在D盘下新建webapps,这只是个目录的名字,你可以在任何的地方,叫任何的名字:
我们新建目录app,并在app下新建index.html。
<h1>www.ydl.com</h1>
启动tomcat,访问http://www.ydl.com:8080/app/index.html
成功了,这里我们验证了多了主机域名。
4、创建Javaweb项目
(1)创建项目
直接创建一个Java项目,我们自己尝试构建:
(2)创建名字
(3)项目结构
按照我的项目结构创建目录。
(4)构建web项目
进入项目构建的选项卡中:快捷键是 ctrl + shift + alt + s,也可以先点击file,再进入。
在facets选项中给项目添加特性:
点击加号,选择web,点击OK
这个指的是我们的xml所在的位置,一定要修改正确
很明显,我这个不对,如果不对,就点击减号删除掉,点击加新增一个。
修改后:
保证路径正确就行了,这个路径也要正确,如果不正确自行修改
添加一个artifacts,
它会自动给你添加:
点击确定,配置完成。
(5)配置web服务器(tomcat)
点击+ 选择 tomcat Server 选择local
选择我们的tomcat10
选择artfacts,讲我们的工程部署上去。
点击确定
(6)部署文件
(7)启动
乱码修改:
评论区