Tomcat的简单归纳总结

2017年08月09日 12:39:23 大道之简 阅读数:1072
 
 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HcJsJqJSSM/article/details/76981659

      Tomcat的简单归纳总结

一:开门见山--->Tomcat的两种平台的安装简单介绍

   1.1Window平台的安装--->

    使用解压版的就可以了,安装版的使用的较少一些.下载地址:

Tomcat下载地址:http://tomcat.apache.org/.
解压后就是一个目录:apache-tomcat-7.0.77(我之前用的是比较旧的版本);
1.2就是配置环境变量的(是普遍使用JSP/Servlet的优秀容器,所以需要安装好Java的环境,比较简单就不在介绍了,PS:网上的教程比较多,比较全的)--->
CATALINA_HOME:C:\apache-tomcat-7.0.77。
CATALINA_BASE:C:\apache-tomcat-7.0.77
这样是启动tomcat的使用才会找到的.例如在Eclipse下启动tomcat的过程中留意看一下控制台前面的信息:
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server version:        Apache Tomcat/7.0.77
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server built:          Mar 28 2017 16:01:48 UTC
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server number:         7.0.77.0
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: OS Name:               Windows 8.1
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: OS Version:            6.3
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Architecture:          amd64
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Java Home:             C:\Program Files\Java\jdk1.8.0_121\jre
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: JVM Version:           1.8.0_121-b13
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: JVM Vendor:            Oracle Corporation
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: CATALINA_BASE:         C:\apache-tomcat-7.0.77
八月 09, 2017 10:11:16 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: CATALINA_HOME:         C:\apache-tomcat-7.0.77
1.3:Windows下的Tomcat的启动关闭(以解压版的说一下):
来到bin目录下:看到startup.bat,shutdown.bat,startup.sh,shutdown.sh。(前两个是Window下的启动关闭,后面试Linux下的启动关闭).直接点击使用,简单粗暴就不在细说了.默认是使用的8080端口的.使用TCP/IP协议.建立TCP连接的.打开浏览器查看
输入地址:http://localhost:8080/就可以了.也可以使用http://127.0.0.1:8080/,(那个127.0.0.1就是预留给本地软件环回测试使用的意思都一样的.)都可以看到那个经典的小猫首页的。
直接关闭就可以了.
1.4:Linux下的安装介绍:
获得Linux下的安装包,我用的是apache-tomcat-7.0.47.tar.gz(使用tar打包的,Gzip压缩过的).
Linux环境的搭建就不在演示了,使用VMware虚拟机的安装,使用CentOS的Linux distributions就可以了.
接下来就使用远程得登录工具将压缩包传上去.推荐使用SSH这个远程工具的,免费简单好用(打波广告,哈哈).还用SecureCRT等看自己的使用爱好的,求同存异吧。使用得都是SFTP文件传输协议嘛.来到正题吧.
1:首先使用SecureCRT的SFTP上传协议上传Window的Linux版的tomcat的tar.gz的包,然后压缩.
2:将解压的apache-tomcat-7.0.47的文件移动到
mv apache-tomcat-7.0.47 /usr/local/src/java/tomcat7下
3:进入到apache-tomcat-7.0.47下的目录中去,使用VIM编辑器修改conf下的server.xml中的端口号,这里修改为9999的
4:到bin下去启动 。./startup.sh如果端口没有被占用的话就可以启动成功的.可以到tomcat的目录下去查看logs日志的信息,cat alia.out就可以查看到启动成功的日志信息的。
Linux的命令使用就不在演示了。这些切换目录,查看信息,创建目录,解压缩,复制,移动,重命名,VIM编辑器的简单使用,三种常用的命令模式的转换,管道命令,管理套件的,查看进程的信息等常用的命令,再好好复习复习嘛.
修改了端口,但是这个端口防火墙并不是默认开放的嘛比不了Nginx的默认80,并且是开放的,演示开放端口的命令:
/sbin/iptables -I INPUT -p tcp --dport 9999 -j ACCEPT
/etc/rc.d/init.d/iptables save
1.5Linux的启动和关闭简单介绍:
来到bin目录下:使用ls命令可以看到和Windows下bin目录下可执行文件的.
使用命令: sh startup.sh就可以启动了.但是看不清楚启动过程的,使用命令: tail -f ../logs/catalina.out就可以看到了.
在Windons里面浏览器里面输入:您的ip地址+开放的端口即可看到的.(不知道ip的,弱弱的补一句命令:ifconfig,有别于Windows的ipconfig的).
例如我这里是192.168.217.137:9999的如果每一步都是按照步骤来的,就会再次看到那个经典的猫猫首页了(不过这是在Linux下的tomcat的启动的).
关闭就比较简单了:使用sh shutdown.sh.还是Linux下的命令比较好用的,不用配置环境变量的.
安装Tomcat可以说是安装JAVA,MySql,Nginx,Redis相比较中最简单的,最起码不用配置的.
至此Linux下和Windows的安装就简单的介绍完毕了,至于安装测试的过程中,遇到的问题,没有看到那个可爱的猫猫,这里统一回复一下就是几个细节没有注意到.在仔细操作一遍,之前安装失败了,就把前面的的删除掉,如果是端口被占用了,就找到那个端口被那个进程占用了,方便的杀死就可以的.kill -9 pid.
二:前面的都是一些准备工作的,接下来就是重点介绍一些了吧.
2.1Tomcat的各个目录介绍.
bin:该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe、tomcat6w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗口启动Tomcat;如果是解压版,那么会有startup.bat和shutdown.bat文件,startup.bat用来启动Tomcat,但需要先配置JAVA_HOME环境变量才能启动,shutdawn.bat用来停止Tomcat;
conf:这是一个非常非常重要的目录,这个目录下有四个最为重要的文件:
  • server.xml:配置整个服务器信息。例如修改端口号,添加虚拟主机等;下面会详细介绍这个文件;
  • tomcatusers.xml:存储tomcat用户的文件,这里保存的是tomcat的用户名及密码,以及用户的角色信息。可以按着该文件中的注释信息添加tomcat用户,然后就可以在Tomcat主页中进入Tomcat Manager页面了;
  • web.xml:部署描述符文件,这个文件中注册了很多MIME类型,即文档类型。这些MIME类型是客户端与服务器之间说明文档类型的,如用户请求一个html网页,那么服务器还会告诉客户端浏览器响应的文档是text/html类型的,这就是一个MIME类型。客户端浏览器通过这个MIME类型就知道如何处理它了。当然是在浏览器中显示这个html文件了。但如果服务器响应的是一个exe文件,那么浏览器就不可能显示它,而是应该弹出下载窗口才对。MIME就是用来说明文档的内容是什么类型的!
  • context.xml:对所有应用的统一配置,通常我们不会去配置它。
