共计 2730 个字符,预计需要花费 7 分钟才能阅读完成。
mac 上间接启动 tomcat
切到目录 apache-tomcat-8.5.32/bin
执行命令 sh startup.sh
启动胜利 terminal 上能够看到 Tomcat started.
拜访 http://localhost:8080/ bingo
敞开 tomcat 的时候执行命令 sh shutdown.sh
跑一个 tomcat 目录下的我的项目 apache-tomcat-8.5.32/webapps
比方这个目录下有一个 manager 我的项目, 外面提供了一个 index.jsp
拜访 http://localhost:8080/manager/index.jsp
比方 examples 中配置的 web.xml 中有一条
<servlet-mapping>
<servlet-name>HelloWorldExample</servlet-name>
<url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
</servlet-mapping>
拜访 http://localhost:8080/examples/servlets/servlet/HelloWorldExample
idea 只含一个 servlet 的 tomcat web
新建一个 java web 我的项目
new project -> java enterprise -> 抉择 tomcat 作为 application server -> 勾选 create project from template
创立一个 servlet,在 web.xml 中配置相应的 servlet 配置
配置 tomcat(配置过程省略),配置 Deployment 的时候 Application context 配置成和我的项目一样的名字
启动 tomcat,拜访 http://localhost:8080/selfjavawebproj/myservlet
selfjavawebproj 是 web application 的名字,myservet 须要是在 web.xml 中配置的门路
tomcat 的容器层级
tomcat 的 Servlet 容器分为了四层,Engine->Host->Context->Wrapper
最内层的 Wapper 示意一个 Servlet,Context 示意一个应用程序,一个应用程序中会蕴含多个 servlet,Host 示意一个站点,一个站点下能够有多个应用程序,Engine 示意引擎,用来治理多个站点。
在 tomcat 中的 conf/server.xml 中,能够配置多个 service
以我的配置文件为例
<server>
<Service name="Catalina"> // 一个 service 下能够有多个 connector,一个 engine
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<Engine name="Catalina" defaultHost="localhost">// 蕴含多个 host
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Engine>
</service>
<service>
</service>
</server>
tomcat 实现容器的时候定义了 Container,外面定义了 parent child 这种角色,通过组合模式组装每一层级的容器
public interface Container extends Lifecycle {public void setName(String name);
public Container getParent();
public void setParent(Container container);
public void addChild(Container child);
public void removeChild(Container child);
public Container findChild(String name);
}
http://localhost:8080/selfjavawebproj/myservlet
当收回这个申请时,
1 首先依据协定和端口号抉择 service 和 Engine,对应下面的配置,只有一个 service 且连接器反对 HTTP1.1,端口 8080,所以找到了 name 为 Catalina 的 service 和 name 为 Catalina 的 Engine
2 依据拜访的域名 localhost 找到对应的 host
3 依据 url 找到 context,所以在后面配置的时候 Application context 配置的也是利用名称,在这里 context 就是 selfjavawebproj
4 依据 url 找到 Wrapper,即依据配置的门路在 web.xml 中找到对应的 servlet 实现类
然而并不是只有到了最初的 Wrapper 才真正开始解决申请,在两头的每一层都会对申请做这一层的解决,比方 Engine 先拿到申请,解决完 Engine 层的逻辑将申请给本人的 child Host 层,最初才到 Wrapper —— pipeline 责任链模式
具体在 tomcat 这块是 Pipeline-Valve 管道
Value 示意一个解决点
public interface Valve {public Valve getNext();
public void setNext(Valve valve);
public void invoke(Request request, Response response)
}
Value 中的 invoke 示意以后这个解决点的解决逻辑,getNext 示意获取下一个解决点,getNext.invoke 就触发了下一个解决点的解决逻辑
public interface Pipeline extends Contained {public void addValve(Valve valve);
public Valve getBasic();
public void setBasic(Valve valve);
public Valve getFirst();}
pipeline 保护了这个 value 链,First 是链的第一个,Basic 是链的最初一个,Basic 是关联下一级容器的第一个 value
最初一级 Wrapper 的 Basic 指向 Filter 链,调用 Filter 链中 doFilter 办法,最初走到 Servlet 中的 service 办法