#Tomcat安装与运行 Web服务器完成底层的网络处理,包括HTTP协议报文格式的编解码、管理具体web请求处理线程等操做。
Tomcat目前最流行最多见的基于Java的web应用服务器软件。 ##Tomcat Apache Tomcat 官网html
##Tomcat安装过程 ###下载Tomcat 7.0.x 经过官网Tomcat 7 Software Downloads页面,咱们能够看到zip包。经过超级连接获取7.0.77版本的zip下载路径为http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.70/bin/apache-tomcat-7.0.70.zip
若是Linux系统链接网络,则能够经过以下命令进行下载:java
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.70/bin/apache-tomcat-7.0.70.zip
若是没有联网能够在Windows下载Tomcat,经过FileZilla软件发送安装包到Linux ###解压缩Tomcat Tomcat官网提供了两种压缩包zip和tar.gz方式。
Windows系统能够下载7zip软件或者WinRAR软件进行解压缩。
Linux系统zip方式解压缩命令:linux
yum install unzip -y unzip apache-tomcat-7.0.70.tar.gz
Linux系统tar.gz方式解压缩命令:web
tar xzvf apache-tomcat-7.0.70.tar.gz
###配置CATALINA_HOME环境变量 ####Linux 进入解压缩后的apache-tomcat-7.0.xx的目录,在目录下执行apache
export CATALINA_HOME=/home/zhanpeng/build/tomcat/apache-tomcat-7.0.70
经过echo $CATALINA_HOME
检查所配置的路径是否正确。bootstrap
zhanpeng@GE70:~/build/tomcat/apache-tomcat-7.0.70$ echo $CATALINA_HOME /home/zhanpeng/build/tomcat/apache-tomcat-7.0.70
####Windows设置环境变量windows
set CATALINA_HOME=D:\build\tomcat\apache-tomcat-7.0.70
检查环境变量api
echo %CATALINA_HOME%
####Mac OS X设置环境变量 两种配置方式:第一种全局配置,编辑/etc/profile
,第二种只应用到当前用户,编辑~/.bash_profile
。若是要应用环境变量,则须要使用source /etc/profile
或者source ~/.bash_profile
进行启用,或者从新登录用户或者重启计算机。 ##启动Tomcat浏览器
###演示linux tomcat启动过程 ####1.检查环境变量tomcat
zhanpeng@GE70:~/build/tomcat/apache-tomcat-7.0.70$ echo $CATALINA_HOME /home/zhanpeng/build/tomcat/apache-tomcat-7.0.70
####2.修改Tomcat执行权限 若是解压缩tomcat这个时候执行,则没有权限
echo $CATALINA_HOME $CATALINA_HOME/bin/startup.sh bash: /home/zhanpeng/build/tomcat/apache-tomcat-7.0.70/bin/startup.sh: Permission denied
修改权限:
$chmod +x $CATALINA_HOME/bin/*
执行:
$CATALINA_HOME/bin/startup.sh Using CATALINA_BASE: /home/zhanpeng/build/tomcat/apache-tomcat-7.0.70 Using CATALINA_HOME: /home/zhanpeng/build/tomcat/apache-tomcat-7.0.70 Using CATALINA_TMPDIR: /home/zhanpeng/build/tomcat/apache-tomcat-7.0.70/temp Using JRE_HOME: /usr Using CLASSPATH: /home/zhanpeng/build/tomcat/apache-tomcat-7.0.70/bin/bootstrap.jar:/home/zhanpeng/build/tomcat/apache-tomcat-7.0.70/bin/tomcat-juli.jar Tomcat started.
经过浏览器查看到以下界面: 经过浏览器进行查看 注意:若是不是本机打开浏览器访问,远程打开Tomcat,注意Linux或者Windows的防火墙配置,开发8080端口(若是修改Tomcat端口请自行注意)。若是对防火墙配置有问题,开发时能够关闭防火墙,进行开发。
##Tomcat资源 静态资源 动态资源,Servlet课程
##动态资源与静态资源概念 ###目录结构 ###静态资源SoybeanMilk.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>Soybean Milk</h1> </body> </html>
###动态资源NoodlesServlet.java 手动编译在WEB-INF/classes/com.netease下 idea编译在src/com.netease下编译
package com.netease; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Created by zhanpeng on 16-8-20. */ public class NoodlesServlet extends HttpServlet { protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException { PrintWriter writer = response.getWriter(); String vegetable = request.getParameter("vegetable"); if(vegetable == null) vegetable = "Tomato"; writer.println("<html><body>"); writer.println("<h1> Noodles with " + vegetable + "</h1>"); writer.println("</html></body>"); } }
###添加servlet到web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Restaurant</display-name> <servlet> <servlet-name>noodles</servlet-name> <servlet-class>com.netease.NoodlesServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>noodles</servlet-name> <url-pattern>/noodles</url-pattern> </servlet-mapping> </web-app>
###编译或者添加tomcat类库运行 ####手动编译
javac -cp /home/zhanpeng/build/tomcat/apache-tomcat-7.0.70/lib/servlet-api.jar WEB-INF/classes/com/netease/NoodlesServlet.java
####添加tomcat类库 ###静态资源
http://localhost:8080/SoybeanMilk.html
无论咱们如何加入参数,页面不变
咱们事先准备好的,叫作静态资源,静态资源像图片常见的文档。 ###动态资源
http://localhost:8080/noodles
显示Noodles with Tomato
http://localhost:8080/noodles?vegetable=Apple
显示Noodles with Apple
动态页面根据咱们参数的不一样,会显示不一样内容页面。根据不一样的请求返回不一样结果。
##关闭Tomcat
#Tomcat的组成、架构与配置部署 ##Tomcat目录结构
###bin目录
####启动脚本 JVM启动参数配置:可使用环境变量
export JAVA_OPTS="-server =xms2048m -Xmx2048m" echo $JAVA_OPTS
若是想要永久有效须要写入到~/.bashrc下 ###conf目录 最主要的配置文件为server.xml ####server.xml server.xml结构
<?xml version='1.0' encoding='utf-8'?> <Server > <Listener></Listener> <Service name="Catalina"> <Connector></Connector> <Connector></Connector> <Engine> <Host> <Context></Context> </Host> </Engine> </Service> </Server>
Server下面能够有多个Service和多个Connector。一个Service必须有一个Engine,Engine是处理Connector接收到的数据内容。JDK的java由Engine执行。Engine里面有多个Host,Host是虚拟主机,请求加入不一样的Host头,跳转到。一个Host能够有多个Context。Context为Web应用。 service咱们叫作Container(容器)。整个Server就是Tomcat。
##请求处理流程 浏览器发送请求,由Connector接收处理socket数据信息。Container根据Connector解析内容生成具体的响应。
#Tomcat的Connector及线程池配置 ##Connector参数配置
protocol="HTTP/1.1"
,涉及调优才进行调整<Connector port="8181" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
默认没有配置线程池,配置中被注释掉了
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>
应用Connector应用Executor,注意要和Executor name相同
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" executor="tomcatThreadPool" redirectPort="8443" />
重启Tomcat,查看效果。 命令查看请求:
curl http://localhost:8080/noodles <html><body> <h1> Noodles with Tomato</h1> </html></body>
命令占用请求:
客户端0:
telnet localhost 8181 GET /noodles HTTP/1.1
客户端1:
telnet localhost 8181 GET /noodles HTTP/1.1
当线程池为1时,客户端0阻塞线程,则客户端1都没法获取结果;客户端0结束,客户端1也会执行完成。 ##线程池配置 *Executor配置线程池
#Tomcat日志配置与war包部署 ##Tomcat日志 服务发生中断,则须要知道
###访问日志配置文件server.xml
<!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
###修改日志文件命名 ####日志实现AccessLogValve ####direcory Valve的directory日志存放目录 ####pattern prefix日志文件的前缀 ####suffix suffix日志文件的后缀 ####pattern pattern指日志的格式。
pattern内%r指HTTP 请求行;%s HTTP相应号;%t访问时间;%m请求方法,%a请求的IP地址;%s用户响应码;%b服务端下发多少字节;%{User-Agent}i指User-Agent;"
;
###日志文件切割
fileDateFormat="yyyy-MM-dd.HH." #按照参数进行切割 rotatable="true" #是否切分
修改后的日志配置
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="hava_access_log." suffix=".log" fileDateFormat="yyyy-MM-dd.HH." rotatable="true" pattern="method: %m,client ip: %a,time: %t,"%r" statusCode: %s,byteSent: %b,User-Agent: %{User-Agent}i" />
重启Tomcat后,产生日志文件hava_access_log.2016-08-20.14.35.log,Chrome访问内容为:
method: GET,client ip: 127.0.0.1,time: [20/Aug/2016:14:36:30 +0800],"GET / HTTP/1.1" statusCode: 200,byteSent: 11418,User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36
curl访问内容为:
method: GET,client ip: 127.0.0.1,time: [20/Aug/2016:14:37:43 +0800],"GET / HTTP/1.1" statusCode: 200,byteSent: 11418,User-Agent: curl/7.35.0
##Tomcat文档 Tomcat 7 文档
##Tomcat部署Web应用
jar cvf package.war .
进行打包jar cvf Restaurant.war . added manifest adding: SoybeanMilk.html(in = 143) (out= 110)(deflated 23%) adding: index.jsp(in = 295) (out= 224)(deflated 24%) adding: WEB-INF/(in = 0) (out= 0)(stored 0%) adding: WEB-INF/classes/(in = 0) (out= 0)(stored 0%) adding: WEB-INF/classes/com/(in = 0) (out= 0)(stored 0%) adding: WEB-INF/classes/com/netease/(in = 0) (out= 0)(stored 0%) adding: WEB-INF/classes/com/netease/NoodlesServlet.class(in = 1371) (out= 687)(deflated 49%) adding: WEB-INF/web.xml(in = 632) (out= 270)(deflated 57%) zhanpeng@GE70:~/Workspace/J2ee/TomcatStudy/out/artifacts/TomcatStudy_war_exploded$
注意:这种方式会把隐藏文件也打包到war包内。 把war包放到webapps目录下,能够直接访问。Tomcat会自动解压缩war包内容。 #附录 ##Tomcat FAQ ###Q:Tomcat使用哪一个版本的?
A: 目前Tomcat最新开发版是9.0.x,最新稳定版是8.0.x,通常在生产环境使用比较多的版本仍是7.0.x。本微专业选择的Tomcat版本是7.0.x。更新的版本之间不过是实现了更多的一些新特性,咱们的微专业中并无涉及到这些新特性,所以7.0.x是足够的
###Q: 我在Windows下,Tomcat怎么安装以及使用?
A:
###Q: 我彻底不会Linux,在windows下,跟老师的演示环境不同,怎么办?
A:
###Q: 我都跟老师作的同样,为何出错了?
A: 当你们遇到错误的时候,但愿能按下面给出的步骤进行排查
###Q: 经过一些书和其余教程,我学会了在eclipse中直接建立一个Web项目,跟这里纯手动建立一个web项目相比有一些疑问:
A:
eclipse 默认建立tomcat7的项目里面并无web.xml文件,那么tomcat是如何找到相关servlet的? 若是没有servlet,仅仅是jsp加上静态文件的话,web.xml是能够省略的 即便生成了servlet,在新的servlet规范里面,也支持了使用Annotation的方式来配置servlet,跟使用web.xml的方式是等价的 你看一下生成的类上面应该有 @WebServlet 的定义
经过eclipse建立的项目中会有一个叫WebContent的目录,这个和咱们手动建立的Restaurant项目有何不一样? 源码层面的文件结构能够千差万别,可是最终部署的时候,项目文件结构必须知足servlet规范。只是eclipse默认建立的项目是这样作的而已,eclipse默认建立的项目跟咱们手动建立的Restaurant项目没有啥本质不一样。后面咱们还会讲到Maven,让Maven来管理咱们的Web项目,他们最终编译打包后的文件结构是同样的。
为何将eclipse建立的项目手动拷到tomcat7.0.65下webapps目录下,启动后 没法访问里面的servlet 我应该如何访问这个servlet? 估计你是搞混了源码跟编译打包后的二进制。你把eclipse建立的项目编译后打成一个war包,而后把这个war包放到webapps目录下,就能够跑了 另外,war包自己是一个zip格式的压缩包,你能够把它解压开,而后看一下里面的内容,以及里面的文件结构,跟咱们Restaurant的文件结构必定是一致的,全部这一切工做都是eclipse在背后默默帮你完成了 咱们在Restaurant里面,只是把这一切都纯手动化了,为了是让你们真正地明白一个Web项目在部署的时候长什么样子,而不是简单地告诉你怎样在IDE里面作
###Q: 我使用了网易蜂巢提供的Java Web镜像,里面的安装的tomcat7的目录结构怎么找不到? A: 咱们在网易蜂巢提供的Java Web镜像,其是一个Debian系统,里面的tomcat7是使用包管理工具apt-get/aptitude 进行安装管理的。Debian在打包tomcat7的时候,遵循了其系统的管理,那就是对任何一个软件,其不一样的功能的文件会分到不一样的目录中,对于tomcat7,具体对应以下:
bin -> /usr/share/tomcat7/bin
lib -> /usr/share/tomcat7/lib
conf -> /var/lib/tomcat7/conf
webapps -> /var/lib/tomcat7/webapps
logs -> /var/lib/tomcat7/logs
work -> /var/lib/tomcat7/work
对于启动/中止 tomcat,请直接使用已经封装好的服务方式,使用的命令为
service tomcat7 start service tomcat7 stop
想看运行状态,可使用命令
service tomcat7 status
###Q: 我运行Tomcat报错,Class com.netease.NoodlesServlet is not a Servlet,怎么办? A: 不少同窗会纳闷,个人类明明是从HttpServlet继承下来的,怎么就不是Servlet了。这个是由于JVM在肯定一个类的时候,不只仅根据这个类的名字,还有加载这个类的类加载器,只有这两个都一致的时候,才认为是同一个类。因为在JVM在不一样的加载阶段使用不一样的类加载器,Tomcat内部也实现了本身的类加载器,形成这个问题的缘由就是类加载器冲突形成的。解决方案以下: