Tomcat和第一个servlet程序

    • 安装tomcat
    • tomcat关键目录
    • tomcat闪退等问题
    • tomcat使用
    • servlet
    • 第一个servlet程序:
      • 1:创建maven项目
      • 2:引入依赖
      • 3:创建目录结构(maven创建这些目录结构并不够)
      • 4:编写代码(除了这步其它都是固定)
      • 5:打包程序
      • 6:部署程序
      • 7:验证
    • Tomcat插件(插件对idea现有的功能进行扩展)
      • Smart Tomcat获取
      • Smart Tomcat配置
    • 常见访问出错

http协议是http客户端与http服务器之间的通信使用协议
http:客户端;一般是浏览器
http服务器:有很多种实现;tomcat是java最知名广泛使用的。Tomcat服务器;可以把我们资源部分到这个服务器上;然后别人就可以访问。

安装tomcat

apache官网https://tomcat.apache.org/ ;下载解压缩就能使用。
在这里插入图片描述
是可以基于tcp socket模拟实现一个简单tomcat;逻辑是跟tcp编程是一样的。解析是按照http格式解析。tomcat基于java实现;需要jdk才能使用。我们的核心目标基于tomcat编程做出网站;基于tomcat进行网站后端开发;http对http协议进行一系列操作;tomcat把这些底层的http相关操作封装好;只需要调用tomcat提供的api即可。

tomcat关键目录

Tomcat和第一个servlet程序_第1张图片

bin:可执行程序/脚本;tomcat的启动也在这里
conf:放的是配置文件;用mxl格式表示服务器的配置;如果想改tomcat绑定的端口号就需要改这里
Tomcat和第一个servlet程序_第2张图片

lib:tomcat依赖的一些库;(暂时不考虑)
logs:日志;tomcat运行的日志都在这里;如果程序出现问题就可以通过看日志排查问题。可以按修改时间记录进行排序的。
Tomcat和第一个servlet程序_第3张图片

webapps:每一个webapp是一个网站;一个tomcat上可以部署多个网站;就叫webapps。包含很多目录;每一个目录都视为一个独立的网站;我们写的代码也是放到这个webapps部署的。

启动tomcat
Tomcat和第一个servlet程序_第4张图片
tomcat欢迎页面;得是运行状态才能访问。8080是默认端口号;可以修改;但是没什么必要;mysql是3306
Tomcat和第一个servlet程序_第5张图片
关闭:shutdown;直接点右上角的x号。效果是一样的。tomcat会绑定一个8005管理端口;通过这个端口来关闭;做一些收尾工作;通常的关闭方式是直接杀进程;点x号。

tomcat闪退等问题

运行start.bat 闪退;问题是什么并不关键;关键在于如何找到问题。
解决方法:
把这个.bat程序拖入cmd运行;系统会提示错误问题。典型没有配置环境变量。看具体报错原因;缺什么就配置什么。理论上是不需要配置就能使用;但是有些电脑就是得要配置才能使用。

tomcat使用

tomcat最大的用途就是把写好的网站部署上去。
1:复制粘贴上webapps;可能需要重启一下tomcat。也有办法热部署;得需要WEB-INF目录;得有web.xml文件。
Tomcat和第一个servlet程序_第6张图片

第一级路径;bolog叫做application/context path

这种访问方式是通过网络来访问的;而直接双击liao.html是通过文件路径访问的。通过网络访问是可以跨主机;而通过文件访问不行;跨主机还得我们要有外网ip

servlet

servlet 是tomcat提供java进行web开发的原生api;未来学习框架Spring全家桶;Spring MVC也是进行web开发的api;相当于是对servlet的封装。
网页:静态和动态网页;静态网页是始终固定不变;动态网页是随着输入参数的不同而改变。

第一个servlet程序:

1:创建maven项目

什么是maven:
maven项目管理工具;传统工程我们直按把jar包放置在项目中, Maven工程真正的jar包放置在仓库中,项目中只用放置jar包的坐标。不使用Maven工具,当做 Java 项目需要第三方依赖包时,将别人打好的 Jar 包下载到本地,然后手动指定给项目。另外,比如版本控制,需要新版本怎么办,重新下载,重新指定,这个过程操作麻烦。而用了 Maven 之后,需要什么包,直接在 pom.xml 中添加几行 xml 代码(添加所依赖jar包的坐标),指定包名、版本等,就可以了,方便开发。(管理依赖;打包等功能)