lib:Tomcat的类库,里面是一大堆jar文件。如果需要添加Tomcat依赖的jar文件,可以把它放到这个目录中,当然也可以把应用依赖的jar文件放到这个目录中,这个目录中的jar所有项目都可以共享之,但这样你的应用放到其他Tomcat下时就不能再共享这个目录下的Jar包了,所以建议只把Tomcat需要的Jar包放到这个目录下;
logs:这个目录中都是日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,那么异常也会记录在日志文件中。
temp:存放Tomcat的临时文件,这个目录下的东西可以在停止Tomcat后删除!
webapps:存放web项目的目录,其中每个文件夹都是一个项目;如果这个目录下已经存在了目录,那么都是 tomcat自带的。项目。其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。http://localhost:8080/hello,其中hello就是项目名,即文件夹的名字。
work:运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!可以把这个目录下的内容删除,再次运行时会生再次生成work目录。当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。
通过这些目录就可以知道Tomcat的简单的结构.
2.2简单的说一下有几个常见的问题:
那个运行的文件在work下,会引起tomcat的缓存的问题的,如果有遇到的话,建议将work目录下得Catalina这个删除掉即可了.这个目录下有运行的文件的,进入查看后会发现,jsp的文件会被编译为Servlet的,命名格式是这样的:例如index.jsp,会编译为index_jsp.java,字节码, index_jsp.class的.
在Eclipse中配置Tomcat可是比较简单的,关键是项目发布的位置了,如果直接new 一个server的,不打开修改一下路径的话,就会发布到Eclipse的克隆服务器的.如果是多个就会以temp0,temp1等的命名格式.会有一个wtpwebapps的目录,项目就会发布到那个在那的.打开Eclipse如果想发布到自己安装的那个tomcat中的webapps下就建议修改一下吧.
图片如下: 
Tomcat的简单归纳总结
启动Tomcat后无法启动就报无效的UTF字符
Server instance is not configured.
解决方法:
是无法解析Tomcat 下的Server.xml文件,不是没有写UTF-8的格式,而是最近打开了server.xml文件时,保存的时候是以文档格式的保存方式,修改为UTF-8的格式就可以了,这样Tomcat就可以解析server.xml格式的xml文件了,这样Tomcat就可以成功启动了; 
tomcat的默认编码是ISO-8859-1的。如何修改才能是我们的get和post请求不发生乱码呐?(乱码的原因可以归结为一句话,发送过去服务端的和要显示在客户端的不是编码格式不统一!)
如果使用SSM框架结合Maven的项目构建工具,要配置一个编码过滤器的.统一使用UTF-8的国际编码代码如下:
<!--设置编码过滤器 -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
至于GET的请求就使用UTF-8编码就可以了.
但是这只是可以解决POST的请求中文的编码的,GET请求中文的时候会依然乱码的。遇到问题总是要解决的嘛,来回看get的乱码.
response.setContentType("text/html;charset=UTF-8");是控制浏览器的行为,就是要浏览器使用UTF-8进行编码.
response.setCharacterEncoding("UTF-8");这个是用于response.getWriter()输出字符流的乱码问题的,将responses中的对象数据 进行以UTF-8解码后发向浏览器.
通过<meta http-equiv=“content-type" content="text/html"/>等价于response.setContentType("text/html").

