Tomcat 就是一个 HTTP 服务器…
我们知道 HTTP协议就是客户端 和 服务器之间的交互数据的格式,可以用ajax 和 Java Socket 分别来构造 HTTP 客户端,这个Tomcat 就是基于Java的,有了他之后,他按照 HTTP 协议格式来解析请求,在调用用户指定的代码,并且按照 HTTP 响应的格式来构造返回数据,就可以让别人也来访问你的网页了
在官网下载即可:
到这里就下载安装完成了
官网链接:tomcat官网
补充:
正因为,一个 Tomcat上面可以同时部署多个 Servlet 程序,所以,也可以把 Tomcat 称为"Servlet 的容器",简称"容器"
所以在计算机圈子,我们经常会看到容器(Container)这个概念,到处都在用
容器1:
Java的集合类 => C++ 他们就称为 容器,然后一些Java程序员也跟着把 集合类 叫做容器
容器2:
Tomcat 是 Servlet 的容器,一个 Tomcat上面可以承载多个 webapp
容器3:
Spring 可以管理很多个 Bean 对象,Spring也可以称为 Bean 的容器
容器4:
Docker 也是涉及到 容器的概念,Docker 可以认为是轻量级的虚拟机(软件模拟出的一个计算机),一个docker程序里,可以有多个"轻量虚拟机",每个轻量虚拟机里面又可以包含很多程序,就把这个轻量虚拟机称为容器,进一步也把 docker 称为容器了…
… … … …
所以,以后如果听到容器这个词的时候,一定要仔细琢磨琢磨,分析分析,当前的这个"容器"到底是啥,千万不要把这些容器搞混了,驴唇不对马嘴就尴尬了
打开 bin > 双击startup.bat(windows)
有了这个说明成功启动了
1:出现闪退:环境变量的问题
Tomcat 要想成功运行,他就得找到 JDK!!,这就要需要你成功安装JDK,配置好环境变量,这是我之前配置好的环境变量
Tomcat得找到JDK这个位置,才能去调用
还是不行,不知道哪出问题了?我们可以这样来做
我们需要看到报错提示,把startup.bat直接拖到cmd,观察报错信息
会出现这些,这些是我已经配好了
如果这里的一组环境变量,某个有问题,他就会告诉你,是谁有问题,可能有些还不行,一直重复这个步骤,查看原因…
一般没配好的,会提示:
根据他提示的在环境变量中新建:把你的路径填进去
2:出现闪退:端口号被占用
Tomcat 是 一个 HTTP 服务器,启动的时候是要绑定端口的,一般他是绑定两个端口号:8080 , 8005,如果这个端口号已经被其他程序占用了,此时你在启动新的肯定是会失败的,就是说你已经启动了一个Tomcat,前一个没关,在启动一个新的,肯定会失败.
也有可能是电脑上有别的程序占用了8080 / 8005,这个时候如果你启动Tomcat,也是会失败的,查看端口:在cmd输入:netstat -an | findstr 8080
有的话就把这个被占用端口的进程干掉在启动tomcat
我们把 Tomcat启动之后,就可以通过浏览器来访问 Tomcat 了…
在浏览器输入:127.0.0.1:8080
,会出现tomcat欢迎界面
注意这里可能有的小伙伴会发现,明明可以启动成功,为啥访问不了出现了 404 或 500
这样的的状态码,除了上述端口被占用了以外(我们可以修改端口,或者关闭被占用端口的进程),出现 500 的状态码其实是最好解决的,因为他已经告诉了你原因,我们可能是文件夹权限的问题
解决办法:
我们可以根据此路径下新建一个html文件
启动tomcat并在网页打开他
就可以显示出我们的内容,这个用tomcat来访问的是可以让别人也来访问你的页面的(前提是你们处在同一局域网或者你有一个服务器,可以访问外网 IP)
如果我们每一个文件都放在 这个ROOT
里面会不会太多了,特别是还包含css ,js这种?
因此我们可以在webapps 里单独创建一个目录,把你的页面部署到这个目录中也行…
(你也可以放在 webapps 里,和 ROOT同级,只要路径对了就行,就需要我们前面理解的绝对路径和相对路径
)
是一个在 java 中 非常 6 的存在,是一个非常知名的"工程管理工具" / “构建工具”,他主要用于管理 "依赖"
,构建/编译(调用jdk时),打包 java代码给构成 jar包 或者 war包(特殊的压缩包,类似 rar这种),里面就是各种 .class文件
放到一起,向我之前写的 jdbc编程 就下载了一个mysql驱动包,就是依赖于他…
"依赖"怎么理解?
(按正常思维)要想结婚 得先有女朋友(男朋友)&&有房有车&&有钱…
他其实是很复杂的,可以嵌套 A > B > C > D 等等,如果没有这个Maven,你就需要自己捣鼓捣鼓,哪些是哪些的依赖,而有了Maven就不一样了,他自动帮我们整理,不需要你去捣鼓!!只能说非常香
这个我推荐使用 IDEA这个工具,他是真的 非常的香(里面是内置了现成的 Maven),可以去搜一下相关的IDEA下载教程
我们搭配 IDEA 来使用
就是一路yes:
我们要 使用 maven 帮我们下载并安装第三方库
举个例子:
我们以 当初 下载 mysql 驱动包为例
先去中央仓库上,找到mysql驱动包:
链接:https://mvnrepository.com/
我数据库是5版本的,随便找一个5版本的点击
把这里的Maven 标签页下的这个 xml 配置复制下来
把内容粘贴到刚刚创建项目的pom.xml里面
一般,maven是会自动从中央仓库那里下载依赖,第一次可能会比较久
(如果没导进来,mysql和版本那里一般是红色的),如果他没自动下载,我们可以手动刷新,就会下载
可能下载会比较慢,因为这个中央仓库服务器在国外
,所以尽量在网络环境好的时候使用maven
接下来就可以使用了:
Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app.
我们根据以下 7 个步骤来构建Servlet还是很容易的
不同版本的idea 可能创建的Maven项目不一定一模一样
就是需要我们在代码中 引入 Servlet api,这个 api是第三方(Tomcat)提供的,我们需要去中央仓库引入
链接:https://mvnrepository.com/
把它复制到 pom.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 Applicationdisplay-name>
web-app>
可能有些人导进去之后是红色的,像这种:
这种现象其实是正常的,因为有些idea他不能识别 Java以外的语言是否正确,他就会报红,我们只需要选中他,根据提示选第一个就行了
需要注意一点:我是把
super.doGet(req,resp)
给注释掉的,因为我们需要自己的模板,不需要他的
doGet 方法要做的工作,就是根据请求,计算生成响应…
一个服务器的工作流程,可以分成这样的三个步骤:
1:接收请求并解析 2:根据请求计算响应 3:构造响应数据,并返回给客户端
其中,步骤二就是我们程序员自己要实现的逻辑,第一步和第三步都是 tomcat 帮我们做好了的
举个例子:
我们可以把服务器想象成一个餐馆:
你对老板说:“来一碗清汤小面”,老板就会收到这个"来一碗清汤小面"的请求(请求)
,然后后厨就开始动起来了,后厨这里,一个下面,一个切菜,一个调料(他们就像是并发工作,相当于三个线程)(计算响应)
…,再来一个师傅整合…最后服务员把面端到你面前(响应)
这里就包含了这三个步骤
还有最后一步了:
就是路径要正确
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//干掉父类的doGet()
//super.doGet(req, resp);
//在程序控制台里打印,观察结果
System.out.println("hello world!");
//在页面上打印 hello world!
resp.getWriter().write("hello world!");
}
}
此处的代码编写就算完成了…
当前我们的代码没有main方法,是不能单独运行的
,所以就需要把当前的代码进行打包,然后 部署到 tomcat 上,然后有tomcat来进行调用(我们可以把这个完整的应用程序理解成一个能跑的汽车,Servlet代码 相当于是汽车上的货箱(自己动不了),tomcat就是车头可以跑(带着货箱跑))
把咱们刚刚的 war包 拷贝到 tomcat 的 webapps 目录下
在浏览器输入相关路径:
他返回的内容就是 HTTP响应的 body 部分,这个页面我们是通过 Java 代码生成的,和我们直接创建一个 HTML 是有区别的…HTML 里面的内容是固定死了的,不会改变,而我们通过 Java 代码生成的的内容是可以根据用户不同的输入,显示不同的结果
我在 Java 代码里加上一段时间戳
在运行:
刷新多次就会发现他的时间戳是不一样的
好了,这里的 7 个步骤就完成了,记住,上诉的 7 个 步骤这只是针对一个新的项目,如果我们项目已经创建好了,后续修改的时候,前面的 三个 步骤就不必要重复了,直接操作 4-7 就行
我们发现,每次打包部署都是比较麻烦的,因此我们也是有一些办法来提高上诉流程效率的,我们可以通过第三方工具来简化 5 和 6 的操作
IDEA 虽然本身已经有很多功能了,但是也不可能做到面面俱到!! 因此,IDEA 就提供了一系列的扩展能力,允许第三方来开发一些程序,交给 IDEA 运行,就相当于是对 IDEA 进行了扩展…
我们就可以通过 IDEA 上的插件,直接把 Tomcat 给集成进去,做到一键完成打包部署,smart tomcat
就是 IDEA 的一个插件…
需要注意一点:Tomcat 和 IDEA 是两个独立的程序!!! Tomcat 不是 IDEA 功能的一部分,在我们后面开发中,主要还是通过 IDEA 调用 Tomcat 的方式来进行的,可能用的时间长了,有些朋友就对 Tomcat 的印象开始模糊了,觉得 Tomcat 就是 IDEA 的一部分,这里我们一定要明确,
他们是两个独立的程序!!!
安装插件:
这样就让我们操作得更加简洁了
有些人可能会报这样的错误:
第一种:
他就表示端口被人占用了,说明我们已经启动了一个程序绑定了同一个端口,就会出现这样的错误,我们可以通过这样的命令:netstat -an | findstr 8080
去cmd
查看,关闭被占用的端口的进程即可,也有可能你idea已经启动了一个tomcat了,不能重复用,只要关闭之前的即可
出现他就是说你要访问的资源在服务器上是不存在的,要么就是你请求资源的路径不对,
要么就是路径虽然对了,但是服务器没有正确的把资源加载起来…
启动服务器页面显示就是 404
第二种:
这里就是少写了第二级路径Servlet Path
(hello)
第三种:
这里就是少写了第一级路径Context Path
(Servlet_project)
第四种:
web.xml
写错了
我这里把它给注释掉
重新启动tomcat
他是找不到的
在启动日志中,他也有提示:
405 表示对应的 HTTP 请求方法没有实现
第一种:
例如没有doGet方法,我们重启 tomcat服务器
虽然路径找到了,但是在调用doGet方法时,没有就会出现上述现象.
第二种:
换成 doPost 请求也是这样的原因
启动服务器:
第三种:
忘记注释掉 super.doGet(req,resp)…
重启tomcat:
此处的原因就需要我们进入到 doGet() 的源码当中了:
进入到了HttpServlet 源码当中,他是这样写的,拿到的如果是 一个HTTP/1.1
版本号,他就是直接返回一个 405 的响应
补充:
什么时候浏览器发的是 GET 请求?
1:直接在地址栏里,输入 URL
2:通过 a 标签跳转
3:通过 img/link/script…
4:通过 form 表单,method 指定为 GET
5:通过 ajax ,type 指定为 GET
啥时候浏览器发的是 POST 请求?
1:通过 form 表单,method 指定为 POST
2:通过 ajax,type 指定为 POST
这个往往是 Servlet 代码中抛出异常导致的,并且咱们的代码没有处理,这个异常就会抛到 Tomcat 当中…像这样的错误对我们来说是很好解决的,因为他下面一般都告诉了原因
例如我们这样修改代码:
重启tomcat
他告诉了我们具体的异常调用栈,在第 20 行
我们在仔细检查检查,就会发现是空指针异常
修改代码,方法里面没有写入内容:
重启tomcat 在访问:
这个就一般是 Tomcat 启动失败了
修改代码:
重启 tomcat:
我们就可以观察日志有这样的关键信息,这里需要我们仔细观察:
访问页面: