一、Tomcat的初步使用
● Tomcat目录结构与介绍
•bin:用来存放Tomcat服务器的可执行程序,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)
•conf:用来存放Tomcat服务器的配置文件
•lib:用来存放Tomcat服务器的jar包
•logs:用来存放Tomcat服务器运行时输出的日志信息
•temp:用来存放Tomcat服务器运行时产生的临时数据
• webapps:用来存放Tomcat服务器部署的工程
• work:是Tomcat工作时的目录,用来存放Tomcat运行时jsp翻译为Servlet的源码和编译后的文件
● Tomcat启动与关闭
Tomcat的启动与关闭需要执行bin目录中的命令脚本。
注意:如果启动时闪退,是因为JDK的环境变量配置不规范,需要重新配置。
•Tomcat启动
运行startup.bat文件。
•Tomcat关闭
运行shutdown.bat文件或者直接关闭掉启动窗口。
●Tomcat的常见配置
•Tomcat配置文件介绍
Tomcat 的配置文件由4个xml组成,分别是context.xml、web.xml、server.xml、tomcat-users.xml。每个文件都有自己的功能与配置方法。
•context.xml
context.xml是Tomcat 公用的环境配置。Tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。
•web.xml
Web应用程序描述文件,都是关于是Web应用程序的配置文件。所有Web应用的web.xml文件的父文件。
•server.xml
是tomcat 服务器的核心配置文件,server.xml的每一个元素都对应了 tomcat中的一个组件(pojo对象),通过对xml中元素的配置,实现对 tomcat中的各个组件和端口的配置。
•tomcat-users.xml
配置访问Tomcat的用户以及角色的配置文件。
●解决控制台乱码
控制台产生乱码的原因是在Tomcat在输出日志中使用的是UTF-8编码,而我们中文的Windows操作系统使用的是GBK编码。由于编码格式不统一,所以出现了乱码。
解决方式:修改conf目录中的logging.properties文件重新指定的编码方式。如果还是不行,那么就删除该行即可:
47 java.util.logging.ConsoleHandler.encoding = GBK
• 修改Tomcat监听端口
Tomcat默认监听端口为8080。可通过修改server.xml文件来改变Tomcat监听端口。
•配置Tomcat并发数
Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。
这个并发能力还与应用的逻辑密切相关,如果逻辑很复杂需要大量的计算,那并发能力势必会下降。如果每个请求都含有很多的数据库操作,那么对于数据库的性能也是非常高的。
对于单台数据库服务器来说,允许客户端的连接数量是有限制的。并发能力问题涉及整个系统架构和业务逻辑、系统环境不同、Tomcat版本不同、JDK版本不同、以及修改的设定参数不同。并发量的差异还是满大的。并发数设置参数有如下几个:
•最大并发数:maxThreads="1000"
•初始化时创建的线程数:minSpareThreads="100"
•一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程:maxSpareThreads="500"
•指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理:acceptCount="700"
●Tomcat服务器在IDEA中的配置
1.update resources:表示当你是修改了静态资源,比如HTML、css等,就可以使用它来启动
2.update classes and resources:对类的修改使用它不生效,所以不建议使用
3.Redeploy:重部署,这个适合于你修改了配置文件、修改了代码,可以重新部署项目到服务器
4.restart server:重启服务器,当你修改了web.xml,最好重启服务器
● Servlet在Tomcat中运行的原理
1.启动Tomcat服务器(以下动作只在服务器启动的时候执行):
①解析web项目的web.xml文件
②通过反射创建所有的Servlet对象
2.Tomcat服务器接收请求
请求地址:http://localhost:8080/demo/HelloServlet
3.Tomcat服务器解析请求:
Tomcat服务器解析请求后,会诞生两个对象分别为:
HttpServletRequest对象:存储此次请求的所有相关信息(行、头、体),每次请求重新创建
HttpServletResponse对象:存储了此次请求的响应流对象,每次请求重新创建
4.Tomcat服务器查找请求的资源
Tomcat服务器根据请求地址从map集合中获取要调用的Servlet对象
Servlet servlet=map.get("/HelloServlet");
5.Tomcat服务器调用Servlet对象的过程:
Class clazz= servlet.getclass();
Method method = clazz.getMethod(“service",HttpServletRequest.class,HttpServletResponse.class);
method.invoke(servlet,request,response);
注意:
该流程由Tomcat底层接收请求后自动执行,看不到,需要做的是将实现了Servlet接口的代码提前放到Tomcat服务器中,这样请求被接收后就可以反射调用了。
●Servlet的生命周期
浏览器发起请求后达到Tomcat服务器;
服务器会解析请求信息得到HttpServletRequest和HttpServletResponse两个对象;
然后服务器再通过反射去调用Servlet的service方法去处理请求。
•Servlet对象在创建、初始化并使用后不应该销毁。如果使用完(请求处理完)就销毁,那么下次过来请求又得去创建Servlet对象,这样效率并不高,都使用同一个Servlet对象去处理请求,如果同时有10个请求过来访问Tomcat服务器,服务器会创建10个线程来处理请求,因为service方法不涉及到全局变量的修改操作,所以也不会有线程安全问题的。
•Servlet对象只会被创建及初始化一次。之后会驻留在内存当中。
•Servlet的创建与初始化的时机有两个:
1.延迟加载:Servlet在第一次被浏览器访问的时候创建与初始化的(目前代码用的就是这种方式,默认就是这种)
2.预加载:Servlet在启动服务器的时候被创建与初始化的(该方式需要做一些配置,告诉Tomcat服务器在启动的时候就创建Servlet对象)
•Servlet对象是由Tomcat服务器创建的,之后就一直驻留在内存中处理请求。直到服务器停止后,Servlet才会被销毁
●Servlet使用流程
•代码编写流程
1.打开IDEA
2.在IDEA中创建一个Java Enterprise项目
3.在项目的src目录下创建一个com.bjsxt.controller包,在包中创建自己的类继承HttpServlet
4.重写service方法,在service方法中写的就是处理请求的业务逻辑代码
5.在web.xml中配置映射关系
6.启动tomcat服务器
7.在浏览器输入路径访问Servlet
● 代码执行流程
1.tomcat服务器启动时,会加载解析项目的web.xml文件
2.tomcat服务器根据解析的结果,创建所有在web.xml中配置的Servlet对象(假设都配置了load-on-startup)
3.tomcat服务器将所有创建好的Servlet对象以键值对的形式放在内存中,键是你配置的url-pattern,值是Servlet对象
4.在浏览器地址栏输入url地址
5.tomcat服务器接收到浏览器发送的http请求,然后进行解析,得到本次请求的两个对象,HttpServletRequest和HttpServletResponse。
6.tomcat服务器解析url地址中要访问的资源,根据资源路径找到提前创建好的Servlet对象
7.tomcat服务器根据反射调用Servlet对象的service方法,并将此次请求解析出的request和response对象传递给service执行
8.service方法执行完后,tomcat会按照http响应的格式将数据响应给浏览器
9.浏览器接收到tomcat的响应结果后,对其进行解析,以网页的形式展示给用户看。
●web.xml配置Servlet的几种方式
• web.xml的作用:配置了Servlet所在类的全路径;配置了Servlet访问的映射路径
• web.xml的加载时机:在服务器启动的时候完成web.xml文件的加载。