不使用编码过滤器的时候,在使用JSP/Servlet的时候.如何处理GET和POST的中文乱码问题:
Get中文请求的乱码解决:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将get传过来的参数重新编码
String username=new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
//发送的内容指定编码的格式
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(username);
}
Post中文请求的乱码解决:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String username=request.getParameter("username");
response.getWriter().write(username);
}

还有一种解决方法:就是在tomcat的配置文件中指定编码格式的:

打开tomcat下的conf目录下的server.xml文件修改配置文件
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>.

三:Tomcat的结构分析--->
Tomcat服务器也好,Nginx官方说是可以支持50000的并发的轻量级的服务器也罢,都是基于模块的结构的.

Tomcat的总体结构如下图所示:核心组件是Connector和Container这两个组件
一个Container可以对应多个Connector的这样就组成了一个Service的,这样就可以提供服务了。
如图:
Tomcat的简单归纳总结
Tomcat的工作原理简单介绍:
一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),Tomcat中有两个经典的Connector,一个直接侦听来自Browser的HTTP请求,另外一个来自其他的WebServer请求。Cotote HTTP/1.1 Connector在端口8080处侦听来自客户Browser的HTTP请求,Coyote JK2 Connector在端口8009处侦听其他Web Server的Servlet/JSP请求。 Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。
Tomcat的简单归纳总结
Container的体系结构是典型使用了责任链的模式
Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。 
Context 还可以定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。
  • Engine 容器
Engine 容器比较简单,它只定义了一些基本的关联关系
  • Host 容器
