第十章TomCat详解

news2025/5/19 16:12:22

文章目录

  • Tomcat的部署和启动
    • Tomcat扮演的角色
      • ①对外:Web服务器
      • ②对内:Servlet容器
    • 深入理解为什么需要TomCat
      • 从目的开始出发
      • 遇到的问题
      • 总过程
    • 部署
      • 前提
      • 解压
    • TomCat的目录文件
    • 启动Tomcat并访问首页
    • 如何部署一个项目
      • 访问对应的web资源
  • 专业版IDEA创建一个JavaWeb项目
      • 先创建一个普通的项目
      • 添加文件夹结构
      • web项目的结构
      • 配置TomCat
      • 添加我们相关的Servlet依赖
  • 测试我们IDEA下是否关联成功TomCat
      • Web工程中的资源
        • 静态资源
        • 动态资源
      • 访问资源的地址
        • #[1]静态资源
        • #[2]动态资源
      • 关于设置编码
  • 路径问题
      • 为什么要写路径
      • 为什么写路径这事有点复杂
      • 路径的各个组成部分
    • 关于使用浏览器来访问资源
      • 具体文件
      • Servlet
    • 动态获取上下文路径

Tomcat的部署和启动

Tomcat扮演的角色

①对外:Web服务器

在这里插入图片描述

②对内:Servlet容器

在这里插入图片描述

深入理解为什么需要TomCat

从目的开始出发

  • 我们是为了做web服务,也就是将我们的后端和我们前端连接在一起(网络连接,应用层来说就是运用我们的HTTP协议,往深了说就是我们的TCP/IP五层结构),前端是我们客户端(浏览器+前端三剑客为基础的),而后端是我们用高级语言代码写的服务器,从而实现前端进行展示和与用户交互,后端为前端提供数据和服务

遇到的问题

  • 第一个问题我们的浏览器发起了HTTP请求之后,我们如何在后端读取到这个请求,根据我们的业务需要,进行处理,发送给回浏览器
    • 第一步:我们需要回应HTTP请求,完成一次标准的HTTP协议通信——一个标准的HTTP的服务器(Web服务器)的功能img
  • 第二个问题我们需要将一次HTTP请求-响应,对应到Java的语句(Java的语句一定放在方法中)——将请求-响应的处理过程对应到某个类下的方法对应起来——Servelet容器的功能

img

总过程

在这里插入图片描述

部署

前提

Tomcat本身是一个Java程序,所以当前系统中必须正确配置了JAVA_HOME环境变量,需要对应的JVM来运行Java程序

解压

将Tomcat压缩包解压到一个非中文无空格的目录下。

image-20221207172040334

TomCat的目录文件

./images

启动Tomcat并访问首页

启动Tomcat:运行Tomcat解压后根目录下\bin\startup.bat即可,

image-20221207172519002

如果需要停止Tomcat,则运行shutdown.bat程序

小提示:将来我们在IDEA中启动Tomcat,如果IDEA卡死强关,Tomcat不会正常退出。下次再启动Tomcat会因为残留进程仍然占用8080端口,导致新的进程无法启动。此时可以使用shutdown.bat结束残留进程。

如何部署一个项目

image-20221207174127351

  • 我们把我们的项目在webapps下建立一个文件夹

image-20221207174808834

  • 在对应的文件下建立一个WEB-INF文件夹,必须要一模一样

访问对应的web资源

image-20221207175350289

专业版IDEA创建一个JavaWeb项目

先创建一个普通的项目

在这里插入图片描述

添加文件夹结构

image-20221208021252287

  • 进去添加对应web框架

web项目的结构

image-20221211133230797

配置TomCat

配置的相关信息

image-20221207232805647

在这里插入图片描述

image-20221211133704741

image-20221211132650438

  • 注意应该选中TomCat Server 而不是TomCatEE

添加我们相关的Servlet依赖

image-20221207234138110

在这里插入图片描述

image-20221207234517208

  • 去我们本地安装的TomCat找到对应servlet的jar包进行导入

测试我们IDEA下是否关联成功TomCat

web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
      <servlet>
          <servlet-name>Addservlet</servlet-name>
          <servlet-class>com.lsc.servlets.AddServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>Addservlet</servlet-name>
          <url-pattern>/add</url-pattern>
      </servlet-mapping>
