【JavaEE初阶】Tomcat安装与使用及初识Servlet

文章目录

  • 1. Tomcat的安装与使用
    • 1.1 Tomcat安装
    • 1.2 Tomcat的启动
    • 1.3 Tomcat部署前端页面
  • 2. Servlet
    • 2.1 Servlet是什么
    • 2.2 第一个Servlet程序
    • 2.3 常见错误

1. Tomcat的安装与使用

1.1 Tomcat安装

在浏览器中搜索Tomcat,打开官方网页.Tomcat官网
在这里插入图片描述
点击下载Tomcat8.
在这里插入图片描述
点击下载压缩包.
在这里插入图片描述
下载好后解压缩.
解压缩后得到的目录:
在这里插入图片描述
下面对上述关键文件做部分解释:

  • bin:可执行的程序/脚本.启动Tomcat就在这里.
  • conf:配置,用xml格式表示服务器的配置,比如像修改tomcat的绑定的端口号就需要修改这里的内容.
  • lib:tomcat依赖的一些库.(暂时不考虑)
  • logs(重要):日志,tomcat运行的日志都在这里.如果程序出问题了,如何排查?就看这个日志.
  • webapps:每个webapp都是一个"网站",一个tomcat上可以部署多个网站,此处就叫做"webapps". 这里包含很多目录,每个目录都视为一个独立的网站,后面我们所学习的代码也是部署到这个webapps里的.

1.2 Tomcat的启动

Tomcat的启动:
在这里插入图片描述
启动后,我们可以看到:
在这里插入图片描述
Server startup in xxx ms即为启动成功.

1.3 Tomcat部署前端页面

新建网页标签页,输入127.0.0.1:8080进入Tomcat欢迎页面.(此时Tomcat必须处于运行状态)
在这里插入图片描述
8080是Tomcat默认的端口号.就像MySQL的默认端口号是3306一样.
接下来我们尝试在Tomcat中部署前端代码:
以我们前面学习过的博客系统代码为例:
将blog系统拷贝至webapps这个文件夹中(部署):
在这里插入图片描述
在导航栏中输入http://127.0.0.1:8080/blog/blog_list.html通过网络来访问.
第一级路径(blog),也起了个名字,叫做application path/context path
在这里插入图片描述
这个页面和之前的不同,这个是通过网络来访问的.而之前的页面则是通过文件路径来访问的.
在这里插入图片描述
通过网络访问可以跨主机访问,通过路径只可以访问自己主机上的页面.

2. Servlet

2.1 Servlet是什么

Servlet: 是一种实现动态页面的技术.是Tomcat给java提供的原生的进行web开发的api.
网页分为两类:
静态页面:页面内容始终是固定不变的.(百度主页)
在这里插入图片描述
动态页面:页面内容随着输入参数不同而改变.(百度结构页)
在这里插入图片描述

2.2 第一个Servlet程序

我们先写一个hello world程序:预期写一个Servlet程序 部署到Tomcat上,通过浏览器访问,得到hello world字符串.

一共有七个步骤:

  1. 创建项目
  2. 引入依赖
  3. 创建目录结构
  4. 编写代码
  5. 打包程序
  6. 部署程序
  7. 验证
  1. 创建项目
    此处需要创建一个maven项目.

maven是个"工程管理"工具.它可以:

  1. 规范目录结构
  2. 管理依赖
  3. 构建
  4. 打包
  5. 测试

打开idea:
在这里插入图片描述
注意:首次使用maven,项目创建好之后,会在下面读条,从中央仓库加载一些maven的依赖.时间较久.
在这里插入图片描述
注意此处的目录:
在这里插入图片描述
2. 引入依赖
打开maven中央仓库,搜索Servlet.
在这里插入图片描述
此处选择3.1.0版本.
在这里插入图片描述
拷贝maven代码至pom.xml中.
在这里插入图片描述
注意添加 标签!如果有多个依赖,都往里面拷贝即可.
在这里插入图片描述
如果长时间标红,刷新:
在这里插入图片描述
在这里插入图片描述
3. 创建目录结构
虽然maven已经帮我们自动创建了一些目录,但是还不够.此处是需要使用maven开发一个web程序,还需要别的目录.
(1) 在main目录下,创建一个webapp目录
(2)在webapp下创建一个WEB-INF目录
(3)在WEB-INF下创建一个web.xml文件
在这里插入图片描述
(4)给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>

在这里插入图片描述
我们写的Servlet程序就相当于是车厢.Tomcat相当于是车头.我们把写好的Servlet程序放到webapps 目录下,就相当于把车厢挂到车头上.Tomcat如何识别webapps目录下哪些是需要拉着跑的车厢,哪些不是. 就需要靠我们复制粘贴的代码来识别.(WEN-INF/web.xml).
相当于投名状.

  1. 编写代码
    在这里插入图片描述

(1)HttpServlet 是Servlet api里提供的现成的类.写Servlet代码一般都是继承这个HttpServlet.
(2)重写doGet方法

在这里插入图片描述
我们写的doGet方法,不需要我们手动调用,而是交给Tomcat来调用.Tomcat收到get请求,就会触发doGet方法.Tomcat会构造好两个参数,reqresp. 其中req就是TCP socket 中读出来的字符串,按照HTTP协议解析得到的对象. 其中resp是个空对象(程序猿在doGet,根据请求req,结合业务逻辑构造出resp) resp是输出型参数.
doGet:根据请求计算响应.
super.doGet();父类的这个方法只是返回一个错误页面,需要删掉.

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;//注解是java中特殊的类,Java专门定义了一种"语法糖"来实现注解
//注解的作用,针对一个类/方法,进行额外的"解释说明"
//赋予了这个类.方法额外的功能/含义
//Tomcat实现的
//此处 @WebServlet("/hello") 的作用是:
//把当前的类,和一个HTTP请求的路径关联起来
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//在服务器的控制台里打印System.out.println("hello world");//将helloworld返回到客户端.//getWriter()会创建一个 write 对象//此处的 write 操作其实是往resp的body部分进行写入.//等resp对象整个构造好了,tomcat会统一转成 HTTP 相应的格式再写 socketresp.getWriter().write("hello world");}
}

doGet 是 Tomcat 收到Get 请求的时候就会调用,具体要不要低啊用doGet,还得看当前GET请求的路径是什么.不同的路径可以触发不同的代码.(关联到不同的类上)
一个Servlet程序中,可以有很多Servlet类,每个Servlet类都可以关联到不同的路径(对应到不同的资源).因此此处的多个Servlet就实现了不同的功能.

  1. 打包程序
    把程序编译好,得到一些.class文件,再将这些.class打成压缩包.
    jar包就是.class构成的压缩包,但是此处要打war包.jar包只是一个普通的java程序.而war包是tomcat专属的来描述webapp的程序.一个war包就是一个webapp.
    在这里插入图片描述
    双击package打包:
    在这里插入图片描述
    默认情况下maven打的是jar包,需要微调代码:
    在这里插入图片描述
    重新打包:
    在这里插入图片描述
  2. 部署程序
    把打包好的war拷贝到tomcatwebapps中即可.
    启动Tomcat.
    在这里插入图片描述
  3. 验证
    在地址栏中输入:http://127.0.0.1:8080/hello_servlet/hello
    在这里插入图片描述

小结:在浏览器中输入url之后,浏览器就构造了一个对应的HTTP GET请求,发送给tomcat. tomcat就根据第一级路径,确定了具体的webapp,根据第二级路径,确定了调用哪个类. 再然后通过GET/POSE方法确定调用HelloServlet的哪个方法(doGET,doPost)

在上述过程中,5打包,6部署程序两个过程可以使用IDEA的Tomcat插件把Tomcat 集成到IDEA中.就省去了我们手动打包的过程.手动部署的过程,只需要按一下运行,就可以自动打包部署.

基于tomcat插件自动打包部署,适用于开发阶段,频繁修改代码验证. 手动打包部署,适用于上线阶段,发布程序.

使用tomcat插件:
插件:功能的扩展.IDEA提供了一些API,可以让程序员开发插件,对IDEA现有功能进行扩展.

在这里插入图片描述
在这里插入图片描述
首次使用smart tomcat需要配置一下.
在这里插入图片描述
设置tomcat所在路径
在这里插入图片描述
在这里插入图片描述
但是我们可以看到,启动失败了.
在这里插入图片描述
8080端口被占用.可以打开cmd输入以下:可以看到
在这里插入图片描述
在这里插入图片描述

