目录

1. 动态页面之Servlet

2. 写第一个Servlet的程序:”hello world!”

2.1 创建项目

2.2 引入Servlet依赖

2.3 创建目录结构

2.4 编写代码

2.5 打包程序

2.6 部署程序

2.7 验证程序

3. 创建Servlet流程简化

4. 工作原理流程分析

5. 访问页面出错


HTTP服务器,本质上就是一个TCP服务器,只不过在基础上加上了一些按照HTTP格式进行解析/构造 这样的代码,我们开发网站后端,要做的就是调用Tomcat提供的API进行二次开发

本篇所写的就是Tomcat给我们进行二次开发所提供的API:Servlet

1. 动态页面之Servlet

先来看一下 静态页面 和 动态页面 的解释

静态页面:页面的内容,是固定的(以文件的形式访问,放在硬盘的指定目录中), 无论什么时候访问,无论是谁来访问,得到的页面效果是一样的

动态页面:不是一个真实的硬盘文件,而是通过代码在内存中构造出一个”虚拟的资源”,这样就可以根据所访问的时间不同,访问的用户不同,访问时带有的参数不同,就可以构造出不同的页面来

构建动态页面的技术有很多,每种语言都有一些相关的库/框架来做这个

而Servlet就是Tomcat这个HTTP服务器提供给java的一组API,来完成构建动态页面的这个任务


2. 写第一个Servlet的程序:”hello world!”

一共有7个步骤

(1) 创建项目 (2) 引入Servlet依赖 (3) 创建目录结构 (4) 编写代码

(5) 打包程序 (6) 部署程序 (7) 验证程序

2.1 创建项目

(1) 需要创建的项目是maven项目

注意:右测的那些都不要选

因为你创建项目,肯定是为了实现什么东西,而实现不同的东西,会有不同的目录结构/不同的配置文件,而idea为了更方便创建,就提供了很多模板让你选,来简化那些操作,当前只是写一个简单的程序.就不需要选那些东西,如果选了代码可能会编译不了

这个界面可能和你的不一样,因为idea版本不同,我的是2021.2的

如果不一样还是不会创建的话,可以去搜一下对应版本maven创建方式

(2) 这里和以前idea创建项目区别不大,输入项目名称和路径就可以了

(3) 创建好后,目录结构是这样的

(4) 这里创建了一个maven项目,那么先来看一下maven是什么

首先要清楚,maven是一个独立的程序,我们可以单独安装一个这个,但是没啥必要,因为idea内置自带了一个maven

其次要清楚构建工具的作用:(build)包括不限于,编译,打包,部署…..

我们之前写代码,都是直接在idea里,点击main方法前面的三角号,就直接自动编译运行了

针对一些简单的程序这样可以,如果是一些比较复杂的程序,尤其是多个模块,并且相互依赖

要想运行起来就非常麻烦了,

比如A依赖B,B依赖C

此时要想编译运行A,就必须先编译运行B,要想编译运行B,就要先编译运行C

构建工具就是为了解决这个问题,使我们在开发比较复杂的项目时,也可以比较方便的进行编译和打包操作,

我们使用maven,主要就是借助maven进行编译,打包,管理依赖…….


2.2 引入Servlet依赖

Servlet不是java标准库自带的,要想使用,就需要额外的下载安装,并引入到项目中

maven的一个核心功能,就是能够自动的管理依赖,就会把我们使用的库里依赖的东西,自动从中央仓库上下载过来

(1) 下面进入中央仓库搜索servlet

Maven Repository: servlet (mvnrepository.com)

(2) 下面就是要选取对应的版本

tomcat8.5 java8.0 maven3.1 这三个版本要对应(最常用的版本就是这个,如果不是可以自行在网上搜一下)

(3)直接把下面Maven这个代码复制下来(我们这里不用下载,只需要把这个代码复制过来就可以了)

(4) 复制到pom.xml这里,手动写一个dependencies标签,把复制的内容写到这个标签中

