9.Tomcat

9.1.web服务器
  • 服务器:安装了服务器软件的计算机

  • 服务器软件:接收用户的请求,处理请求,做出响应

  • web服务器软件:接收用户的请求,处理请求,做出响应。

    • 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
    • web容器
  • 常见的java相关的web服务器软件:

    • webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    • webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    • JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    • Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。
  • JavaEE:Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范

9.2.Tomcat
9.2.1.下载安装
  1. 下载:http://tomcat.apache.org/
  2. 安装:解压压缩包即可。
    • 注意:安装目录建议不要有中文和空格
  3. 卸载:删除目录就行了
  4. 启动:
    • bin/startup.bat ,双击运行该文件即可
    • 访问:浏览器输入:http://localhost:8080回车访问自己
      • http://别人的ip:8080 访问别人
  5. 可能遇到的问题:
    • 黑窗口一闪而过:
      • 原因: 没有正确配置JAVA_HOME环境变量
      • 解决方案:正确配置JAVA_HOME环境变量
    • 启动报错:
      • 暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
        • netstat -ano
      • 柔和:修改自身的端口号
        • 找到文件conf/server.xml
          `<Connector port=“8888” protocol=“HTTP/1.1”
               connectionTimeout="20000"
               redirectPort="8445" />`
          
    • 一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。
      • 好处:在访问时,就不用输入端口号
    • 关闭:
      • 正常关闭:
        • bin/shutdown.bat
        • ctrl+c
      • 强制关闭:
        • 点击启动窗口的×
9.2.2.配置环境
  • tomcat部署资源必须以一个应用为最小单位,如果希望部署一个资源文件,那么必须要将资源文件放置于某个应用内。
  • 应用:tomcat里面的一个最小单位,应用里面可以存放很多的资源文件
  • 新建一个应用:在webapps目录下新建一个目录,那么该目录就是一个应用,同时,目录的名称就是应用的名称。
  • 部署项目的方式:
    1. 直接部署:直接将所需要部署的资源放到webapps目录下的某一个应用里或新建一个应用并放入进去即可(最好避免直接放入webapps根目录)。
      • 部署资源文件也可以部署一个war包(类似于windows里面的压缩包,tomcat回自动将其解压缩为一个开放式目录)
      • 访问方式:web服务器的本质,其实就是将本地硬盘上面的某个文件的绝对路径给拿到。
        • 输入 http://localhost:8080 ,相当于此时tomcat已经定位到了webapps目录下,访问静态资源只需要去写出和webapps的相对路径关系即可。
    2. 虚拟映射:正常情况下,如果我们需要部署一个资源文件,我们是将该文件放置于tomcat的webapps目录下的,但是如果希望将资源文件放置于tomcat目录之外的其他地方,也可以访问到该资源文件,那么就需要通过虚拟映射的方式来部署,将该文件虚拟映射到webapps目录下。
      • 方式一:在conf/Catalina/localhost目录下去配置 ,新增一个xml文件
        • 如:在该目录下新增一个test.xml文件内容如下(前提条件是D盘目录下有一个app文件夹)
          <?xml version="1.0" encoding="UTF-8"?>  <!-- 标准头文件 -->
          <Context docBase="D:\app"/>  <!-- Context的首字母必须大写,表示应用,docBase里面的内容要写全路径名 -->
          
        • 在tomcat里面,最小的功能单位必须要求是应用,所以虚拟映射也需要有一个应用,tomcat会在启动的时候读取该xml文件,然后形成一个应用,应用的名称就是xml文件的名称(即该应用名是test)。
        • 输入http://localhost:8080/test 到硬盘的绝对路径为D:/app目录,去访问到某个静态资源文件,继续写出相对路径关系即可。
      • 方式二:conf/server.xml文件中去修改配置
        • 需要在Host节点下配置一个Context节点,不过此时需要在server.xml文件中去配置
        • 如:在Host节点下,配置一个应用名为temp的应用,且路径为资源路径为D:\app
          <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
          
              <!-- <Context/>使用最频繁的元素。代表了运行在虚拟主机上的单个Web应用。-->
              <!-- 不管什么方式部署配置的应用,启动的时候Tomcat都会将其解析加载成为一个Valve对象 -->
              <Context path="test" docBase="D:\app"/>
          
              <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          </Host>
          
        • 访问方式同方式一

        注:部署资源应该以应用为单位,即文件夹,而不是指定某个资源文件

9.3.Tomcat目录结构
  • bin:binary,二进制文件,启动停止Tomcat都在这个文件夹
  • conf:配置文件
  • lib:依赖资源库,jar包
  • logs:日志文件,可以查看报错信息
  • temp:临时文件存放
  • webapps:应用资源
  • work:工作目录
  • 其他文件

    将Tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目。

