Tomcat和初学Servlet

x33g5p2x  于2022-04-23 转载在 其他  
字(5.2k)|赞(0)|评价(0)|浏览(203)

一、Tomcat

1.Tomcat的基本介绍

Tomcat 是一个 HTTP 服务器。
前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式。
同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端。
HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实现的一个开源免费, 也是被广泛使用的 HTTP 服务器。

Tomcat 的下载地址:下载地址,一般下载的是Tomcat 的8版本,才是与Servlet 的3.1版本对应的。否则无法完成交互。

Tomcat 也被称为是一个“容器”,它能够存放大量的webapp(网页)。
选到8版本的Tomcat,选择下载的是zip的版本(压缩版本)。Tomcat本身就是跨平台的,并且在安装Tomcat之前,首先要安装好JDK。

2.Tomcat中的文件解释

1.bin:是binary 的缩写,一般表示的是二进制 的可执行程序,存放了Tomcat 的启动/停止 的脚本。
2.conf:一般存放的是配置文件,是用 xml 格式来表示的。
3.logs:日志存放的位置,对于程序的调试非常重要
4.webapps:放了些具体的webapp(网站),每个webapp都是一个目录,里面可以包含前端代码(HTML\CSS\JS),还可以包含一些后端代码(.class),还可以包含一些资源(图片、字体、图标、音频)

3.Tomcat的打开和关闭

点进bin目录中,往下拉会有如下图的两个程序:

startup是Tomcat的启动脚本,以bat为后缀的,就是Windows 上的批处理程序,双击这个就会开启Tomcat。以sh为后缀的,就是Linux/Mac 上的批处理程序

打开之后会出现一堆乱码,我们不用去管,直到看到了下图的提示,就说明启动成功了。

乱码的原因:Tomcat自身是使用UTF-8 来进行编码的,但是CMD 控制台是使用GBK 来进行编码的
因此有两种解决方案:
1.把Tomcat的编码方式改为 GBK。不推荐。
2.把CMD 的编码方式改为UTF-8。不推荐,因为会修改到Windows 注册表,有风险,并且很容易把电脑改坏。

其实Tomcat打开后是乱码的也没有关系,因为开发中,Tomcat主要的使用方式有两种
1.在IDEA 中,由IDEA 来调用Tomcat ,Tomcat 里面的内容就直接显示到IDEA 的终端里了(IDEA 也是UTF-8进行编码的,因此就不会乱码了)。
2.在Linux 上使用,Linux默认的编码格式也是UTF-8,因此也不用修改。

只要我们成功启动了Tomcat,在浏览器中输入127.0.0.1:8080 ,就会来到Tomcat 的欢迎界面。

127.0.0.1 表示环回IP ,表示的是当前的主机。8080 是Tomcat默认绑定的端口号,可以通过配置文件(conf/server.xml)来修改:如果将红框的端口号修改为自己想要的端口号即可。
Tomcat其实是支持HTTPS 的,但默认是没有开启的。如果开启了HTTPS ,默认的端口是 8433 .

对于Tomcat的关闭,可以选择bin目录下的:根据环境来选择对应的关闭程序。

4.使用Tomcat的目的

使用Tomcat主要的目的就是为了能够部署一个 webapps(网站)。
一个网站里面的内容,可以分成两类:
1.静态网页(纯前端的代码,不需要服务器来生成数据)
2.动态网页(前后端搭配的代码,需要服务器生成数据)

对于静态页面的部署,只需要将页面复制到 webapps 目录中的ROOT目录中即可

我先创建一个hello.html文件,写好数据后,将其剪切到webapps目录的ROOT目录下,之后再在浏览器中,直接访问该html即可。如果只是访问的是单独一个文件,并且有关该文件的资源都是放在ROOT中,那么端口号后面跟的地址默认是从ROOT目录下开始的。但是将所有资源不打包直接放在ROOT 中就会非常乱。

