目录
1.Tomcat架构图
2. Tomact组件
1.Server组件
启动一个
server
实例(即一个
JVM
),它监听在
8005
端口以接收
shutdown
命令。
Server
的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个
Server
实例,必
须配置它们使用不同的端口。
<Server port="8005" shutdown="SHUTDOWN">
port:
接收
shutdown
指令的端口,默认为
8005
;
shutdown
:发往此
Server
用于实现关闭
tomcat
实例的命令字符串,默认为
SHUTDOWN
;
2.Service组件
Service
主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的
端口和协议接收请求并将其转发至关联的引擎进行处理。困此,
Service
要包含一个引擎、一个或多个连接器。
3.Connector组件
支持处理不同请求的组件,一个引擎可以有一个或多个连接器,以适应多种请求方式。
默认只开启了处理
Http
协议的连接器。如果需要使用其他协议,需要在
Tomcat
中配置该协
议的连接器。
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
port
:监听的端口
protocol
:连接器使用的协议,默认为
HTTP/1.1;
connectionTimeout
:等待客户端发送请求的超时时间,单位为毫秒
;
redirectPort
:如果某连接器支持的协议是
HTTP
,当接收客户端发来的
HTTPS
请求时,
则转发至此属性定义的端口
;
maxThreads
:支持的最大并发连接数,默认为
200
个
;
4.Engine组件
Engine
是
Servlet
处理器的一个实例,即
servlet
引擎,定义在
server.xml
中的
Service 标
记中。
Engine
需要
defaultHost
属性来为其定义一个接收所有发往非明确定义虚拟主机的请
求的
host
组件。
<Engine name="Catalina" defaultHost="localhost">
name
:
Engine
组件的名称
;
defaultHost
:
Tomcat
支持基于
FQDN(Fully Qualified Domain Name
全限定域名
)
的虚拟主
机,这些虚拟主机可以通过在
Engine
容器中定义多个不同的
Host
组件来实现;但如果此引
擎的连接器收到一个发往非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的
虚拟主机进行处理,因此,在
Engine
中定义的多个虚拟主机的主机名称中至少要有一个跟
defaultHost
定义的主机名称同名;
5.Host组件
位于
Engine
容器中用于接收请求并进行相应处理的虚拟主机。通过该容器可以运行
Servlet
或者
JSP
来处理请求。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
name
:虚拟主机的名称,
Tomcat
通过在请求
URL
中的域名与
name
中的值匹配,用于
查找能够处理该请求的虚拟主机。如果未找到则交给在
Engine
中
defaultHost
指定的主机处
理;
appBase
:此
Host
的
webapps
目录,即指定存放
web
应用程序的目录的路径;
autoDeploy
:在
Tomcat
处于运行状态时放置于
appBase
目录中的应用程序文件是否自
动进行
deploy
;默认为
true
;
unpackWARs
:在启用此
webapps
时是否对
WAR
格式的归档文件先进行展开;默认为
true
;
6.Context组件
Context
是
Host
的子标签,代表指定一个
Web
应用,它运行在某个指定的虚拟主机(
Host
)
上;每个
Web
应用都是一个
WAR
文件,或文件的目录;
<Context path="/test" docBase="D:\bjsxt\itbaizhan.war" />
path
:context path 既浏览器访问项目的访问路径。
docBase
:相应的 Web
应用程序的存放位置;也可以使用相对路径,起始路径为此
Context
所属
Host
中
appBase
定义的路径;
3.Tomcat处理请求过程
1
、用户访问
localhost:8080/test/index.jsp
,请求被发送到
Tomcat
,被监听
8080
端口并
处理
HTTP/1.1
协议的
Connector
获得。
2
、
Connector
把该请求交给它所在的
Service
的
Engine
来处理,并等待
Engine
的回应。
3
、
Engine
获得请求
localhost/test/index.jsp
,匹配所有的虚拟主机
Host
。
4
、
Engine
匹配到名为
localhost
的
Host
虚拟主机来处理
/test/index.jsp
请求(即使匹配
不到会请求交给默认
Host
处理),
Host
会根据
/test
匹配它所拥有的所有的
Context
。
5
、匹配到的
Context
获得请求
/index.jsp
。
6
、构造
HttpServletRequest
对象和
HttpServletResponse
对象,作为参数调用
JspServlet
的
doGet
()或
doPost
()
.
执行业务逻辑、数据存储等程序。
7
、
Context
把执行完之后的结果通过
HttpServletResponse
对象返回给
Host
。
8
、
Host
把
HttpServletResponse
返回给
Engine
。
9
、
Engine
把
HttpServletResponse
对象返回
Connector
。
10
、
Connector
把
HttpServletResponse
对象返回给客户
Browser。
最后 创建一个Servlet案例
创建servlet
package tomcat.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorld extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>");
out.println("<HTML>");
out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
out.println("<BODY>");
out.println("<font color=blue>Hello World</font>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
编译
D:\>javac -classpath "D:\apache-tomcat-9.0.34\lib\servlet-api.jar" HelloWorld.java
创建 web.xml(项目的部署描述文件)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>com.bjsxt.servlet.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
创建Web工程目录结构
固定结构(文件名字和文件顺序,servlet文件写的包,对应到文件夹创建好,比如图中的文件本来是写在com.*****.servlet下的,所以创建了三个对应的文件夹)
访问Servlet
http://localhost:8080/servletdemo/hello
这样就算成功了
总结:
这个实例花的时间比较久,一开始做完的时候发现tomcat并不能顺利解析反馈,出现了404错误,然后我就开始找错误,不知道问题出在哪里,做了很多没有必要的工作
然后总结一下出问题的地方,希望下次注意点:
1.Webapps里面的固定格式不能错。
2.注意tomcat的版本对应的要求,之前没注意,使用javac的时候出现了警告,以为没事,
后来修改了(我用的是Tomcat9 我的JDK是7 所以出现警告并且出现问题(可能是这个引起的))。
3.就是单词拼写吧,在后面找错误的时候发现了好多单词拼写错误的。