9.4.Tomcat组成结构
  • Tomcat本身由一系列可配置的组件构成,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器。每个组件都可以在Tomcat安装目录/conf/server.xml文件中进行配置,每个Tomcat组件在server.xml文件中对应一种配置元素。
  • 在sever.xml中,每一个结点就相当于Tomcat的每一个组件
<?xml version="1.0" encoding="UTF-8"?>

<!-- Server代表整个Sevlet容器组件,是最顶层的元素,可以包含一个或多个Sevice元素 -->
<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>包含一个<Engine>元素以及一个或多个<Connector>元素,这些<Connector>共享同一个<Engine> -->
    <Service name="Catalina">
		
        <!-- 监听8080端口,如果想实现多端口监听,再添加一个Connector结点即可 -->
        <!-- <Connector/>代表和客户程序实际交互的组件,负责接收客户请求,以及向客户返回响应 -->
        <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

        <!-- <Engine>每个<service>元素只能包含一个<Engine>元素。它处理在同一个<Service>中所有<Connector>接收到的客户请求。 -->
        <Engine name="Catalina" defaultHost="localhost">


            <Realm className="org.apache.catalina.realm.LockOutRealm">

                <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
            </Realm>

            <!-- <Host>在一个<Engine>中可以包含多个<Host>,它代表一个虚拟主机(网站)它可以包含一个或多个 web应用 -->
            <!-- 同一个Tomcat可以处理多个域名的请求,只需继续添加Host结点即可 -->
            <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
			
                
                <!-- <Context/>使用最频繁的元素。代表了运行在虚拟主机上的单个Web应用。-->
                <!-- 不管什么方式部署配置的应用,启动的时候Tomcat都会将其解析加载成为一个Valve对象 -->
                <!-- 这里原始的Sever.xml文件没有<Context/>标签 -->
                 
                
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

            </Host>
        </Engine>
    </Service>
</Server>
9.5.Tomcat请求执行流程
  • 以访问Http://localhost:8080/test/1.html为例,阐述一下完整的请求执行流程
    1. 浏览器内输入对应的网址,首先进行域名解析,tcp三次握手,浏览器会帮助我们去生成一个HTTP请求报文
    2. HTTP请求报文到达目标服务器之后,被监听着8080端口号的Connector接收到,将请求报文解析成为request对象,同时还会生成一个response对象将这并将两个对象传给engine。
    3. engine的职责也比较简单,如果由很多个host,那么就挑选一个合适的host;如果没有,则交给缺省的host
    4. host的职责就是去挑选一个合适的Context,然后将请求、响应对象进行进一步下发(tomcat完全可以生成一个应用名-----应用的映射关系,根据/app找到对应的应用,找到应用以后就可以找到docBase)
    5. Valve(Context)的职责就是根据应用的docBase + 最终的请求的资源,然后拼成一个绝对路径,new File.exitsts表示该文件存在,可不可以将文件的流写入到response中,如果不存在,可以往response里面写入一个不存在的状态码
    6. Connector读取response里面的内容,按照HTTP响应报文的要求,重新组装生成响应报文,发送出去
9.6.sever.xml文件配置
  1. 设置端口号
    • tomcat下载完之后,默认监听8080端口号,如果希望修改端口号,那么去修改对应的Connector。有一个需要特别说明的,前1024端口号建议不要去设置,因为很有可能操作系统会用,但是80端口号例外,80端口号实际上是http协议的默认端口号,使用http协议,并且没有写端口号,实际上使用的就是80端口号,如 http://localhost/app/1.html。没有端口号不是说没有使用端口号,而是使用的当前协议的默认端口号80。
  2. 设置缺省应用
    • ROOT其实就是缺省应用,http://localhost/app7/1.html,此时tomcat中并没有去配置一个/app7的应用,此时它会交给缺省ROOT应用来处理,如果ROOT下也没有1.html资源,那么会返回404,相当于保底。访问ROOT应用下面的资源时,直接把应用名去掉即可。 http://localhost/index.jsp 访问的是webapps下的ROOT里的index.jsp资源
  3. 设置默认访问页面
    • 如果请求中没有指明具体的访问页面,如http://localhost,那实际上访问的时默认页面,缺省页面。这个是在tomcat的conf/web.xml中进行配置的
      <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          <welcome-file>index.htm</welcome-file>
          <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      
    • 实际上如果请求的url并没有指明访问的具体资源,那么就会在当前应用下去寻找这些welcome-file,如果找到,则加载,如果找不到则返回404