当前位置: 首页 > news >正文

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个步骤来完成:

  1. 创建项目

Tomcat自身是基于Java来实现的程序,因此它的正确运行是离不开Java的,这里创建项目就是使用Java的开发工具IDEA来创建一个Maven项目;
在这里插入图片描述
在这里插入图片描述
注意:如果是首次创建Maven项目,一定要等待项目的所有依赖加载成功(通过网络自动加载),这个过程可能会比较缓慢,需要耐心等待,但如果这里项目本身的依赖加载失败,后续势必会出现更多更加棘手的问题,当这里的目录结构如下图时,代表加载完成;
在这里插入图片描述

  1. 引入依赖
    引入编写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按钮,再次加载依赖,防止依赖加载失败而后续带来问题;

在这里插入图片描述

  1. 创建目录

在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>
  1. 编写代码
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方法;

  1. 打包程序
    打包程序依然是借助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包等;

  1. 部署
    打包成功之后,就可以进行程序的部署了,实际就是将打包得到的war包复制粘贴到我们tomcat的webapps目录中去
    在这里插入图片描述

然后,启动tomcat~

  1. 验证程序
    部署成功之后,就可以使用浏览器构造http请求来验证我们程序的执行情况了;
    http请求的构造我们借助环回ip来实现,这里的路径,首先是我们打包的war包的名字,然后是我们代码中注解的内容,注意不要写错哦~
    在这里插入图片描述
    这样,我们就在浏览器看到了程序的运行结果,一个简单的servlet程序就完成啦~

over!

相关文章:

Tomcat+Servlet初识

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

ChatGPT-4 终于来了(文末附免费体验地址)

大家好&#xff0c;我是小钱学长。 ChatGPT4.0 重磅来袭&#xff0c;今天一打开plus页面出现的就是这个GPT-4的体验界面&#xff01;现在就带大家一起看看GPT4.0​。 进入之后是这样的 看到最下面有一行话&#xff0c;目前应该是4个小时限制100条消息。 GPT-4有什么优势&…...

【C++学习】类和对象(中)一招带你彻底了解六大默认成员函数

前言&#xff1a;在之前&#xff0c;我们对类和对象的上篇进行了讲解&#xff0c;今天我们我将给大家带来的是类和对象中篇的学习&#xff0c;继续深入探讨【C】中类和对象的相关知识&#xff01;&#xff01;&#xff01; 目录 1. 类的6个默认成员函数 2. 构造函数 2.1概念介…...

面试——Java基础

说一说你对Java访问权限的了解 在修饰成员变量/成员方法时&#xff0c;该成员的四种访问权限的含义如下&#xff1a; private&#xff1a;该成员可以被该类内部成员访问&#xff1b; default&#xff1a;该成员可以被该类内部成员访问&#xff0c;也可以被同一包下其他的类访…...

JavaWeb——Request(请求)和Response(响应)介绍

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

JMeter压测文件上传接口和中文乱码

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

CSRF漏洞复现

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

Google Colab导入GitHub python项目进行运行

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

Qss样式表语法

QSS样式表语法 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;QSS样式学习 &#x1f448;文章目录QSS样式表语法[toc]概述一、样式规则二、选择器类型三、子控件四、伪状态五、样式表冲突解决六、级联七、继承八、命名空间中的控件概述 Qt样式表的概念…...

「Python 基础」异步 I/O 编程

I/O 密集型应用程序大大提升系统多任务处理能力&#xff1b; 异步 I/O 模型 一个消息循环&#xff0c;主线程在消息循环中不断重复 读取消息-处理消息&#xff1b; # 获取线程池 loop get_event_loop() while True:# 接收事件消息event loop.get_event()# 处理事件消息pro…...

通配符的匹配很全面, 但无法找到元素 ‘tx:advice‘ 的声明

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

响应式编程详解,带你熟悉Reactor响应式编程

文章目录一、什么是响应式编程1、Java的流和响应式流2、Java中响应式的使用3、Reactor中响应式流的基本接口4、Reactor中响应式接口的基本使用二、初始Reactor1、Flux和Mono的基本介绍2、引入Reactor依赖3、响应式类型的创建4、响应式类型的组合&#xff08;1&#xff09;使用m…...