创建过程:
2022后界面;不要选择下面的maven项目模板。
Tomcat和第一个servlet程序_第7张图片
老的idea界面
Tomcat和第一个servlet程序_第8张图片

首次使用maven;项目创建好之后;下方会继进行读条;从中央仓库加载一些maven依赖;网络需畅通;maven仓库在国外可能会需要比较久。不必改国内镜像;只是第一次会这样子。 (maven是独立程序;但是IDEA已经自带的;所以不需要安装额外插件)

目录介绍:

Tomcat和第一个servlet程序_第9张图片

2:引入依赖

通过第三方库引入;tomcat接口jar包。中央仓库
选择3.1.0版本;和tomcat8是匹配的。

Tomcat和第一个servlet程序_第10张图片

Tomcat和第一个servlet程序_第11张图片
把这段复制下来:

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

进入我们servlet程序;创建一对 标签把刚才复制的内容粘贴进去。然后这段代码就可以建个文档保存下来;要用的时候随时能拿到。。
Tomcat和第一个servlet程序_第12张图片
Tomcat和第一个servlet程序_第13张图片

3:创建目录结构(maven创建这些目录结构并不够)

mian目录下创建和java,resources并列的webapp目录。名字和结构都不能错
webapp下创建WEB-INF目录
在WEB-INF创建一个web.xml
Tomcat和第一个servlet程序_第14张图片
把下面的代码粘贴到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和第一个servlet程序_第15张图片
结果会标红;但不是什么问题。idea只是对java代码的判定是几乎100%准确的;但是html、css、js、xml、json、sql等不一定。这里标红是因为没有添加到gitee。判断代码是否正确唯一标准是看运行结果。

运行问题:
servlet代码没有main方法是一大特点;main像汽车发动机;servlet程序就是车厢;tomcat车头;通过把servlet程序扔到webapps目录下;就自动挂车头后面。具体tomcat是怎么区分哪些是需要拉着跑的车厢呢?
靠WEB-INF/web.xml;通过这个;tomcat就知道这是要拉着跑的车厢。

4:编写代码(除了这步其它都是固定)

具体编写步骤:继承Httpservlet类(这里继承可能没有显示这个类;因为导入依赖问题;回到pom.xml刷新一下。实在没有就自己导入类。);重写相应的方法;再把这个重写的方法调用父类这个方法给注释掉;因为我们希望是用子类的版本代替父类的。我们这里处理get请求是重写doGet方法。如果是post请求;则是重写dopost。最后一步把结果写在响应里

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class hello_servlet extends HttpServlet {
//servlet api提供现成的类;写servlet代码一般继承这个类


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);得注释掉这个父类的方法返回的结果只是一个错误页面。
           resp.getWriter().write("hello world");//这里writer对象是往resp的body部分进行写入;等这个对象构造好;Tomcat统一转成HTTP响应的格式;然后写入socket。也可能是直接写网卡;或者内存缓冲区;具体看Tomcat的代码是怎么实现的。
    }
}

doGet方法:
我们写这个doGet方法不需要我们去调用;而是自动由tomcat在收到get请求时调用;这个doGet方法有两个参数;Tomcat会构造好这两个参数;
req:从TCP socket读出来的按照HTTP协议的字符串;这个对象里的属性是和我们抓包的HTTP请求报文格式是对应的;相当于把请求给封装成对象;方便我们全使用里面的属性、方法。
resp:空的对象(不是null;new一个对象里面的属性没设置)。相当于输出型参数;需要我们在doGet根据请求req;结合我们自己的业务需求、逻辑构造出一个resp对象出来。

添加注解:
这里还需要添加一个注解;不同的方法注解里的内容是不能相同的;注解是java特殊的类;针对一个类/方法进行额外的解释说明;赋予额外的功能或含义。
@WebServlet(“/hello”)注解 这里是把当前类和一个HTTP请求的路径关联起来。Tomcat收到Get请求就会调用doGet;具体要不要真的调用;还得看当前Get请求的路径是什么;不同的路径触发的是不同的代码;关联不同的类上。一个servlet程序可以有很多servlet类;每个类都关联到不同的路径也就是对应不同资源。
Tomcat和第一个servlet程序_第16张图片

