Tomcat是java版本的HTTP服务器。
使用HTTP进行通信就需要涉及HTTP客户端(浏览器/postman/爬虫程序)和HTTP服务器。
Apache是一个“开源社区”,最早Apache就是一个http开源服务器(C写的),维护这个服务器有很多大佬来贡献代码,形成了社区。后面不仅仅搞apache还搞了很多其他项目,后面这群大佬搞了java版本的http服务器,就是tomcat。
一.tomcat的目录
1.bin
bin目录下放的是tomcat的一些相关可执行脚本,比如双击就可以启动tomcat了。(.bat是windows上的批处理程序,.sh是Linux上的shell脚本)。最终tomcat就是控制台程序了。
tomcat日志在控制台上是乱码,因为tomcat的字符集是utf8,而cmd的字符集是gbk。后面会介绍其他的使用tomcat的方式,比如把tomcat集成到idea中,或者linux中使用tomcat。
2.conf
conf放的是tomcat的配置文件。一个程序的功能十分丰富,程序员通过配置文件的方式设置来开启这些功能。tomcat的配置主要通过xml的方式来提供。
3.lib
放的是tomcat运行过程中依赖的一些jar包。
4.logs
日志,调试一个服务器程序最重要的手段。如果使用调试器打断点服务器运行到断点就停下来了,服务器就卡着了,此时客户端其他的请求就可能无法被响应了,而且涉及到“概率性问题”,有可能100个请求才触发一次问题;使用调试器本质上是更好地理解程序的执行过程还有更好地关注到某些临时结果(某个变量的中间值),这两点都可以通过日志替代。
后续自己写的程序中代码打印的日志就可以在上述目录中看到。
日志是通过System.out.println等方式打印的一些字符串。
5.webapps
webapps里面放的就是若干个webapp(网站)。webapps每个目录都是一个webapp(就包含了一个网站的前端代码和后端代码)。这个目录中还能见到.war压缩包文件(使用tomcat发布程序的一种方式),写好的一个网站就可以打包成war包拷贝到tomcat的webapp里,tomcat就会自动对war解压缩,从而完成网站的部署和加载。
通过一个简单的例子感受tomcat的作用:
在webapps目录下建一个文件,再建一个网页,在VSCode上编写
看看效果:
这就是tomcat的重要作用,可以让浏览器通过网络访问到一个html页面。(别人把网页放到云服务器tomcat上,有外网ip,我们就可以访问别人机器上的的网页了)
tomcat相当于是一个“底座”一样,我们所编写的代码需要架到这个底座上才能被外面的用户顺利访问到。(java中是这么玩的,其他编程语言还有别的玩法)
这展示的是“静态页面”(页面内容是固定的),tomcat还能支持“动态页面”(根据用户输入的内容产生不同的结果,比如搜狗中输入不同的词得到不同的结果;b站上不同的用户推荐不同喜好的内容。这部分工作就是“后端开发”需要做的核心工作)
Tomcat提供了一组api(Servlet),封装了HTTP协议,可以让程序员更方便地编写动态页面了。
二.Servlet
Servlet是比较古老的编写网站的方式,现在使用java进行商业级别的开发基本都是Spring为主。Spring是针对Servlet进行的封装。
1.Servlet主要做的工作
让程序员自己写一些类加载到Tomcat中,后续Tomcat收到HTTP请求(来自浏览器),就会执行上面写的代码,从而通过这些代码完成一定的业务逻辑。
2.编写Servlet代码,最终在浏览器上展示出“hello world”
流程:
(1)创建项目
此处创建的是新的项目形式,称为Maven项目。Maven是java知名的构建工具(帮助你编译/打包代码的工具),那javac是java的编译工具而且IDEA也会自动调用javac,为什么还需要别的工具?因为工作中涉及到的项目可能会非常复杂,尤其是可能会有一系列的依赖关系(要想编译A先把B搞定,要想编译B要先把C搞定),Maven会把依赖管理好。
(A)Maven生成的目录结构:
main放的是业务代码,底下有java代码还有java代码运行过程中所依赖的资源(比如说配置文件、图片logo之类的),test放的是测试代码。
pom.xml放的是Maven项目的入口配置文件。
默认生成的情况,后续还需要修改这个文件增加更多内容完成一些效果。
不仅仅是Servlet可以使用Maven,任何一个java程序都可以使用Maven来管理。
(2)引入依赖
接下来写的程序会使用Servlet,Servlet这个api是tomcat提供的而不是jdk,所以需要引入第三方库。但是手动下载导入非常麻烦(工作涉及的项目可能依赖的内容非常多),使用Maven就可以解决这样的问题。
(A)打开Maven中央仓库(一群大佬把市面上的第三方库都收集起来,搞了个网站都放在上面,方便程序员去下载使用),找到需要的sevlet的jar包。(Maven仓库:https://mvnrepository.com/?
cf chl rt tk=iL2a8VMUULPbti3fb gOVnr.b6dQRVw3G2qZS87TqJjA-1698324846-0-qaNycGzNDqU)
Servlet3.1是和Tomcat匹配的版本
Servlet的版本必须和Tomcat版本匹配
(B)借助Maven自动下载上述依赖
复制这个粘贴到pom.xml里面,加个标签<dependencies>,一般来说只要复制进来IDEA就会下载,如果字体标红就是没下载好,需要点击这个手动刷新,没有标红就下载好了。
--下载好的jar包放哪了?
这涉及到maven本地仓库,maven会在你的机器上搞一个目录,这个目录就会保存你这边下载好的这些jar包。
(3)创建目录
maven项目是普适的,不仅局限于Tomcat,而对于Tomcat来说,对于项目的目录结构还有一些额外的要求。
创建目录“webapp”,和“WEB-INF”(在这下面创建文件“web.xml”)
(tomcat要求的目录结构,不按这个目录结构tomcat就无法识别)
web.xml里面的内容不能是空的,但是里面的内容也没必要背,只需要找到一个模板复制粘贴过来就行,学习过程中不会修改这个文件。
<!DOCTYPEweb-app PUBLIC
"-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Archetype Created Web Application</display-name></web-app>
可能会标红,不用管它,但是对于idea来说,只有java代码能够做到比较精准地分析,其他的代码是否报错都仅作为参考(不准)。
前三个步骤都不复杂,都是有固定式的操作的,主要就是需要熟练。
(4)编写代码
在java目录中创建类。
继承是为了重写父类的方法。
doGet的意思是处理HTTP GET请求,当tomcat收到一个GET请求的时候,就有可能执行到子类的方法中。
写一个服务器主要的逻辑是三个步骤:
(A)读取请求并解析
HTTP请求本身是字符串,此处就是Tomcat自动解析HTTP请求字符串,构造成HttpServletRequest对象。
(B)根据请求计算响应
doGET要做的就是根据请求HttpServletRequest对象构造生成HttpServletResponse对象(虽然Tomcat帮我们new出了HttpServletRequest对象,但是这个对象是个空壳,里面的各种属性都没设置好,我们需要把里面的属性设置好)
根据请求生成响应的过程也就是业务逻辑。
(C)把响应返回给客户端
Tomcat自动完成的,把HTTP响应对象组织成HTTP格式的字符串通过网络传输给浏览器。
//我们只需要关注根据请求计算相应的过程,而不需要关注Http协议如何解析,不需要关注Http协议如何构造。
//代码最上面的注解表示:Tomcat不是收到所有的get请求都调用这个doGet方法,而是同时判断:
(a)请求是get
(b)请求url中的路径是/hello
其实就是让类和HTTP请求路径关联起来,这个关联过程叫作“配置路由”。