目录
一、什么是Servlet
Servlet是Tomcat提供给我们使用的一组操作HTTP协议的API
它不是我们自己写的一个独立的程序,而是写的一个代码片段,把它插入到tomcat中,让Tomcat来调用执行(framework-框架)
二、Servlet主要做的工作
- 允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类中的一些代码.
- 帮助程序猿解析 HTTP 请求, 把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象.
帮助程序猿构造 HTTP 响应. 程序猿只要给指定的 HttpResponse 对象填写一些属性字段, Servlet就会自动的安装 HTTP 协议的方式构造出一个 HTTP 响应字符串, 并通过 Socket 写回给客户端.
简而言之, Servlet 是一组 Tomcat 提供的 API, 让程序猿自己写的代码能很好的和 Tomcat 配合起来, 从 而更简单的实现一个 web app.
而不必关注 Socket, HTTP协议格式, 多线程并发等技术细节, 降低了 web app 的开发门槛, 提高了开发效率.
三、如何使用Servlet进行编程
1、创建maven项目

说明:maven是一个构建工具,功能是帮助我们去构建,测试,打包一个项目
为啥要使用maven,直接点运行不行吗?不行!!!
在公司中,一个项目可能涉及到很多个模块(存在依赖关系),还可能会依赖很多的第三方库

2、引入依赖
Servlet是Tomcat提供的API(不是标准库的,需要额外下载Servlet的jar包)
如何下载?
到中央仓库下载:中央仓库链接
搜索servlet即可,有一个细节点,选择版本时一定要选择 3.1.0 的版本,这个版本是和 Tomcat 8.5 版本相匹配的

这里可以放 N 个 dependency,可以用来引入多个第三方依赖
只要把这一段代码往这里一拷贝,IDEA 就会自动调用 maven,从中央仓库下载该 jar 包
3、创建目录
web.xml 是给 Tomcat 看的,Tomcat 从 webapps 目录中加载 webapp,就是以 web.xml 为依据的
pom.xml 是给 maven 看的
将以下代码直接拷贝复制到 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>
4、编写代码

- 继承 HttpServlet 父类
- 重写 doGet 方法
- 写注解
在 doGet 方法中,要完成的工作就是,根据请求,计算生成响应
对于一个服务器程序来说,基本工作流程:
- 读取请求并解析
- 根据请求计算响应
- 把响应写回给客户端
在 Servlet 中,1 和 3 我们无需关系(Tomcat 已经帮我们处理好了),只需要关注第 2 步即可
5、打包代码
刚刚写的程序,不能直接独立的运行,而是必须要放到 Tomcat 上运行(部署)
部署的前提,是先打包
对于一个规模比较大的项目,里面会包含很多的 .java 文件,进一步就会产生很多的 .class 文件,所以,把这些 .class 打成一个压缩包,再进行拷贝,是比较科学的
在 Java 中,使用的压缩包,jar (普通程序打成 jar)和 war(要部署到 Tomcat 的打成 war)
war 和 jar 本质上没啥区别,都是把一堆 .class 文件打包进去了,但是 war 包是属于 Tomcat 的专属格式,里面会有一些特定的目录结构和文件,不如 web.xml,后续 Tomcat 就会识别这些内容,来加载 webapp(Tomcat 专属定制版 jar 包)


打包操作,做的事情:
- 检查代码中是否存在一些依赖,依赖是否下载好(由 maven 负责的)
- 把代码进行编译,生成一堆 .class 文件
- 把这些 .class 文件,以及 web.xml 按照一定的格式进行打包
6、部署
把打好的 war 包,拷贝到 webapps 目录底下
Tomcat 会自动进行解压(无需自己手动操作)
7、验证程序
不是 Tomcat 一启动,我们写的 doGet 就会执行,只有在收到 GET 请求时,并且路径匹配正确的情况下,才能够执行
路径分两级:
1.hello_servlet,称为 Context Path(上下文路径)或 Application Path,标识了一个 webapp(也就是 war 包名)
2.hello,称为 Servlet Path,表示当前请求要调用哪个 Servlet 类的 doGet 方法(一个 webapp中,可以有多个 Servlet,自然可以有多个 doGet 方法)
此时向浏览器发送一个GET请求即可得到响应
到此为止,步骤已经全部完成,当然,五六两个步骤可以简化合并,只需要借助IDEA提供的插件即可
四、使用插件简化打包和部署


说明: 如果程序是拷贝 war 包到 webapps 中运行,此时 Context Path 是 war 包名字
如果程序是使用 Smart Tomcat 运行,Context Path 是在上述配置中,手动设置的
五、使用插件运行与直接拷贝运行的区别
这两者存在本质区别:
Smart Tomcat 使用了 Tomcat 另外一种运行方式,在运行 Tomcat 的时候,通过特定参数,来指定 Tomcat 加载某个特定目录中的 webapp,因此,插件方式运行,既不会打包,也不会拷贝(打开 Tomcat 的 webapps 可以看到里面毫无变化)
六、Servlet 程序中常出现的问题
1、404(浏览器访问的资源,在服务器上不存在)
- 请求路径写错了
- 路径写对了,但是 war 包没有被正确加载
2、405(发送的请求的方法,和代码不匹配)
- 发送的是 GET 请求,但是代码里面是 doPost
- 忘记盖掉 super.doXXX
3、500(最常见,也最好解决)
服务器代码出现异常,改代码即可
4、空白页面
服务器没有返回任何数据,doGet 方法里面什么也没有写
5、无法访问此网站
Tomcat 可能关闭了,重新启动即可