5:打包程序

Tomcat和第一个servlet程序_第17张图片
成功效果

Tomcat和第一个servlet程序_第18张图片
打包完会在target目录下
Tomcat和第一个servlet程序_第19张图片
但是我们这里想要打的是war包;maven默认打的是jar包。需要我们配置一下
Tomcat和第一个servlet程序_第20张图片
重新刚才的打包操作:
Tomcat和第一个servlet程序_第21张图片
这里生成一个war包;带有一个默认的名字。这个名字也能修改;
Tomcat和第一个servlet程序_第22张图片
直接点击idea的三角符号运行是在本地运行;而不是在另一个服务器运行。

6:部署程序

将刚才的war包复制;粘贴到Tomcat的webapps目录下即可;然后启动Tomcat。如果tomcat正在启动;直接拷贝也能识别;但是可能会存在bug。

Tomcat和第一个servlet程序_第23张图片

7:验证

Tomcat和第一个servlet程序_第24张图片

过程:浏览器输入URL;浏览器构造一个对应http GET请求;发给Tomcat;tomcat根据一级路径确定具体webapp;根据二级路径确实是调用哪个类。然后根据是GET还是POST方法调用这个类的哪个方法(doget;dopost等等);我们这里是直接写IP地址;而不是域名;不需要通过dns域名解析

Tomcat插件(插件对idea现有的功能进行扩展)

把打包和部署程序的步骤给省略掉;适用于开发阶段;因为我们需要频繁修改代码和测试;不能修改一次就重新打一次包又部署一次。大大影响效率。

Smart Tomcat获取

获取方式:插件得要idea提供这个api才能实现。专业版idea是内置Tomcat Server的插件;和Smart Tomcat功能差不多。
Tomcat和第一个servlet程序_第25张图片
如果搜索没显示Smart Tomcat:官网下载;点击下载按钮是jar包;然后把jar包拖到idea就自动安装。

Smart Tomcat配置

首次使用需要进行配置;
Tomcat和第一个servlet程序_第26张图片
Tomcat和第一个servlet程序_第27张图片
运行:
第一次配置后后面就无需再配置;运行;点击idea就会调用tomcat运行程序。如果我们的tomcat没关闭就会出现端口冲突;
Tomcat和第一个servlet程序_第28张图片
解决方法:这么多个8080;listening状态才算。
Tomcat和第一个servlet程序_第29张图片

启动成功后下面有一个链接;直接点是404;因为不包含servlet path。Smart Tomcat启动是另一种方式;指定单个webapp目录运行;没有打包和拷贝解压缩过程。像我们之前的tomcat欢迎界面是无法访问到的。
Tomcat和第一个servlet程序_第30张图片
这两种启动方式对contxet path的理解不同;war包方式context path就是war包目录名。smart tomcat 启动;context path是可以配置的;默认是项目名。
Tomcat和第一个servlet程序_第31张图片

http://127.0.0.1:8080/context path/ servlet path
在这里插入图片描述
context path是什么;servlet path是什么;
ContextPath:Web 应用的入口点名字;也就是Web项目根目录
ServletPath:Servlet类的映射路径

常见访问出错

404错误
错误1: 少写了 Context Path
错误2:少写了 Servlet Path
错误3: Servlet Path 写的和 URL 不匹配
错误4:web.xml写错;或者没有
Tomcat和第一个servlet程序_第32张图片

405错误:
比如你发的GET请求;但是你的代码没有doget方法;此时就会出现405。我们super.doGet方法返回的就是405.所以我们需要注释掉这行代码。
Tomcat和第一个servlet程序_第33张图片
500错误:
本质代码抛出异常;日志会明确告诉你是哪行代码出现错误。
Tomcat和第一个servlet程序_第34张图片
tomcat没启动:
Tomcat和第一个servlet程序_第35张图片

如果出现乱码问题:
Tomcat和第一个servlet程序_第36张图片

你可能感兴趣的:(网络,tomcat,servlet,java)