Host 是 Engine 的字容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。
  • Context 容器
Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中,在前面的时序图中就可以发现获取子容器都是通过 request 来分配的。
  • Wrapper 容器
Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。 
Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道
下面从server.xml的结构来看tomcat
<server>
<service>
<connector /> 简单组件,不需要封装
<engine>
<host>
<context>
</context>
</host>
<host>
</host>
</engine>
</service>
</server>
host虚拟主机。
四:Tomcat的工作分析--->
Tomcat Server处理一个HTTP请求的过程(没有改端口的)
将WAR包放到webapps的目录下Tomcat启动会自动解压的,Linux下使用的比较多的.将项目部署至Linux*问.
案例url: http://localhost:8080/test/index.jsp
1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。 
2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。 
3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。 
4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。 
5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。 
6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。 
7、Context把执行完之后的HttpServletResponse对象返回给Host。 
8、Host把HttpServletResponse对象返回给Engine。 
9、Engine把HttpServletResponse对象返回Connector。 
10、Connector把HttpServletResponse对象返回给客户Browser。
至此十步完成了一个请求的发送到收到响应.
五:Tomcat的热部署--->
5.1: Tomcat的热部署的定义:
Tomcat的热部署就是在修改项目的BUG的时候修改JSP和JAVA的代码的时候,在不重启WEB服务器的时候让修改的内容生效,但如果修改的是框架的配置文件 时就不生效了. 
1、直接把项目web文件夹放在webapps里。
2、在tomcat\conf\server.xml中的<host></host>内部添加<context/>标签: 
<Context debug="0" docBase="D:\demo1\web" path="/demo1" privileged="true" reloadable="true"/>
docBase:项目路径,可以使用绝对路径或相对路径,相对路径是相对于webapps 
path:访问项目的路径,如:http://127.0.0.1:8080/demo1 
reloadable:是否自动加载新增或改变的class文件. 
debug属性与这个Engine关联的Logger记录的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省为0。 也就是程序异常时写入日志文件里的详细程度。
六:Tomcat的配置虚拟目录
6.1:介绍配置虚拟主机的两种方式:在做文件图片上传的demo的时候就会用到这个虚拟目录,指定物理路径,图片就会上传至那个目录下的,数据库里保存图片的路径,在开发头像显示的时候就可以用虚拟目录显示上传 的头像图片的.
6.1.1:在Tomcat的目录下server.xml做如下的配置,那个path就是虚拟的
<Context docBase="C:\apache-tomcat-7.0.77\webapps\SSM-demo" path="/SSM-demo" reloadable="true" source="org.eclipse.jst.jee.server:SSM-demo"/><Context docBase="D:\UpLoad" path="/pic" reloadable="true"/>
6.2:图形化界面配置:
Tomcat的简单归纳总结
七:Tomcat的CATALINA_HOME和CATALINA_BASE的区别:
你需要在一台机器上面部署多个Tomcat实例,但是你又不想创建多个Tomcat的副本,换句话说就是让这些Tomcat副本拥有自己的工作目录但是共享Tomcat的代码。
关于CATALINA_HOME和CATALINA_BASE官方文档上面是这样解释的:
[html] view plain copy
  1. Throughout the docs, you'll notice there are numerous references to $CATALINA_HOME. This represents the root of your Tomcat installation. When we say, "This information can be found in your $CATALINA_HOME/README.txt file" we mean to look at the README.txt file at the root of your Tomcat install. Optionally, Tomcat may be configured for multiple instances by defining $CATALINA_BASE for each instance. If multiple instances are not configured, $CATALINA_BASE is the same as $CATALINA_HOME.
 
翻译过来就是CATALINA_HOME是Tomcat的安装目录,CATALINA_BASE是Tomcat的工作目录.启动Tomcat会发现这个的.
八:Tomcat的双开问题:

解压两个Tomcat的,修改相应的端口的.分别启动,可以修改index.html那个首页便于区别的.
最后:将这些常见常用的归纳了一下:有些地方是学习知名博主的总结分享,一部分是自己学习过程中的一些总结的。这只是抛砖引玉只用的.鲜为人知的技术点还有很多的,一起分享一起快速的进步吧.

上一篇:dedecms 权重排序问题


下一篇:LeetCode 104 Maximum Depth of Binary Tree 解题报告