部署到Tomcat上,可以看到页面的内容,通过一个URL ,通过网络来访问,别人电脑上的部署的HTML,咱们也可以去访问。但是由于IP地址中的NAT机制,无法直接根据IP地址来访问别人的主机,需要有外网IP(云服务器)才能访问别人的主机,才能拿到对应的文件

对于直接打开该html文件与在Tomcat中打开该文件的区别:
直接双击该文件的地址:

虽然直接双击该页面,也能看到页面的内容。相当于使用浏览器打开了一个本地的文件,如果这个文件是在别人电脑上的,就无法访问了。

在Linux环境下部署好Tomcat之后,一直选择路径,选择好ROOT 的目录下的路径,然后将该hello.html 直接拉到Linux中即可。此时就能够看到该ROOT 目录下就有该文件了:

因为是存储在了该外网ip中,因此其它的电脑只要在浏览器中输入的外网ip对应到自己的云服务器,并且输入的路径正确,就可以拿到该html文件了。

当然,一个真实的页面肯定是比较复杂的,包含各种前端代码和各种资源,因此部署页面的时候,不仅仅可以放到ROOT 中,也可以在webapps 这个目录中给当前的页面创建一个单独的目录

在 webapps 中创建目录 HelloApp, 和 ROOT 目录并列。里面包含的有前端代码、各种资源等。

在浏览器中访问的时候,输入的URL 就会对比直接放在ROOT 中就有所改变了。
注:HelloApp就是我们自己创建的与ROOT同级的目录,直接访问hello2.html,其它的资源也可以加载出来了。

这里的HelloApp 就代表了当前 webapp 的名字,也管他叫做 Context Path(上下文路径)或Application Path。

二、Servlet

1.Servlet介绍

Tomcat是一个HTTP 服务器,开放了一组API 可以让程序员来使用,是基于Tomcat的二次开发,写更多的业务逻辑。Tomcat上提供的这组API,就是Servlet 。

其它的服务器,有的提供API,也有的没有,提供的API 可能也支持Servlet,也可能不是。

对于之前写的TCP 服务器:
1.初始化
2.进入循环
a) 读取请求
b) 根据请求计算响应
c) 把响应返回

基于Servlet的开发,也差不多是上面那样。
1.初始化,允许程序员注册一个 类 到Tomcat中,让这个类 和HTTP 的一个特定的请求相关联(类似于JS,给按钮关联一个点击事件)。
2.进入循环(循环的处理很多很多的请求)
a) 读取HTTP 请求,Servlet解析这个字符串,生成一个HTTPServletRequest对象。
b) 根据请求对象生成一个 HTTPServletResponse对象(表示响应),根据请求生成响应,这个过程,就是初始化阶段注册的类里面的代码完成的。
c) 把HTTPServletResponse 对象转换成HTTP 响应,返回给浏览器。

而Servlet/Tomcat都已经把大部分的操作都帮我们完成了,我们需要完成的就是b操作的根据请求生成响应,即 业务逻辑。

2.利用Java来写Servlet程序

2.1 创建一个Servlet项目并导jar包

1.先创建一个Maven 项目。
2.因为Servlet是一个第三方库,因此要去Mavens仓库上面去找对应的jar包,搜索Servlet,下载的是一个3.1.0版本的Servlet 。将jar包的maven地址复制到pom.xml的dependencies 标签里面,就会自动下载第三方库。

注:该jar包与之前遇到的jar包不一样,maven里面有一个scope标签,表示当前的jar包只是在开发的时候去使用,而不需要打包到最终的发布包中。因为Tomcat里面已经内置了Servlet 了,把程序部署到Tomcat的时候,因为已经有Servlet了,就不需要自己的代码里把 Servlet 也打包一份放到Tomcat上
如下图所示:

2.2 写一个简单的hello world

a) 先创建好一个类:

