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中有一条
HelloWorldExample
/servlets/servlet/HelloWorldExample
访问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
以我的配置文件为例
//一个service下可以有多个connector,一个engine
//包含多个host
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方法