此时我们只需要关闭Tomcat即可.
在这里插入图片描述
重新启动成功.
在这里插入图片描述
在这里插入图片描述

smart tomcat工作原理:
不是自动拷贝war包(webapps中不变),是通过另一种方式来启动tomcat的.tomcat支持启动的时候显示指定一个特定的webapp目录,相当于是让tomcat 加载单个的webapp运行.
在这里插入图片描述
IDEA直接调用tomcat,让tomcat加载当前项目中的目录.

http://127.0.0.1:8080/后面跟的是context path
如果是直接拷贝war包的方式部署,context path就是war包名(目录名)
如果是smart tomcat的方式部署,此时这里是可以配置的.默认是项目名.

这两种部署,其实是两种tomcat的运行方式,对于context path的理解不同,在使用时需要特别注意.

2.3 常见错误

  1. 常见错误1: 404
    404 表示用户访问的资源不存在, 大概率是 URL 的路径写的不正确.
    在这里插入图片描述
    或者是你的webapp没有正确被部署: web.xml 写错了, 文件名错了, 文件路径错了, 文件位置错了…
  2. 常见错误2: 405
    405 表示对应的 HTTP 请求方法没有实现, 比如我们在浏览器发了个GET请求, 但是代码里没写doGet, 此时就会出现405.
    在这里插入图片描述
    还有可能就是重写的方法中没有去掉默认调用的父类方法, 如super.doGet
    在这里插入图片描述
  3. 常见错误3:500
    往往是Servlet代码中抛出异常导致的, 这个问题最好解决, 因为500的时候页面日志中会明确告诉你异常调用栈, 告诉你是哪一行代码出的异常
    比如我们给代码来一个空指针异常.
    在这里插入图片描述

在这里插入图片描述
4. 常见错误4: 出现空白页面
方法中逻辑没有写类似resp.getWriter().write()这样的代码

  1. 常见错误5: 页面无法访问
    最常见的原因就是Tomcat没有启动或者崩溃, 我们把Tomcat关了, 就会出现页面无法访问的情况, Tomcat无法启动, 很可能是端口冲突了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PSP - 使用 MMseqs2 工具快速搜索蛋白质序列数据库 (GMGC)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131934642 MMseq2 是非常强大和高效的生物信息学软件&#xff0c;可以在极短的时间内对大规模的核苷酸和蛋白质序列进行搜索和聚类。主要特点有&a…

fpga_pwm呼吸灯(EP4CE6F17C8)

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

c++网络编程:Boost.asio源码剖析

1、前言 Boost库是一个可移植、提供源代码的C库&#xff0c;作为标准库的后备&#xff0c;是C标准化进程的开发引擎之一。Boost库由C标准委员会库工作组成员发起&#xff0c;其中有些内容有望成为下一代C标准库内容。在C社区中影响甚大&#xff0c;是不折不扣的“准”标准库。…

未来行星探索希望:新型多脚机器人-团队版

机器人正在探索一个模拟的外星环境 即使一个机器人失败了&#xff0c;其余的团队成员也可以抵消它的损失。 背景 虽然探测器取得了令人难以置信的发现&#xff0c;但它们的轮子可能会拖慢它们的速度&#xff0c;而不稳定的地形可能会导致损坏。虽然没有东西可以取代“毅力号”…

Vue3输入框(Input)

APIs 参数说明类型默认值必传width输入框宽度string | number‘100%’falseaddonBefore设置前置标签string | slot‘’falseaddonAfter设置后置标签string | slot‘’falseallowClear可以点击清除图标删除内容booleanfalsefalsepassword是否启用密码框booleanfalsefalsedisabl…

两个小封装电机驱动芯片:MLX813XX、A4950

一&#xff0e;MLX813XX MELEXIS的微型电机驱动MLX813XX系列芯片集成MCU、预驱动以及功率模块等能够满足10W以下的电机驱动。 相对于普通分离器件的解决方案&#xff0c;MLX813XX系列电机驱动芯片是一款高集成度的驱动控制芯片&#xff0c;可以满足汽车系统高品质和低成本的要…

Spring Boot实践一

一、Spring Boot简介 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、方便的方式来创建基于Spring的应用程序&#xff0c;而无需繁琐的配置。Spring Boot通过自动配置和约定大于配置的方式&#xff0c;使得开发者可以更加专注于业务逻辑的实现&…

