Tomcat本质上就是一个HTTP服务器。
那么问题就来到了什么是HTTP服务器?与其他服务器类似,HTTP服务器干两件事,第一,将前端提交的数据转换成对象,第二,将服务器响应返回的对象进行解析。
HTTP协议就是HTTP客户端和HTTP服务器之间通信使用的协议。
浏览器本身就是一个HTTP客户端,与各种HTTP服务器进行交互。
HTTP服务器有很多种实现,其中Tomcat就是java圈子里最知名、使用最广泛的http服务器。
我们可以使用tomcat部署一些静态页面。【注意url写对,否则可能404】
也可以部署动态页面【当前学习重点】,而servlet就是一种实现动态页面的技术,是Tomcat给java提供的进行web开发的原生api,java程序员可以基于这些api更方便的开发带有业务逻辑的http服务器。【tomcat已经把这些http相关的底层操作封装好了,我们只需要调用tomcat提供的api即可】
这里涉及到几个概念:动态页面与静态页面、部署与热部署
静态页面就是页面内容始终是固定不变的。eg.百度主页
动态页面就是页面内容随着输入参数的不同而改变的。eg.搜索不同关键字,弹出不同的搜索结果。
从技术层面讲,静态页面就是单纯的html,动态页面则是html+数据。
部署就是把我们的代码,拷贝到webapps中,就好了(重启下tomcat)
热部署则是不用重启,直接拷贝进去就行
或许可以说我们之所以学tomcat就是为了之后把自己的博客系统部署到云服务器上,让别人也能访问。即最核心目标:基于Tomcat编程,做出网站,基于tomcat进行网站后端的开发。
又因为云服务器都是linux系统,所以我们之后还要简单学习如何使用linux系统。
所以接下来,我们先学习tomcat的下载与使用,再学习如何使用写一个servlet程序。
尽管目前企业中已经基本不适用servlet了,但是他是我们未来学习框架的基础。
我们直接搜索官方下载,注意看它的域名是不是正确的就行。所以这里我们就不再做演示。
这里,我们说一下这个apache是什么东西。
它最开始也是一个开源的http服务器,后来影响力变大,形成了一个开源社区,开源社区又搞出了很多开源产品。Tomcat就是其中一个。
另外,这里需要注意:
tomcat的版本和后续servlet版本是强相关的,这里我们使用tomcat,对应的servlet就是3.1
tomcat是基于java实现的,要求我们的机器上必须有jdk!!如果没有jdk,tomcat跑不起来
打开bin目录(可执行程序),根据系统选择对应的bat文件。
什么是bat文件?
bat文件是指批处理文件,是一种可执行性文件,由一些系列的命令构成,其中包含对其他程序的调用。
这里start.bat【给windows使用的】
与之对应的,start.sh【给linux和mac使用的】
这里我们访问tomcat自带的欢迎页面。在浏览器输入127.0.0.1:8080
80端口和8080端口没有本质区别,只是数字的区别,都经常用于web应用程序。
接下来我们就看看tomcat的欢迎页面。在浏览器框中输入环回ip和默认端口号。
注意,必须是tomcat是正在运行中,才能看到这个页面!!!
第一级路径也起了个名字,叫做application path/context path
和双击打开html区别:一个通过网络访问,一个通过文件路径访问的,通过网络访问可以跨主机,通过路径只能访问自己电脑上的路径
为什么不能:nat的原因,ip不够用,不能跨网段使用,要想让别人访问,需要有外网ip。目前的都是内网ip。
成本最低方式买云服务器(本质上买外网ip)
静态页面还没写完,之后再说,这里重点知道怎么把servlet程序部署到tomcat上边即第四部分。
这里先对他有个简单了解即可。
Maven是一个工程管理工具。
这里我们主要使用到了它的2、4两个功能。
maven是一个独立的程序,但是对于已经安装了idea的机器而言,不需要单独下载,idea自带,也不需要安装任何额外的插件。
这里我们对一个maven项目自动生成的目录结构进行解析,方便后边写servlet程序。
以写helloworld为例,需要七个步骤:
如果我们首次使用Maven,项目创建好,会在下边读条,从重要仓库加载一些maven的依赖。这里需要联网,同时因为maven仓库再国外,网络不一定稳定,这里的读条可能时间比较长。
其实也就是引入servlet对应的jar包。去maven官方搜索java servlet api
.
正如我们前边所提到的,这里应该安装3.1.0版本,与tomcat8进行对应。
又因为我们创建的是maven项目,不需要将整个jar包导入,所以这里只需要把下边这段内容复制到pom.xml里边即可。
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
注意,这里的dependencies标签是我们自己写,它是project顶级标签下的子标签。倘若有多个依赖,依次往标签里粘贴即可。
通常也把这块的配置称为此项目需要的依赖在maven仓库的坐标。
另外,如果我们是首次使用,这里的字可能是红色的,不用慌,只是插件没下载完。
因为一般我们粘贴进来,idea的maven就会自动触发依赖的下载,下载完就好了,一般只需要一次。
如果粘贴进来半天没动,点下刷新或许会有意外之喜。(我就是这么弄好的)
虽然maven已经帮我们自动创建了一些目录,但是还不够。如果需要使用maven开发一个web程序,还需要别的目录
在main目录下,创建一个webapp目录(没有s哦)
在webapp下创建WEB-INF目录
再在WEB-INF目录下创建一个web.xml文件
给web.xml里边写点东西
这些内容是固定的,不需要调整,目前也不需要理解具体啥含义
<!DOCTYPE web-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>
弄完之后大概是这个样子滴~
下边我们来说几个点:
我们这个maven项目里边是没有main方法的,那么怎么运行的呢?假定整个项目是一个火车,那么tomcat就是一个车头,其他的车厢自己不会跑,但是都有特定功能,需要火车头拉着才能跑。但是tomcat需要进行识别啊,识别哪些文件是需要带的小弟就是通过这里目录的WEB-INF/web.xml。这个时候tomcat就把我们写的代码加载并运行起来了。
处理一个get请求,不需要手动调用,而是tomcat自动调用(当服务器收到get请求后),所以不需要main方法
另外,如果我们完成上述步骤之后,发现代码是红色的,也不要就觉得一定是我们哪写错了。譬如这样
因为idea只能比较准确的分析和判断java代码,对于其他代码,比如说html,css,js,xml,json,sql……如果标红,不一定是错的。
判定代码是否正确的唯一标准就是看运行结果。
另外,在idea里边,如果看到飘红,可以尝试alt+enter,也许会有意想不到的结果。
pom.xml是maven项目总的配置文件,以xml形式组织的
关于这个类的创建说下边几个点
父类里边的super.doGet要删掉
req参数表示一个http请求,resp表示一个http响应,这里的resp就相当于一个输出型参数。
doGet整体的效果就相当于是根据请求计算响应的一个过程
而最后一条语句中的writer对象,是一个字符流输出对象。
这里的write操作其实是往resp的body部分进行写入,等resp对象整体构造好了,tomcat会统一转成http响应的格式,再写socket。【当然可能实现细节不同,也许是直接通过resp对象向网卡里写】
但是,到这里,这个类其实还没写完,我们一般会在类定义的上方加一个注解,这里是\xxx
。一般是处理什么请求xxx就写什么。
所以完整的写法应该是这样的
关于注解:
注解是java中特殊的类,java专门定义的一种语法糖来实现注解。
它的作用:针对一个类/方法,进行额外的“解释说明”,赋予这个类/方法额外的功能/含义。
对于这里的webServlet注解,它具体的作用就是把当前的类与一个http请求的路径关联起来。一般情况下当tomcat收到get请求时就会调用。
但是具体要不要调用还需要看,这个项目里有没有特别的get请求和特别的处理逻辑即针对某一类get请求单独定义一个类,单独关联一个路径,一个资源。
这里的打包就是把程序编译好,得到一些字节码(.class文件),把这些文件打成压缩包的过程。
jar包就是一种.class构成的压缩包,但是我们这里要打的不是jar包,而是war包。
两者之间有什么区别呢?
jar包只是简单的java程序,而war包是tomcat专属的用来描述webap的程序。
可以说一个war就是一个webapp。
1.打开maven面板,双击package或者右键运行
2.看到build success即是打包成功
打包完毕之后,包会生成在target目录下
倘若已经显示build success,但是还没有target目录,尝试刷新一下,因为很可能是idea没有反应过来。
3.默认情况下,maven打的是jar包,但是我们需要的是war包,所以需要微调pom.xml【写入两个标签】
调整完刷新一下即可。
把刚刚打包好的war拷贝到tomcat的webapps目录下即可
然后启动tomcat,并确保启动成功。
验证的方式就是打开浏览器,输入url,访问写好的代码。
我们需要注意以下几个点:
url路径有两级,第一季也叫做context path/application path,这个目录就代表一个webapp,一个网站
第二级路径也叫做servlet path,也就是我们在写好的HelloServlet类上边的注解内容
在验证之前一定确保tomcat是开着的!!记住不要点叉!!!
输入url到出现页面出现hello world,中间发生了什么?
我们可以使用一些操作简化上述过程:其中简化的手段就是将上边的手动打包+部署程序通过插件简化为一次按钮点击。
但在此之前我们需要对插件有一定的认识。插件就是允许用户在现有程序之上进行扩展,插件就是一个扩展功能的程序。
这里我们使用到的就是smart tomcat。
非正常情况下,可能会有端口冲突,这里我没遇到,遇到再说。
完成上述操作之后,右键运行,看到下边的界面后,直接验证。
//要想把HelloWorld返回客户端,要这样 //会得到一个Writer对象【字符流】,此处的writer对象从属于resp //其实是向resp的body部分进行写入,等resp对象整个构造好了,tomcat会统一转成http响应的格式,再写socket【当然不排除直接写socket,实现可能不同】 // 流对象不一定是写入网卡/硬盘,例如这里就是写入内存缓冲区中(关键是看我们代码实现的细节)
出错了之后检查思路:
一闪而过
smart tomcat插件的配置
url的两级路径有没有输错
……