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.下载安装
- 下载:
http://tomcat.apache.org/
- 安装:解压压缩包即可。
- 注意:安装目录建议不要有中文和空格
- 卸载:删除目录就行了
- 启动:
- bin/startup.bat ,双击运行该文件即可
- 访问:浏览器输入:
http://localhost:8080
回车访问自己- http://别人的ip:8080 访问别人
- 可能遇到的问题:
- 黑窗口一闪而过:
- 原因: 没有正确配置JAVA_HOME环境变量
- 解决方案:正确配置JAVA_HOME环境变量
- 启动报错:
- 暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
- netstat -ano
- 柔和:修改自身的端口号
- 找到文件conf/server.xml
`<Connector port=“8888” protocol=“HTTP/1.1”connectionTimeout="20000" redirectPort="8445" />`
- 找到文件conf/server.xml
- 暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
- 一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。
- 好处:在访问时,就不用输入端口号
- 关闭:
- 正常关闭:
- bin/shutdown.bat
- ctrl+c
- 强制关闭:
- 点击启动窗口的×
- 正常关闭:
- 黑窗口一闪而过:
9.2.2.配置环境
- tomcat部署资源必须以一个应用为最小单位,如果希望部署一个资源文件,那么必须要将资源文件放置于某个应用内。
- 应用:tomcat里面的一个最小单位,应用里面可以存放很多的资源文件
- 新建一个应用:在webapps目录下新建一个目录,那么该目录就是一个应用,同时,目录的名称就是应用的名称。
- 部署项目的方式:
- 直接部署:直接将所需要部署的资源放到webapps目录下的某一个应用里或新建一个应用并放入进去即可(最好避免直接放入webapps根目录)。
- 部署资源文件也可以部署一个war包(类似于windows里面的压缩包,tomcat回自动将其解压缩为一个开放式目录)
- 访问方式:web服务器的本质,其实就是将本地硬盘上面的某个文件的绝对路径给拿到。
- 输入
http://localhost:8080
,相当于此时tomcat已经定位到了webapps目录下,访问静态资源只需要去写出和webapps的相对路径关系即可。
- 输入
- 虚拟映射:正常情况下,如果我们需要部署一个资源文件,我们是将该文件放置于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目录,去访问到某个静态资源文件,继续写出相对路径关系即可。
- 如:在该目录下新增一个test.xml文件内容如下(前提条件是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 "%r" %s %b" /> </Host>
- 访问方式同方式一
注:部署资源应该以应用为单位,即文件夹,而不是指定某个资源文件
- 方式一:在conf/Catalina/localhost目录下去配置 ,新增一个xml文件
- 直接部署:直接将所需要部署的资源放到webapps目录下的某一个应用里或新建一个应用并放入进去即可(最好避免直接放入webapps根目录)。
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 "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
9.5.Tomcat请求执行流程
- 以访问
Http://localhost:8080/test/1.html
为例,阐述一下完整的请求执行流程- 浏览器内输入对应的网址,首先进行域名解析,tcp三次握手,浏览器会帮助我们去生成一个HTTP请求报文
- HTTP请求报文到达目标服务器之后,被监听着8080端口号的Connector接收到,将请求报文解析成为request对象,同时还会生成一个response对象将这并将两个对象传给engine。
- engine的职责也比较简单,如果由很多个host,那么就挑选一个合适的host;如果没有,则交给缺省的host
- host的职责就是去挑选一个合适的Context,然后将请求、响应对象进行进一步下发(tomcat完全可以生成一个应用名-----应用的映射关系,根据/app找到对应的应用,找到应用以后就可以找到docBase)
- Valve(Context)的职责就是根据应用的docBase + 最终的请求的资源,然后拼成一个绝对路径,new File.exitsts表示该文件存在,可不可以将文件的流写入到response中,如果不存在,可以往response里面写入一个不存在的状态码
- Connector读取response里面的内容,按照HTTP响应报文的要求,重新组装生成响应报文,发送出去
9.6.sever.xml文件配置
- 设置端口号
- tomcat下载完之后,默认监听8080端口号,如果希望修改端口号,那么去修改对应的Connector。有一个需要特别说明的,前1024端口号建议不要去设置,因为很有可能操作系统会用,但是80端口号例外,80端口号实际上是http协议的默认端口号,使用http协议,并且没有写端口号,实际上使用的就是80端口号,如
http://localhost/app/1.html
。没有端口号不是说没有使用端口号,而是使用的当前协议的默认端口号80。
- tomcat下载完之后,默认监听8080端口号,如果希望修改端口号,那么去修改对应的Connector。有一个需要特别说明的,前1024端口号建议不要去设置,因为很有可能操作系统会用,但是80端口号例外,80端口号实际上是http协议的默认端口号,使用http协议,并且没有写端口号,实际上使用的就是80端口号,如
- 设置缺省应用
- ROOT其实就是缺省应用,
http://localhost/app7/1.html
,此时tomcat中并没有去配置一个/app7的应用,此时它会交给缺省ROOT应用来处理,如果ROOT下也没有1.html资源,那么会返回404,相当于保底。访问ROOT应用下面的资源时,直接把应用名去掉即可。http://localhost/index.jsp
访问的是webapps下的ROOT里的index.jsp资源
- ROOT其实就是缺省应用,
- 设置默认访问页面
- 如果请求中没有指明具体的访问页面,如
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
- 如果请求中没有指明具体的访问页面,如