创建的类,要继承自HTTPServlet 类,然后才让这个类被Tomcat给调用到。如果刚才Maven 的依赖没有下载好,此时的HTTPServlet 是不能被补全出来的(标红)

b) 使用doGet方法,doGet是HTTPServlet 这个父类的方法,这个方法的参数是两个,分别是HTTPServletRequest(HTTP请求)和HTTPServletResponse(HTTP响应)。
注:选择doGet方法后,方法里面默认会调用父类的doGet方法,此时要把它删除掉,否则就会直接构造出一个错误的响应(状态码为405的响应)。

doGet方法里面要做的事情,就是处理业务逻辑,根据请求生成响应。
注:在这个Servlet程序中,没有main方法和HTTPServlet的示例,因为Tomcat会自动调用doGet方法和自动创建HTTPServlet实例。像这样的情况下,就可以把 Servlet 理解成是一个“框架” 。

c) 在doGet方法中写代码,如图:这个操作,就是往HTTP 响应的body 中,写了一个“hello world”字符串

d) 需要保证当前的类和一个特定的HTTP请求 ,能够关联起来。当前还不知道,发送一个什么样的请求,才能执行到 HelloServlet 类的代码。

@WebServlet 也是Servlet 中提供的注释,功能就是把 类 和HTTP 特定请求进行关联,根据HTTP请求URL 的路径来进行关联的。这个关联的路径,就是后面用浏览器直接去访问的与该代码关联的路径。下面会说到。

如果Tomcat收到了一个路径为 /hello 的请求,就会调用到 HelloServlet 的代码。

如果这个请求是Get 请求,就会调用到 HelloServlet.doGet 方法。
如果这个请求是Post 请求,就会调用到 HelloServlet.doPost 方法

2.3 创建一些必要的目录文件

原本在左栏的main 文件夹中,是没有webapps 的,此时就需要在main 文件夹中,创建一个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>

对于代码中,下面这段可能会标红,但是标红不等于出错,不影响在Tomcat上正常运行,只是影响IDEA 在编辑这个 web.xml 时候的补全功能,或者按alt+enter:

2.4 打包程序

打包的目的就是 把当前的项目的代码,进行编译,并且打一个压缩包出来。直接基于maven 来进行打包。
直接双击下面的packet就能打包程序。

看到下图的提示,即打包成功:

我们发现,maven帮我们打的jar包就已经出现了:

比较尴尬的是,Tomcat 不能直接识别 jar格式的包,jar包一般是使用java -jar命令来运行的。而应该打成一个 war 格式的包(war 这个格式是Tomcat所识别的格式)。

将jar包改为war包的方法:
首先将上面打的jar包先删除,修改maven 中的pom.xml 配置文件,利用packing标签修改打包类型为war 。

此时在target目录中会看到刚才打的就是一个war 包:

这个war包部署到Tomcat 上,Tomcat就会自动解压缩,生成一个同名的目录。后面通过浏览器URL 访问这个 webapp 的时候,要在URL 中带上这个目录的名字。因此最好修改war包 的名字简单一些,当前的名字是 artifactId+version。

该war包 的名字也需要修改pom.xml 文件,如下图所示,就将war包重命名为 java100 了:

2.5 部署程序

把war包 拷贝到Tomcat 的webapps 目录中即可。拷贝完成后,重启Tomcat,此时就会在webapps 目录中,看到一个war包解压缩后的目录。

点击解压缩后的war包目录,里面有两个文件夹:

我们先看WEB-INF文件夹,里面包含了web.xml 文件以及编译后生成的 .class 文件。

META-INF 目录中,包含了当前webapp 中依赖的一些第三方jar包。

实际在部署这个环节,还有更简单的方法:可以使用IDEA 中的smart tomcat 插件来简化 打包+部署(一键式的打包和部署)

2.6 验证程序是否正确工作

通过浏览器访问Tomcat,构造一个特定的请求,触发到HelloSerrvlet 里的代码。

相关文章