</web-app>
  • 将对应的/add映射到我们的com.lsc.servlets.AddServlet这个类

对应的AddServlet这个类

public class AddServlet extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String fname=request.getParameter("fname");
        String priceStr=request.getParameter("price");
        int price=Integer.parseInt(priceStr);
        String fcountStr=request.getParameter("fcount");
        int fcount=Integer.parseInt(fcountStr);
        String remark=request.getParameter("remark");
        System.out.println(fname);
        System.out.println(price);
        System.out.println(fcount);
        System.out.println(remark);

    }
}
  • 我们这个类中重写的是doPost方法()

我们的index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <form action="add" method="post">
       名称:<input type="text" name="fname"/><br/>
       价格:<input type="text" name="price"/><br/>
       数量<input type="text" name="fcount"/><br/>
       备注<input type="text" name="remark"/><br/>
       <input type="submit" value="添加"/>
   </form>
</body>
</html>
  • 我们主要是看我们的form表单的
    • action属性是add,通过我们web.xml文件将其与com.lsc.servlets.AddServlet连接,我们的数据也会提交到这,
    • method属性是post,说明我们对应的http是post请求,对应也就是执行到我们的doPost方法

结果

image-20221210223345342

image-20221211135945196

Web工程中的资源

静态资源

  • HTML文件
  • CSS文件
  • JavaScript文件
  • 图片文件

动态资源

  • Servlet

访问资源的地址

#[1]静态资源

/Web应用名称/静态资源本身的路径

#[2]动态资源

/Web应用名称/虚拟路径

关于设置编码

tomcat8之前,设置编码:

get请求方式:

  • get方式目前不需要设置编码(基于tomcat8)
  • 如果是get请求发送的中文数据,转码稍微有点麻烦(tomcat8之前)
		String fname = request.getParameter("fname");
    //1.将字符串打散成字节数组
        byte[] bytes = fname.getBytes("ISO-8859-1");
    //2.将字节数组按照设定的编码重新组装成字符串
        fname = new String(bytes,"UTF-8");

post请求方式:

     request.setCharacterEncoding("UTF-8");

tomcat8开始,设置编码,只需要针对post方式

 request.setCharacterEncoding("UTF-8");

​ 注意:

​ 需要注意的是,设置编码(post)这一句代码必须在所有的获取参数动作之前

路径问题

为什么要写路径

  • 整个系统要根据功能拆分成许许多多独立资源
  • 资源之间既要完成自身的功能又要和其他资源配合
  • 写路径就是为了从一个资源跳转到下一个资源

为什么写路径这事有点复杂

在这里插入图片描述

  • 工程目录:我们写代码的地方,但是在服务器上运行的不是这个。
  • 部署目录:经过Java源文件编译目录重组后,IDEA就替我们准备好了可以在服务器上运行的部署目录。
  • 区别:因为从工程目录到部署目录经过了目录重组,所以它们的目录结构是不同的。
  • 基准:用户通过浏览器访问服务器,而服务器上运行的是部署目录,所以写路径的时候参考部署目录而不是工程目录。
  • 对应关系工程目录下的web目录对应部署目录的根目录,同时部署目录的根目录也是路径中的Web应用根目录

在这里插入图片描述

路径的各个组成部分

从最前面一直到Web应用名称这里都是固定写法,到资源名这里要看具体是什么资源。

image-20221213151545816

  • 我们的web应用名可以在我们的TomCat配置中设置Application context来设置

image-20221213151637979

关于使用浏览器来访问资源

具体文件

我们写代码的时候都是在工程目录下操作,所以参照工程目录来说最方便。按照工程目录的目录结构来说,从web目录开始按照实际目录结构写就好了(不包括web目录本身)。

./images

Servlet

访问Servlet的路径是我们在web.xml中配置的,大家可能注意到了,url-pattern里面的路径我们也是斜杠开头的,但是这个开头的斜杠代表Web应用根目录

image-20221213152131800

同样是开头的斜杠,超链接路径中的开头斜杠代表服务器根目录,Servlet地址开头的斜杠,代表Web应用根目录,怎么记呢?请看下面的准则

路径类型解析方式
由浏览器解析的路径开头斜杠代表服务器根目录
由服务器解析的路径开头斜杠代表Web应用根目录

image-20221213152211332

