搭建Tomcat(六)---Response的实现

目录

引入

一、前端项目容器的搭建

重建项目:

1.创建一个新的项目:

 2.创建HTML文件

 3.将先前编写的所有tomcatJava文件挪过来

二、配置java文件 

1.重启一下MyTomcat

2.配置两个工具包

①FileUtil

②ResponseUtil(响应头)

三、处理Response文件

【注意注释】

File

 四、处理MyTomcat

1.处理扫描资源的方法

 2.处理Response实例

​编辑 3.实验

①先运行MyTomcat,时刻捕捉4747端口(以4747为例)的请求:

②客户端搜索:

 ③回车后得到结果:

五、完善动态资源的检索


引入

在先前的学习中,tomcat已经实现了大半部分,即获取请求以及做出request处理,接下来就是处理response(在先前的学习中都是虚拟模拟的空,现在来处理一下response这一块。)

一、前端项目容器的搭建

既然是返回,那么返回的数据包括且不限于是HTML文件,动态资源servlet等等,但是目前的Java项目并不支持前端界面HTML的承载,那么就需要重建这么一个能承载HTML文件的项目。

重建项目:

1.创建一个新的项目:

选择Maven后什么都不点,点击下一步:

这里可以改变它的创建路径:

 随后点击完成,点击确认新窗口打开,就会进到这里面来。

 2.创建HTML文件

 此时,这个窗口就可以编写HTML前端文件了,可以正常编写前端代码:

编写如下代码,接着我们用tomcat实现获取这个静态HTML文件: 

 3.将先前编写的所有tomcatJava文件挪过来

copy后挪过来:

二、配置java文件 

1.重启一下MyTomcat

确定copy到这个项目后,依旧能够正常使用:

2.配置两个工具包

①FileUtil

这个文件主要用于处理文件和流:

