部署tomcat项目

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
image.png

访问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方法

你可能感兴趣的:(tomcat,servlet)