Tomcat+Servlet初识
文章目录
- Tomcat
- 什么是Tomcat
- Tomcat的安装
- 启动tomcat
- 静态页面的访问
- 动态页面的访问
- 一个Servlet程序的部署流程
Tomcat
什么是Tomcat
Tomcat是一个HTTP服务器,在开发或调试Servlet代码时应用广泛;使用Tomcat,实际就是将用户浏览器输入的http请求经Tomcat进行转发到目的服务器,再由Tomcat将目的服务器的响应信息返回给浏览器。
对于一些使用html,css等超文本标记语言编写的代码,可以直接通过浏览器使用Tomcat来查看效果;
Tomcat大抵就是充当一个中转站的效果,解析用户的http请求发给目的服务器,再将服务器的请求返回。
Tomcat的安装
直接去到tomcat的官网https://tomcat.apache.org/选择自己需要的版本,然后点击下图所示的压缩包进行下载即可:
下载完成之后,对压缩包进行解压,可以得到如下所示的目录结构:
这里简单介绍tomcat的目录结构,实际细节不必深究;
bin:该目录下主要存放一些可执行程序,像tomcat的启动就是使用该目录下的某个文件完成的;
conf:这里主要是有关tomcat的一些配置文件;
lib:该目录下是存放tomcat运行过程中所依赖的库;
logs:这里存放tomcat的运行日志;
temp:这里主要存放的是tomcat在运行过程中产生的一些临时文件;
webapps:该目录下就是存放业务代码(即自己写的代码),像html、css等
work:tomcat的工作目录;
启动tomcat
双击tomcat文件夹下bin目录中的文件startup.bat即可启动tomcat:
启动成功以后的效果图:
这里启动过程中出现乱码的原因是,tomcat默认使用UTF-8的编码方式来处理中文,但windows的cmd默认是使用GBK编码,两种编码方式的不同引起了这里启动时的乱码,但实际并不影响使用~
下面我们可以通过浏览器来尝试访问tomcat自带的页面:
127.0.0.1是一个环回ip,表示当前主机,而8080代表tomcat默认的端口号;
静态页面的访问
将一个静态文件(像html)拷贝到tomcat的webapps/root目录下,就可以使用浏览器进行访问:
动态页面的访问
一个Servlet程序的部署流程
相比于页面内容固定的静态页面,我们更多时候见到的都是根据用户操作不同而显示内容不同的动态页面,这就需要借助到Tomcat提供的API,即Servlet;
下面就是使用Servlet来完成一个简单代码,同时使用Tomcat通过浏览器来访问,整个过程需要这样7个步骤来完成:
- 创建项目
Tomcat自身是基于Java来实现的程序,因此它的正确运行是离不开Java的,这里创建项目就是使用Java的开发工具IDEA来创建一个Maven项目;
注意:如果是首次创建Maven项目,一定要等待项目的所有依赖加载成功(通过网络自动加载),这个过程可能会比较缓慢,需要耐心等待,但如果这里项目本身的依赖加载失败,后续势必会出现更多更加棘手的问题,当这里的目录结构如下图时,代表加载完成;
- 引入依赖
引入编写Servlet程序所需要的依赖;
大致流程如下:
访问maven中央仓库,https://mvnrepository.com/,在输入框中servlet;
选择第一个即可
然后根据自己的Java版本和Tomcat版本选择servlet的版本(可以在http://tomcat.apache.org/whichversion.html)查询三者对应的版本要求,这里我选择了servlet3.1的版本,然后复制如下面图所示的内容到maven项目的pom.xml文件中;
粘贴之前首先需要在pom.xml文件中写入一个标签 < dependencies > </ dependencies >,将复制的内容粘贴在标签内:
然后可以再次点击界面右侧的maven按钮,再次加载依赖,防止依赖加载失败而后续带来问题;
- 创建目录
在main目录下创建如下所示的目录结构,一定要保证与图上目录一致,因为这是tomcat方识别程序的要求,遵守是必须的;
然后在我们所创建的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>
- 编写代码
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;/*** Created with IntelliJ IDEA.* Description:* Date: 2023-03-13* Time: 19:21*///添加路径注解
@WebServlet("/hello")
public class ServletDemo1 extends HttpServlet {//重写doGet方法@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//简单打印一句代码到服务器的控制台System.out.println("hello,servlet!");//这句代码将在浏览器页面显示resp.getWriter().write("Hello,Servlet!");}
}
注解表示在tomcat收到的众多请求中,路径为/hello的请求才会调用ServletDemo1这个类中的代码,如果路径不对。tomcat就无法正确访问到代码;
doGet方法的两个参数分别表示收到的http请求和需要构造的http响应,这里的响应参数最初是一个空对象,后续调用方法以后返回的响应数据将被填充到此处;这个方法在tomcat收到get请求时才会被触发;
resp.getWrite()是将我们后面写入的数据作为响应数据的body,写回给浏览器;
这段代码不需要main方法作为程序的入口,因为在tomcat中就包含了main方法;
- 打包程序
打包程序依然是借助maven来完成,双击这里的package即可:
看到如下的提示就表示打包完成:
打包完成以后,就可以在项目的目录部分看到一个打包之后得到的jar包
maven打包生成的是默认的jar包,但是实际tomcat能够识别的却是一个war包,所以我们需要重新操作来得到一个war包,在pom.xml中添加如下代码:
<packaging>war</packaging><build><finalName>ServletDemo1</finalName></build>
packaging标签就是用来设置打包格式;
build标签下的finalName标签用来设置生成包的名字;
重新进行打包~
jar包中包含一些.class文件,是普通的Java程序打包的结果;
war包中包含.class文件,同时包含html、css、其他的jar包等;
- 部署
打包成功之后,就可以进行程序的部署了,实际就是将打包得到的war包复制粘贴到我们tomcat的webapps目录中去
然后,启动tomcat~
- 验证程序
部署成功之后,就可以使用浏览器构造http请求来验证我们程序的执行情况了;
http请求的构造我们借助环回ip来实现,这里的路径,首先是我们打包的war包的名字,然后是我们代码中注解的内容,注意不要写错哦~
这样,我们就在浏览器看到了程序的运行结果,一个简单的servlet程序就完成啦~
over!
相关文章:

Tomcat+Servlet初识
文章目录Tomcat什么是TomcatTomcat的安装启动tomcat静态页面的访问动态页面的访问一个Servlet程序的部署流程Tomcat 什么是Tomcat Tomcat是一个HTTP服务器,在开发或调试Servlet代码时应用广泛;使用Tomcat,实际就是将用户浏览器输入的http请…...

ChatGPT-4 终于来了(文末附免费体验地址)
大家好,我是小钱学长。 ChatGPT4.0 重磅来袭,今天一打开plus页面出现的就是这个GPT-4的体验界面!现在就带大家一起看看GPT4.0。 进入之后是这样的 看到最下面有一行话,目前应该是4个小时限制100条消息。 GPT-4有什么优势&…...

【C++学习】类和对象(中)一招带你彻底了解六大默认成员函数
前言:在之前,我们对类和对象的上篇进行了讲解,今天我们我将给大家带来的是类和对象中篇的学习,继续深入探讨【C】中类和对象的相关知识!!! 目录 1. 类的6个默认成员函数 2. 构造函数 2.1概念介…...
面试——Java基础
说一说你对Java访问权限的了解 在修饰成员变量/成员方法时,该成员的四种访问权限的含义如下: private:该成员可以被该类内部成员访问; default:该成员可以被该类内部成员访问,也可以被同一包下其他的类访…...

JavaWeb——Request(请求)和Response(响应)介绍
在写servlet时需要实现5个方法,在一个service方法里面有两个参数request和response。 浏览器向服务器发送请求会发送HTTP的请求数据——字符串,这些字符串会被Tomcat所解析,然后这些请求数据会被放到一个对象(request)里面保存。 相应的Tom…...

JMeter压测文件上传接口和中文乱码
一、压测文件上传接口 新建测试计划,然后添加需要的元件。 1、添加HTTP信息头管理器 可以在测试计划中添加,也可以在线程组里面添加。 我的接口使用到 token信息。这里在测试计划中添加。 2、添加线程组 上图解释:会在 2秒钟之内启动起来 5…...

CSRF漏洞复现
目录标题原理如何实现和xss区别危害CSRF实战(pikachu)dvwa靶场CSRF(Cross Site Request Forgery)。跨站请求伪造原理 攻击者会伪造一个请求(一般是一个链接),然后让用户去点击,然后…...

Google Colab导入GitHub python项目进行运行
本文介绍包含 ipynb后缀文件的github项目,导入到GitHub上进行运行的方法。 导入项目 Colab是需要梯子的。 访问网址:https://colab.research.google.com 输入github网之后回车,下面的内容是从github上自动获取的。 选择项目要打开的ipynb文…...

Qss样式表语法
QSS样式表语法 更多精彩内容👉个人内容分类汇总 👈👉QSS样式学习 👈文章目录QSS样式表语法[toc]概述一、样式规则二、选择器类型三、子控件四、伪状态五、样式表冲突解决六、级联七、继承八、命名空间中的控件概述 Qt样式表的概念…...
「Python 基础」异步 I/O 编程
I/O 密集型应用程序大大提升系统多任务处理能力; 异步 I/O 模型 一个消息循环,主线程在消息循环中不断重复 读取消息-处理消息; # 获取线程池 loop get_event_loop() while True:# 接收事件消息event loop.get_event()# 处理事件消息pro…...

通配符的匹配很全面, 但无法找到元素 ‘tx:advice‘ 的声明
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 通配符的匹配很全面, 但无法找到元素 ‘tx:advice’ 的声明 错误原因: xmlns和xsi:schemaLocation未书写约束或者书写错误 正确书写 <beans xmlns:tx&q…...

响应式编程详解,带你熟悉Reactor响应式编程
文章目录一、什么是响应式编程1、Java的流和响应式流2、Java中响应式的使用3、Reactor中响应式流的基本接口4、Reactor中响应式接口的基本使用二、初始Reactor1、Flux和Mono的基本介绍2、引入Reactor依赖3、响应式类型的创建4、响应式类型的组合(1)使用m…...

踩坑篇之WebSocket实现类中无法使用@Autowired注入对象
大家好,我是小简,今天我又大意了,在WebSocket这个类上踩坑了。 接下来我讲讲我踩坑的经历吧! package cn.donglifeng.shop.socket.endpoin;import cn.donglifeng.shop.common.context.SpringBeanContext; import cn.donglifeng.s…...

QT CTK插件框架 (一 下载编译)
CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit。为医学成像提供一组统一的基本功能;促进代码和数据的交互及结合;避免重复开发;在工具包(医学成像)范围内不断扩展到新任务,而…...

【Java版oj】day10 井字棋、密码强度等级
目录 一、井字棋 (1)原题再现 (2)问题分析 (3)完整代码 二、密码强度等级 (1)原题再现 (2)问题分析 (3)完整代码 一、井字棋 &a…...

JavaScript的事件传播机制
你在学习和编写JavaScript时可能听说过事件冒泡(event bubbling)。它会发生在多个元素存在嵌套关系,并且这些元素都注册了同一事件(例如click)的监听器时。 但是事件冒泡只是事件机制的一部分。它经常与事件捕获(event capturing)和事件传播…...

队列的定义及基本操作实现(链式)
个人主页:【😊个人主页】 系列专栏:【❤️数据结构与算法】 学习名言:天子重英豪,文章教儿曹。万般皆下品,惟有读书高 系列文章目录 第一章 ❤️ 学前知识 第二章 ❤️ 单向链表 第三章 ❤️ 递归 文章目录…...

集成方法!
目录 关注降低variance,选择bias较小的基学习器 Bagging Stacking Random Forest 关注降低bias,选择variance较小的基学习器 Adaboost Boosting 关注降低variance,选择bias较小的基学习器 Bagging 给定m个样本的数据集,利用有放回的随机采样法,得…...

20年程序员生涯,读了200多本技术书,挑了几本精华好书分享给大家
不知不觉已经又走过了20个年头了,今年已经44了,虽然我已经退休在家,但一直都保持着读书的习惯,我每年平均要读10本技术书籍,保持不让自己的技术落伍。 这些年读的技术书不下200本,很多好书我都会保存在家&a…...
C++ 手写一个WebServer
文章目录 前言一、WebServer的原理刨析二、HTTP协议基础三、C++代码实战四、运行测试前言 本文由:我不会画饼呀 提供建议 大家如果有什么想看的文章(想了解的知识点),都可以在本专栏文章底部评论,或者私信我,在有能力的前提下,我都会尽量给大家写出来,供大家学习参考 …...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...