踩坑篇之WebSocket实现类中无法使用@Autowired注入对象

大家好&#xff0c;我是小简&#xff0c;今天我又大意了&#xff0c;在WebSocket这个类上踩坑了。 接下来我讲讲我踩坑的经历吧&#xff01; package cn.donglifeng.shop.socket.endpoin;import cn.donglifeng.shop.common.context.SpringBeanContext; import cn.donglifeng.s…...

QT CTK插件框架 (一 下载编译)

CTK 为支持生物医学图像计算的公共开发包&#xff0c;其全称为 Common Toolkit。为医学成像提供一组统一的基本功能&#xff1b;促进代码和数据的交互及结合&#xff1b;避免重复开发&#xff1b;在工具包&#xff08;医学成像&#xff09;范围内不断扩展到新任务&#xff0c;而…...

【Java版oj】day10 井字棋、密码强度等级

目录 一、井字棋 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、密码强度等级 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、井字棋 &a…...

JavaScript的事件传播机制

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

队列的定义及基本操作实现(链式)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️数据结构与算法】 学习名言&#xff1a;天子重英豪&#xff0c;文章教儿曹。万般皆下品&#xff0c;惟有读书高 系列文章目录 第一章 ❤️ 学前知识 第二章 ❤️ 单向链表 第三章 ❤️ 递归 文章目录…...

集成方法!

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

20年程序员生涯,读了200多本技术书,挑了几本精华好书分享给大家

不知不觉已经又走过了20个年头了&#xff0c;今年已经44了&#xff0c;虽然我已经退休在家&#xff0c;但一直都保持着读书的习惯&#xff0c;我每年平均要读10本技术书籍&#xff0c;保持不让自己的技术落伍。 这些年读的技术书不下200本&#xff0c;很多好书我都会保存在家&a…...

C++ 手写一个WebServer

文章目录 前言一、WebServer的原理刨析二、HTTP协议基础三、C++代码实战四、运行测试前言 本文由:我不会画饼呀 提供建议 大家如果有什么想看的文章(想了解的知识点),都可以在本专栏文章底部评论,或者私信我,在有能力的前提下,我都会尽量给大家写出来,供大家学习参考 …...

Elasticsearch 简介与安装

简介 Elasticsearch 是一个开源的搜索引擎&#xff0c;建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库—​无论是开源还是私有。 但是 Lucene 仅仅只是一个库。为了充分发挥其功能&#xff0c;你需要使用 Java…...

Qt5.12实战之QByteArray与字符指针及字符串转换

示例源码:#include <QCoreApplication> #include <QDebug> #include <QTextStream> static QTextStream cout (stdout,QIODevice::WriteOnly); #include <iostream> #include <QtGlobal> #include <QByteArray>void test() {qDebug() <…...

二、ElasticSearch基础语法