第一次这样搞,拷贝过来一个是出现标红说有错误,然后Alt+回车,idea会自动根据这里写的东西,从中央仓库上下载依赖,等待一会就下载好了(idea下面有一个进度条)

如果过了一会还是标红还没下载好,那试着手动刷新一下 ,如果出现报错了,也可能是你的网络有问题,或者pom.xml写错了

                                javax.servlet            javax.servlet-api            3.1.0            provided            

2.3 创建目录结构

此时虽然maven已经给我们创建出一些目录了,但是还不够,我们需要的是一个符合tomcat要求的目录结够

(1) 创建目录结构注意位置,名字,层次,都必须一样,

(2) web,xml需要写点东西,这个是固定的,这个我们直接复制粘贴就可以了

    Archetype Created Web Application


2.4 编写代码

(1) 要把代码放在java这个目录下,这里也可以创建一些package

(2) 给helloServlet中写一些东西

(3) 一定要注释掉,这个自动生成的代码

(3) 写WebServlet

这里写下WebServlet,就会针对某些GET请求来生效,

这里写下的 “/hello” 的意思是 GET 请求 并且URL中的路径是 /hello 的请求,才会生效

此时Tomcat 才会调用到这里的doGet方法

Tomcat可以让你关联上很多路径,可以给请求中的不同路径,关联上不同的类,也就是执行了不同的方法


2.5 打包程序

以前写过的代码都是有main方法的,这就像是一个汽车,汽车中自带发送机,自己就可以跑

当前写的Servlet代码,没有main方法,就相当于它只是一个”火车的车厢”,自己是没有发动机的,只有自己一个”车厢”是跑不起来的,

所以就要找一个”火车的车头”,把这个”车厢”也是Servlet代码挂在”车头”的后面,才可以

这个:”火车的车头”就是Tomcat(Tomcat带main,也就是有发动机)

此时就是把写到的代码挂到tomcat上, 打包+部署

(1) 直接使用maven打包

打包就是 先把缺失的依赖给下载好,然后编译所有的.java文件得到一堆.class文件

再把这些 .class 给搞到一个压缩包中

(2) run后,可以看到就出现了这些东西

虽然打包后出现了jar,但是Tomcat不认识,因为Tomcat要求的压缩包的格式是war包

这两个最主要的区别就是,war包会把整个webapp目录都给打包进去,包括web.xml以及未来放的一些静态的html,css……

(3) 重新打包生成可以被Tomcat识别的war包(在pom.xml中)

现在pom.xml添加这样一段代码,来修改jar包为war包

    war            java123    

修改完成后,再重新打包


2.6 部署程序

把war包,拷贝到Tomcat目录下的webapps中

(1) 找到war包所在位置,复制这个war包

(2) 找到你安装的Tomcat目录下的webapss,把war复制到这里

(3) 启动Tomcat的bin中的startup.bat(相当于火车头要启动了)

(4) 启动完成后,就可以看到webapps目录中就多了个这个东西

这个就是Tomcat会加载这里的war包,加载操作就是把这个war解压缩为目录了


2.7 验证程序

下面就是通过浏览器,来构造一个HTTP请求,来访问Tomcat服务器

然后就可以看到,这里自动打印了一条日志


3. 创建Servlet流程简化

上面创建Servlet一共有七个步骤,比较麻烦

(1) 创建项目 (2) 引入Servlet依赖 (3) 创建目录结构 (4) 编写代码

(5) 打包程序 (6) 部署程序 (7) 验证程序

那么有哪个步骤可以简化一下

步骤1,2,3虽然也有方法可以简化,但这三个步骤对于创建项目这个操作来说都是一次性的操作

步骤4编写代码肯定也是不可以简化的

而步骤5,6每次如果代码做出调整,都需要重新打包部署,这个就比较麻烦了

步骤7验证程序也不太好优化

综上所述,如果要简化创建Servlet的流程步骤,可以从步骤5,6入手