import java.io.*;/*** 该类的主要作用是进行读取文件*/
public class FileUtil {public  static  boolean writeFile(InputStream inputStream, OutputStream outputStream){boolean success = false ;BufferedInputStream bufferedInputStream ;BufferedOutputStream bufferedOutputStream;try {bufferedInputStream = new BufferedInputStream(inputStream);bufferedOutputStream = new BufferedOutputStream(outputStream);bufferedOutputStream.write(ResponseUtil.responseHeader200.getBytes());///int count = 0;while (count == 0){count = inputStream.available();}int fileSize = inputStream.available();long written = 0;int beteSize = 1024;byte[] bytes = new byte[beteSize];while (written < fileSize){if(written + beteSize > fileSize){beteSize = (int)(fileSize - written);bytes = new byte[beteSize];}bufferedInputStream.read(bytes);bufferedOutputStream.write(bytes);bufferedOutputStream.flush();written += beteSize;}success = true;} catch (IOException e) {e.printStackTrace();}return success;}public static boolean writeFile(File file,OutputStream outputStream) throws Exception{return witeFile(new FileInputStream(file),outputStream);}/*** 获取资源地址* @param path* @return*/public static String getResoucePath(String path){String resource = FileUtil.class.getResource("/").getPath();return resource + "\\" + path;}}

②ResponseUtil(响应头)

public class ResponseUtil {public static  final String responseHeader200 ="HTTP/1.1 200 \r\n"+"Content-Type:text/html \r\n"+"\r\n";;public static String getResponseHeader200(String context){return "HTTP/1.1 200 \r\n"+"Content-Type:text/html \r\n"+"\r\n" +context;}}

三、处理Response文件

【注意注释】

在注释中做了详细解释:

输出流相关看这里:搭建Tomcat(一)---Socket&ServerSocket_serversocket(int porti nt backlog)-CSDN博客

Response内编写内容: 

import com.my.tomcat.util.FileUtil;import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;public class Response {//打开输出流private OutputStream outputStream;//设置为private,这个输出流只能由这个类自己内部使用//初始化输出流/** 输入输出流都来源于socket,那么这里初始化的outputStream究竟是什么* 就取决于MyTomcat中传进来的socket.getOutputStream是什么了* */public Response(OutputStream outputStream){this.outputStream=outputStream;}//对静态资源输出public void wirthHtml(String path) throws Exception {/*getResoucePath()是工具类FileUtil中获取完整路径的方法其内部主要用了getResource()方法--根据当前类的位置来定位资源文件*/String resourcePath= FileUtil.getResoucePath(path);System.out.println("resourcePath="+resourcePath);//打印一下File file=new File(resourcePath);//让这个完整路径做一个输出if(file.exists()){System.out.println("静态资源存在!");FileUtil.writeFile(file,outputStream);//有则输出}else{System.out.println("404");//查不到这个静态资源,返回404}}public void wirth(String context) throws IOException {outputStream.write(context.getBytes());/*将输出流的数据进行处理--write类同于PrintStream中的处理只是这里传输的是HTML文件,所以用outputStream自带的write方法即可*/}}

File

File 文件(或更准确地说,File 类的实例)并不直接承载文件的内容,而是承载了与文件系统中的一个文件或目录相关的路径名和其他元数据(如大小、修改时间等)的抽象表示。

File 主要被用于表示文件和目录(也被称为文件夹)的路径名,虽然 File 类本身并不直接处理文件内容的读写,但它确实提供了丰富的功能来管理和操作文件系统中的文件和目录。

 四、处理MyTomcat

在这之前,MyTomcat中的response一直以来只是一个空的,用于模拟的,现在我们已经完善了response的代码,那么接着去更改MyTomcat中有关response的代码,来合理化tomcat:

1.处理扫描资源的方法

在这之前,我们只做了对动态资源映射表的检索去查找动态资源,这里我们添加else:

使得if的动态资源没找到的情况下,转去检索静态资源:

 2.处理Response实例

response照常创建:

那么在哪里给response赋值呢?

在这个方法中借socket来获取outputStream,并将其放进初始化的Response中;

 3.实验

完成上述操作后,就可以去客户端(浏览器)试验正确性了:

①先运行MyTomcat,时刻捕捉4747端口(以4747为例)的请求:

【注:上面的“类名:”是动态资源】 

②客户端搜索:

 ③回车后得到结果:

处理成功。

五、完善动态资源的检索

MyWeb下的文件:

【注意:这里的子类抛出异常了,那么父类的HttpServlet也要抛出异常】

此时再去客户端检验,中文和符号会出乱码(正常):

 

以上就是一个简单的,完全体tomcat搭建过程。 

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

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

相关文章

机械鹦鹉与真正的智能:大语言模型推理能力的迷思

编者按&#xff1a; 大语言模型真的具备推理能力吗&#xff1f;我们是否误解了"智能"的本质&#xff0c;将模式匹配误认为是真正的推理&#xff1f; 本文深入探讨了大语言模型&#xff08;LLMs&#xff09;是否真正具备推理能力这一前沿科学问题&#xff0c;作者的核…

.net winform 实现CSS3.0 泼墨画效果

效果图 代码 private unsafe void BlendImages1(Bitmap img1, Bitmap img2) {// 确定两个图像的重叠区域Rectangle rect new Rectangle(0, 0,Math.Min(img1.Width, img2.Width),Math.Min(img1.Height, img2.Height));// 创建输出图像&#xff0c;尺寸为重叠区域大小Bitmap b…

VUE+Node.js+mysq实现响应式个人博客|项目初始化+路由配置+基础组件搭建

Day 1 开发文档&#xff1a;项目初始化与基础架构搭建 一、项目初始化 1. 创建项目 首先&#xff0c;我们使用 Vite 创建一个基于 Vue 3 的项目&#xff1a; # 创建项目 npm create vitelatest my-blog -- --template vue # 这条命令会创建一个名为 my-blog 的新项目&#…

短视频矩阵:构建多平台曝光的高效运营网络

在当今这个瞬息万变的数字化时代&#xff0c;短视频以其独特的魅力迅速占领了人们的视野&#xff0c;成为信息传播与娱乐消遣的重要一环。随着短视频平台的不断增多和用户群体的日益庞大&#xff0c;如何精准高效地利用短视频进行品牌推广和产品营销&#xff0c;成为了众多企业…

ubuntu+ros新手笔记(三):21讲没讲到的MoveIt2

系统ubuntu22.04 ros2 humble 1 安装MoveIt2 安装参照在ROS2中&#xff0c;通过MoveIt2控制Gazebo中的自定义机械手 安装 MoveIt2可以选择自己编译源码安装&#xff0c;或者直接从二进制安装。 个人建议直接二进制安装&#xff0c;可以省很多事。 sudo apt install ros-humbl…

Guava 提供了集合操作 `List`、`Set` 和 `Map` 三个工具类

入门示例 guava 最佳实践 学习指南 以下是使用Google Guava库中的工具方法来创建和操作List、Set、Map集合的一些示例&#xff1a; List相关操作 创建List 使用Lists.newArrayList()创建一个新的可变ArrayList实例。List<Integer> list Lists.newArrayList(1, 2, 3);/…

蓝桥杯摆烂第三天

小蓝给学生们组织了一场考试&#xff0c;卷面总分为 100 分&#xff0c;每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 输入描述 输入的第一行包含一个整数 n (1≤n≤104)&#xff0c;表示考试人数。 接下来 n 行&#xff0c;每行包…

DotNetBrowser 3.0.0 正式发布!

&#x1f6e0;️ 重要消息&#xff1a;DotNetBrowser 3.0.0 正式发布&#xff01; 我们很高兴向您介绍全新的 DotNetBrowser 3.0.0 版本。此次更新带来了多项重要功能与优化&#xff0c;进一步提升了 Web 开发的效率和体验。 &#x1f4e2; DotNetBrowser 3.0.0 包含哪些新功…

C++ —— 使用指针

C —— 使用指针 解引用指针用于函数的参数 解引用 声明指针变量后&#xff0c;在没有赋值之前&#xff0c;这时候不能使用指针。因为&#xff0c;此时我们不知道指针里面装的是什么。 在声明变量后&#xff0c;应该养成对变量赋初始值的好习惯。 指针存放的是变量的地址&…

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c 1. Installing the extension (在 Visual Studio Code 中安装插件)1.1. Extensions for Visual Studio Code1.2. C/C1.2.1. Pre-requisites 1.3. Makefile Tools 2. Configuring your project (配置项目)2.1.…

CSS Backgrounds(背景)

CSS Backgrounds(背景) Introduction(介绍) CSS backgrounds play a crucial role in web design, allowing developers to apply colors, images, and other decorative elements to the background of HTML elements. This enhances the visual appeal of web pages and he…

Oracle 查询表占用空间(表大小)的方法

目录 概述方法一&#xff1a;使用 dbms_space 包方法二&#xff1a;查询 dba_extents 视图方法三&#xff1a;查询 dba_segments 视图总结 1. 概述 在Oracle数据库管理中&#xff0c;了解特定表或索引所占用的空间对于性能调优、存储规划以及资源分配至关重要。本文档介绍了三…

EfficientNet:对模型深度、宽度和分辨率的混合缩放策略

论文&#xff1a;https://arxiv.org/abs/1905.11946 项目&#xff1a;https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet Pytorch实现&#xff1a;EfficientNet模型Pytorch版本具体实现-CSDN博客 一、概况 1、概述&#xff1a; 这张图可以清晰明…

搭建分布式Hive集群

title: 搭建分布式Hive集群 date: 2024-11-29 23:39:00 categories: - 服务器 tags: - Hive - 大数据搭建分布式Hive集群 本次实验环境&#xff1a;Centos 7-2009、Hadoop-3.1.4、JDK 8、Zookeeper-3.6.3、Mysql-5.7.38、Hive-3.1.2 功能规划 方案一&#xff08;本地运行模…

实现路由懒加载的方式有哪些?

1函数式懒加载 使用vue的异步组件和webpack的代码分割功能&#xff0c;通过&#xff08;&#xff09;>import()这种函数形式来定义路由组件&#xff0c;示例如下&#xff1a; const Home () > import(/views/Home.vue); const router new VueRouter({routes: [{ path…

【QT实战の心情笔记】

文章目录 界面布局主要界面分为三部分&#xff1a;1. 笔记列表区域2. 笔记内容编辑区域3. 操作按钮区域 Qt Designer 界面设计步骤完整界面布局图各控件设置和属性Qt Designer 文件 (.ui) 数据库表结构SQL 表结构&#xff1a; 逻辑代码1. 项目结构2. Note 类 (Note.h 和 Note.c…

大模型学习笔记------SAM模型详解与思考

大模型学习笔记------SAM模型详解与思考 1、SAM框架概述2、Segment Anything Task3、Segment Anything Model SAM模型是Meta 提出的分割一切模型&#xff08;Segment Anything Model&#xff0c;SAM&#xff09;突破了分割界限&#xff0c;极大地促进了计算机视觉基础模型的发展…

【嵌入式软件】跑开发板的前置服务配置

在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 Ubuntu 中配置 Samba、TFTP 和 NFS 协议的详细步骤。这些协议分别用于远程文件共享、文件传输和内核挂载文件系统。 如何安装协议: 参考:ubuntu18配置:详细的内容我手写了一份文档。…

2024最新qrcode.min.js生成二维码Demo

找了一堆代码一堆GPT&#xff0c;终于给写对了&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

【Spring】Spring的模块架构与生态圈—核心容器(Beans、Core、Context、Expression)

Spring框架因其强大的功能和灵活性而成为企业级应用开发的首选&#xff0c;它的模块化设计使得开发者可以根据需求选择合适的模块&#xff0c;降低了系统的复杂性。核心容器模块是Spring框架的基础&#xff0c;它为整个框架提供了核心功能&#xff0c;包括Bean的管理、上下文的…