目录一、简单了解ik分词器(分词效果)1.standard(单字分词器&#xff0c;es默认分词器)2.ik_smart分词(粗粒度的拆分)3.ik_max_word分词器&#xff08;最细粒度拆分&#xff09;二、指定默认分词器1.为索引指定默认分词器三、ES操作数据1.概述2.创建索引3.查询索引4.删除索引5.添…...

Yolov8详解与实战

文章目录摘要模型详解C2F模块Losshead部分模型实战训练COCO数据集下载数据集COCO转yolo格式数据集&#xff08;适用V4&#xff0c;V5&#xff0c;V6&#xff0c;V7&#xff0c;V8&#xff09;配置yolov8环境训练测试训练自定义数据集Labelme数据集摘要 YOLOv8 是 ultralytics …...

多线程案例——阻塞队列

目录 一、阻塞队列 1. 生产者消费者模型 &#xff08;1&#xff09;解耦合 &#xff08;2&#xff09;“削峰填谷” 2. 标准库中的阻塞队列 3. 自己实现一个阻塞队列&#xff08;代码&#xff09; 4. 自己实现生产者消费者模型&#xff08;代码&#xff09; 一、阻塞队列…...

学习优秀博文(【国产MCU移植】手把手教你使用RT-Thread制作GD32系列BSP)有感 | 文末赠书5本

学习优秀博文&#xff08;【guo产MCU移植】手把手教你使用RT-Thread制作GD32系列BSP&#xff09;有感 一篇优秀的博文是什么样的&#xff1f;它有什么规律可循吗&#xff1f;优秀的guo产32位单片机处理器是否真的能成功替换掉stm32的垄断地位&#xff1f; 本文博主以亲身经历聊…...

写用例写的焦头烂额?看看摸鱼5年的老点工是怎么写的...

给你个需求&#xff0c;你要怎么转变成最终的用例&#xff1f; 直接把需求文档翻译一下就完事了。 老点工拿到需求后的标准操作&#xff1a; 第一步&#xff1a;解析需求 先解析需求-找出所有需求中的动词&#xff0c;再列出所有测试点。测试点过程不断发散&#xff0c;对于…...

基于深度学习的鸟类检测识别系统(含UI界面,Python代码)

摘要&#xff1a;鸟类识别是深度学习和机器视觉领域的一个热门应用&#xff0c;本文详细介绍基于YOLOv5的鸟类检测识别系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码以及PyQt的UI界面。在界面中可以选择各种鸟类图片、视频以及开启摄像头进行检测识别…...

零基础搭建Tomcat集群(超详细)

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…...

机器学习自学笔记——聚类

聚类的基本概念 聚类&#xff0c;顾名思义&#xff0c;就是将一个数据集中各个样本点聚集成不同的“类”。每个类中的样本点都有某些相似的特征。比如图书馆中&#xff0c;会把成百上千的书分成不同的类别&#xff1a;科普书、漫画书、科幻书等等&#xff0c;方便人们查找。每…...

什么是微网站/成都seo论坛

题目&#xff1a; 我是超链接 题解&#xff1a; 题目中有三个条件&#xff0c;我们先不管第三个看起来很长的条件&#xff0c;那么就是让求。 ∑i1n∑j1mij(i,j)∑i1n∑j1mij(i,j)经过类似 luogu3768的化简&#xff0c;我们得到的是∑T1nsum(nT)sum(mT)T∑t|Tμ(t)t∑T1nsu…...

网架钢构公司/seo的作用有哪些

项目地址&#xff1a;RedPackage简介&#xff1a;发布应用市场的 android 平台抢红包工具《红包精灵》开源啦&#xff0c;实现自动抢&#xff0c;快人一步&#xff0c;抢到手软。关键 Service 代码&#xff1a; 注&#xff1a;此前在 15 年 12 月时&#xff0c;用的 Eclipse 开…...

推广网站排名/抖音seo关键词优化排名

Groovy中对Json的操作 我们以一个List 为例&#xff0c;把它转成json&#xff0c;在转为List 实体类&#xff1a; class Person {String nameint agedef eat() {println "${name} 在吃饭"}Overridepublic String toString() {return "Person{" "na…...

惠网 做网站/专业培训

那些年我们写过的爬虫 从写 nodejs 的第一个爬虫开始陆陆续续写了好几个爬虫&#xff0c;从爬拉勾网上的职位信息到爬豆瓣上的租房帖子&#xff0c;再到去爬知乎上的妹子照片什么的&#xff0c;爬虫为我打开了一扇又一扇新世界的大门。除了涨了很多姿势之外&#xff0c;与网管斗…...

金华网站建设团队/虎扑体育网体育

获取【下载地址】QQ: 313596790官网 http://www.fhadmin.org/A代码编辑器&#xff0c;在线模版编辑&#xff0c;仿开发工具编辑器&#xff0c;pdf在线预览&#xff0c;文件转换编码B 集成代码生成器[正反双向](单表、主表、明细表、树形表&#xff0c;快速开发利器)快速表单构建…...

衢州建设职业学校网站/北京官网优化公司

今天早上在写一个.scala文件时&#xff0c;控制台一直出现这个错误。 原本以为这个错误是找不到URL地址&#xff0c;不能使用local[*]这种模式&#xff0c;后来发现这个错误的根本是在上一行&#xff0c;也就是&#xff1a; SparkContext: Error initializing SparkContext 原…...