那么有什么办法呢” />

如果使用的是IDEA专业版,内置了Tomcat插件

如果使用的是IDEA社区版,可以使用第三方的 Smart Tomcat插件来完成

这个Smart Tomcat 插件是支持社区版和专业版的,并且这个插件使用更方便,比IDEA专业版自带的那个插件还方便,所以最好可以使用这个Smart Tomcat插件

下面开始下载插件

如果这个插件在IDEA上搜不到,那就直击去官网上下载

Smart Tomcat – IntelliJ IDEA & Android Studio Plugin | Marketplace (jetbrains.com)

点击get进行下载,下载完成后,就会得到一个jar包,

把这个jar包直接拖拽到idea中,就可以安装了

下载完成后,步骤5,6的操作就可以简化为这样

(1)先点击这个

(2)点击+号

(3)往下翻找到smart tomcat这个插件,点击

(4)进行简单的配置(Context path这个就是浏览器url访问的时候第一级路径,用来标识webapp的,这个Context path 就和前面所说的,war包名一样)

需要注意的是这个Smart Tomcat 是另一种运行tomcat的方式,没有真的去拷贝war包

(5) 点击确定后,这里就生成了一个运行配置,点击这个就可以”一键式”打包部署了

(就是让idea直接调用tomcat,并且加载我们写的Servlet程序)

可以看到运行成功了

(需要注意的是,一个程序可以绑定多个端口号,但一个端口不能被多个程序绑定,

就相当于一个人可以有多个手机号,但一个手机号不能被多个人同时使用一样,

所以在运行这个smart tomcat时,不要自己手动去点开启动tomacat服务器,这个smart tomcat会自动启动的)

可以看到日志打印到这里来了

tomcat运行方法有多种

1. 直接在 startup 这里运行,手动拷贝war包过去

2. 直接通过java代码.调用tomcat的jar包运行,不需要在调用的时候指定tomcat加载哪个webapp(只能加载一个)

这种方法,在webapp下不会有war包,也不会加载webapps目录下的东西


4. 工作原理流程分析

(1) 获取到URL中的第一级路径 /java123 确定一个webapp

(2) a) Tomcat找到 java123 目录之后,就会加载里面的类, 尤其是重点去识别出 @WebServlet 注释修饰的类

b) 就会取URL中的第二级路径 ./hello 这个也叫做Servlet Path

c) 然后就在 @WebServlet 注解中,知道名字为 /hello 的类

d) 找到类之后, 创建实例(只会创建一次,如果之前创建了,就直接复用上次的实例)

(3) 再解析出HTTP请求的方法”GET”,取出GET之后,就可以根据HTTP方法来调用对应的Servlet中的方法了

GET 请求调用 doGet方法

POST 请求调用 doPost方法

PUT 请求调用 doPut方法

DELETE 请求调用 doDelete方法 ……..

同时Tomcar还会构造出 HttpServletRequest对象和HttpServletResponse对象


5. 访问页面出错

(1)404 表示用户访问的资源不存在,大可能性是URL路径写的不对

原因主要有两方面:

1. 路径写错了 (就是你访问的页面,服务器没有.没有的话那就只能报错了)

2. webapp没有被tomcat正确加载 (就是你访问页面,本来服务器有,但是没有被服务器加载好)

一定要保证你的url写的正确

大部分情况下都是URL写的不对,但也可能是web,xml写错了

(2) 405 表示对应的 HTTP 请求方法没有实现.

请求的方法,服务器没实现,Get请求,服务器这里没写doGet,就会出现405

比如

还有一种是把super.doGet没有删除,也会出现405的情况

(3) 500一般是 Servlet 代码中抛出异常导致的

也就是服务器代码抛出异常了

(4) 出现 “空白页面”

出现这种情况是,响应数据这个操作可能是没执行到

(5) 出现”无法访问此网站”

这个就是你的Tomcat启动失败了,或者你的IP端口写错了

比如我现在没有启动tomcat