【CEEMDAN-WOA-LSTM】完备集合经验模态分解-鲸鱼优化-长短时记忆神经网络研究(Python代码实现)

目录 &#x1f4a5;1 概述 1.1 完备集合经验模态分解原理 1.2 鲸鱼优化 1.3 LSTM &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Python代码实现 &#x1f4a5;1 概述 1.1 完备集合经验模态分解原理 早期的 EMD 方法具有较强的自适应性&#xff0c;能够有…

【node.js】03-http模块

目录 一、什么是http模块 二、创建基本的WEB服务器 三、req请求对象 四、res响应对象 五、根据不同的url响应不同的JSON内容 一、什么是http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法&#xff0c;…

深度学习推理和训练

优化和泛化 深度学习的根本问题是优化和泛化之间的对立。 • 优化&#xff08;optimization&#xff09;是指调节模型以在 训练数据 上得到最佳性能&#xff08;即机器学习中的学习&#xff09;。 • 泛化&#xff08;generalization&#xff09;是指训练好的模型在 前所未…

Java的0xFFFF在赋值、比较时引起的困惑

Java中的0xFFFF是整型&#xff0c;在赋值、比较的时候容易引起混淆&#xff0c;涉及到符号位、数值大小&#xff0c;赋值给什么类型的变量。我今天在编码的时候就遇到了一些困惑。用代码样例的形式记录下来&#xff0c;加深理解&#xff1a; package com.thb;public class Tes…

RT-Thread快速入门-定时器管理

1时钟节拍 任何操作系统都需要提供一个时钟节拍&#xff0c;以供系统处理所有和时间有关的事件&#xff0c;如延时、线程的时间片轮转调度以及定时器超时等。时钟节拍&#xff08;OS Tick&#xff09;是操作系统中最小的时间单位。 时钟节拍是特定的周期性中断&#xff0c;这…

vue预览和下载txt、PDF、execl等在线文件

因为浏览器默认能直接打开TXT、PDF等文件索引默认就是点击链接打开文件。但是浏览器却又不能在线打开execl、world等文件。 现在我们可以统一的实现文件的预览以及下载。 下载文件 downloadfile方法 downloadfile(url,fileName){const newUrl url;const x new XMLHttpRequ…

【vue3】vue3的一般项目结构、成功显示自己的vue3页面

一、vue3的一般项目结构 Vue 3并没有规定特定的项目结构&#xff0c;因此您可以根据项目的需求和个人偏好来组织您的Vue 3项目。以下是一个常见的Vue 3项目结构示例&#xff0c;供参考&#xff1a; your-project/|- public/| |- index.html # 应用程序的入口HTML文件…

智慧井盖监测管理系统解决方案

一、方案概述 近年来&#xff0c;随着城市化的不断发展&#xff0c;城市地下管道设施的一步步完善&#xff0c;井盖作为城市基础设施中必不可少的一部分&#xff0c;其重要性也逐渐凸显。然而&#xff0c;在实际应用中&#xff0c;井盖监测和管理并不容易。如井盖地理位置分散&…

第一百一十四天学习记录:C++提高:类模板案例(黑马教学视频)

类模板案例 main.cpp代码&#xff1a; #include "myarray.hpp"void printIntArray(MyArray <int>& arr) {for (int i 0; i < arr.getSize(); i){cout << arr[i] << " ";}cout << endl; }void test01() {MyArray <int&…

史上最全,接口测试-Fiddler抓包常用功能总结(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Fiddler中常用的功…

macOS Monterey 12.6.8 (21G725) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.8 (21G725) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持…

C++运算符:优先级

#include <iostream> using namespace std;//#define INT int //宏命令 // typedef int BOO; //移动 // INT a10; // BOO b 12;void fun(string& str) {int pos str.find(a);cout << "位置" << pos << endl;str.replace(pos,…

Windows Active Directory密码同步

大多数 IT 环境中&#xff0c;员工需要记住其默认 Windows Active Directory &#xff08;AD&#xff09; 帐户以外的帐户的单独凭据&#xff0c;最重要的是&#xff0c;每个密码还受不同的密码策略和到期日期的约束&#xff0c;为不同的帐户使用单独的密码会增加用户忘记密码和…