那么具体来说,哪些路径是浏览器解析的,哪些路径是服务器解析的呢?

  • 浏览器解析的路径举例:
    • 所有HTML标签中的路径
    • 重定向过程中指定的路径
  • 服务器解析的路径举例:
    • 所有web.xml中配置的路径
    • 请求转发过程中指定的路径

在这里插入图片描述

动态获取上下文路径

①上下文路径的概念

上下文路径(context path)=/Web应用名称

②动态获取

由于项目部署的时候,上下文路径是可以变化的,所以写死有可能发生错误。此时我们通过request对象动态获取上下文路径就不用担心这个问题了。调用下面这个方法,每一次获取的都是当前环境下实际的上下文路径的值。

request.getContextPath()

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

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

相关文章

力扣(718.1143)补9.12

718.最长重复子数组 这题真的想不到。 看图的话会好懂很多。 class Solution { public int findLength(int[] nums1, int[] nums2) { int nnums1.length; int n2nums2.length; int[][] dpnew int[n1][n21]; int result0; for(int…

【区块链-智能合约工程师】第二篇:Solidity入门

文章目录Solidity极简入门HelloWorld数值类型三种函数类型函数输出变量作用域引用类型参考文章&#xff1a;一文速览2022十大智能合约开发工具 资料地址&#xff1a;WTF学院 Solidity极简入门 HelloWorld remix&#xff1a;在线智能合约开发IDE&#xff08;Integrated Deve…

DBCO-PEG-Aminooxy, Aminooxy-PEG-DBCO,氨甲基聚乙二醇环辛炔

DBCO-PEG-Aminooxy &#xff0c; Aminooxy-PEG-DBCO&#xff0c;二苯并环辛炔-聚乙二醇-氨甲基&#xff0c;氨甲基聚乙二醇环辛炔 Product specifications&#xff1a; 1.CAS No&#xff1a;N/A 2.Molecular weightMV&#xff1a;1000&#xff0c;2000&#xff0c;34000&#x…

小侃设计模式(十八)-发布订阅模式

1.概述 发布订阅模式又叫观察者模式&#xff08;Observer Pattern&#xff09;&#xff0c;它是指对象之间一对多的依赖关系&#xff0c;每当那个特定对象改变状态时&#xff0c;所有依赖于它的对象都会得到通知并被自动更新&#xff0c;它是行为型模式的一种。观察者模式内部…

被吹爆的JVM笔记,一招教会什么是JVM调优,资深架构师强推!

面试经常被问 JVM 如何调优&#xff1f;这个问题该怎么回答&#xff1f;没有实际调优经验怎么办&#xff1f; 一般面试时问JVM调优&#xff0c;主要是因为&#xff0c;这个技术并不是懂了Java就能自然懂的&#xff0c;需要明白一些底层原理&#xff0c;有一些深度。所以比较适合…

传奇客户端文件介绍注解教程,GM必备知识

传奇客户端文件介绍注解教程&#xff0c;GM必备知识 很多朋友架设微端&#xff0c;或者说修改传奇版本素材方面的内容的时候对于客户端很懵逼&#xff01; 尤其是新手朋友他并不知道传奇客户端里面哪个文件是对应什么内容的&#xff01; 今天我们将这些发出来分享给支持奇速的朋…

高压放大器在IDE压电元件及其在仿生翼中的应用

实验名称&#xff1a;IDE压电元件及其在仿生翼中应用研究 研究方向&#xff1a;仿生学 测试目的&#xff1a; 优化IDE压电元件结构和组分出发&#xff0c;目的是为了获得大驱动位移、综合性能良好的IDE驱动件。着重研究IDE压电元件的力学和电学性能、驱动特性和在仿生翼上的集成…

LVGL学习笔记(一)--- 环境搭建

LVGL全程LittleVGL&#xff0c;是一个轻量化的&#xff0c;开源的&#xff0c;用于嵌入式GUI设计的图形库。并且配合LVGL模拟器&#xff0c;可以在电脑对界面进行编辑显示&#xff0c;测试通过后再移植进嵌入式设备中&#xff0c;可以高效地进行开发。 一.嵌入式设备的移植 L…

企业请体育冠军明星代言,为何要在年前邀请

行业形势好&#xff0c;要把握住消费升级的机会&#xff1b;行业调整时&#xff0c;要抓住结构性增长的机会。实力背书、冠军代言、让品牌成为品类创新&#xff0c;中小型这几个概念与品牌自身的卖点&#xff0c;每一个放在光中小型企业的品牌上都能独当一面&#xff0c;当一款…

C/C++ 内存分布---变量所在哪个内存区域以及变量所占空间大小是多少?

C/C内存区域划分&#xff1a; 变量所在哪个内存区域以及变量所占空间大小是多少&#xff1f; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const …

基于JavaFX+Mysql实现(PC)足球联赛评分系统【100010048】

一、引言 1. 编写目的 本文档是概要设计文档的组成部分&#xff0c;编写数据库设计文档的目的是&#xff1a;明确数据库的表名、字段名等数据信息&#xff0c;用来指导后期数据库脚本的开发。本文档的读者对象是需求人员、系统设计人员、开发人员、测试人员。 2. ### 术语表 …

GPT3动口,RT-1动手,智能机器人开卷; 代码开源!

机器学习 (ML) 研究的多个子领域&#xff08;例如计算机视觉和自然语言处理&#xff09;的最新重大进展是通过一种共享的通用方法实现的&#xff0c;该方法利用大型、多样化的数据集和能够有效吸收所有数据的表达模型。尽管已经有各种尝试将这种方法应于机器人技术&#xff0c;…

绘制雪夜圣诞树并封装为小程序

绘制雪夜圣诞树并封装为小程序 使用turtle绘制一颗雪夜圣诞树&#xff0c;然后封装成exe小程序送给你的朋友吧&#xff01; PS&#xff1a;只能在windows运行。 转载注明本文链接和作者 先看效果图&#xff1a; 绘制雪夜圣诞树 由于代码有三百多行&#xff0c;我放在下面的两…

Web前端105天-day45-DOM

DOM01 目录 前言 一、DOM 二、DOM树 三、class 总结 前言 DOM01学习开始 一、DOM DOM: Document Object Model 文档 : HTML代码 -- 超文本标记语言对象 : 网页真正显示的是 HTML 转换出来的 对象类型 -- document模型 : 固定的规则 -- 代表把 HTML代码 转 JS对象网页真…

Jmeter(十七):利用jmeter插件收集性能测试结果汇总报告和聚合报告,利用PerfMon插件收集监控服务器资源指标

利用jmeter插件收集性能测试结果 汇总报告&#xff08;Summary Report &#xff09; 用来收集性能测试过程中的请求以及事务各项指标。通过监听器--汇总报告 可以添加该元件。界面如下图所示 汇总报告界面介绍&#xff1a; 所有数据写入一个文件&#xff1a;保存测试结果到本地…

全产业链落实循环减碳实践 宝马在华持续推进绿色转型

作为率先推出“循环减碳”理念的汽车企业&#xff0c;宝马集团将循环经济理念贯彻到产品生命周期的各个阶段&#xff0c;并以“再思考、再精减、再利用、再回收”为指导原则&#xff0c;在产业链上下游不断壮大“循环减碳朋友圈”。“可持续发展是宝马集团的战略支点之一”&…

【爬虫】JS调试解决反爬问题系列1

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

AlibabaP8,耗时182天肝出来1015页分布式全栈手册

前言 到底什么是分布式&#xff1f;这个话题一直以来就在各大平台论坛上被热议。一千个读者里面就有一千个哈姆雷特。官方这边给出的结论是&#xff1a;分布式就是将相同或相关的程序运行在多台计算机上&#xff0c;从而实现特定目标的一种计算方式。而从分布式技术的起源来看…

这可能是2022最全的Java面试八股文!共计1658页,Java技术手册的天花板

前两天有个小伙伴在后台留言&#xff0c;最近的面试越来越难了&#xff0c;尤其是技术面&#xff0c;考察得越来越细&#xff0c;越来越底层&#xff0c;庆幸的是最终顺利找到了工作。 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识 比如果这样的问题…

mitmproxy 抓包神器-1.环境准备与抓取浏览器请求

前言 常见的抓包工具有fiddler 和 charles, 这些工具都是需要安装本地客户端&#xff0c;python 版的抓包工具可以用 mitmproxy。 mitmproxy 相比Charles、fiddler的优点在于&#xff0c;它可以命令行方式或脚本的方式进行mock 简介 mitmproxy&#xff08;man-in-the-middle…