做网站时为什么导航时两行字/北京seo平台

做网站时为什么导航时两行字,北京seo平台,网络推广平台推荐,ubuntu做网站目录 一、Tomcat概况 1. tomcat全局图 2.项目结构概览 二、实现步骤详解 2.1 基础工具包(com.qcby.util) 2.1.1 ResponseUtil:HTTP响应生成工具 2.1.2 SearchClassUtil:类扫描工具 2.1.3 WebServlet:自定义注解…

目录

一、Tomcat概况

1. tomcat全局图

2.项目结构概览

二、实现步骤详解

2.1 基础工具包(com.qcby.util)

2.1.1 ResponseUtil:HTTP响应生成工具

2.1.2 SearchClassUtil:类扫描工具

2.1.3 WebServlet:自定义注解

2.2 Servlet核心实现包(com.qcby.webapps.servlet)

2.2.1 HttpServletRequest:请求对象

2.2.2 HttpServletResponse:响应对象

2.2.3 Servlet接口

2.2.4 GenericServlet抽象类

2.2.5 HttpServlet实现类

2.3 业务Servlet实现(com.qcby.webapps.myweb)

2.3.1 LoginServlet

2.3.2 ShowServlet

2.4 核心控制模块(com.qcby)

2.4.1 ServletConfigMapping:Servlet配置中心

2.4.2 MyTomcat:服务器入口

2.5 运行流程全景图

2.6 关键设计思想

2.6.1 控制反转:

2.6.2 反射机制:

2.6.3 模板方法模式:

2.6.4 职责分离:

三、总结


        本文将基于Java实现一个极简版Tomcat,通过代码逐层剖析Servlet容器的工作原理。读者将掌握HTTP协议解析、注解驱动开发、反射机制、类加载等核心技术。

一、Tomcat概况

1. tomcat全局图

2.项目结构概览

src
├── com.qcby
│   ├── MyTomcat.java          // 服务启动类
│   └── ServletConfigMapping.java // Servlet配置映射
├── com.qcby.util
│   ├── ResponseUtil.java      // HTTP响应工具
│   ├── SearchClassUtil.java   // 类扫描工具
│   └── WebServlet.java        // 自定义注解
└── com.qcby.webapps├── myweb                  // 示例Servlet└── servlet                // Servlet核心实现

二、实现步骤详解

2.1 基础工具包(com.qcby.util)

2.1.1 ResponseUtil:HTTP响应生成工具

package com.qcby.util;public class ResponseUtil {// 200响应头模板public static final String responseHeader200 = "HTTP/1.1 200 \r\nContent-Type:text/html; charset=utf-8 \r\n\r\n";// 生成404响应public static String getResponseHeader404(){return "HTTP/1.1 404 \r\nContent-Type:text/html; charset=utf-8 \r\n\r\n404";}// 生成带内容的200响应public static String getResponseHeader200(String context){return responseHeader200 + context;}
}

核心作用

  • 标准化HTTP响应格式

  • 提供快速构建响应的静态方法

  • 支持200/404状态码生成

2.1.2 SearchClassUtil:类扫描工具

package com.qcby.util;import java.io.File;
import java.util.ArrayList;
import java.util.List;/**'* 扫描com.qcby.webapps目录下面的文件,获取每一个Java文件的全类名*/
public class SearchClassUtil {public static List<String> classPaths = new ArrayList<String>();public static List<String> searchClass(){//需要扫描的包名String basePack = "com.qcby.webapps.myweb";//将获取到的包名转换为路径String classPath = SearchClassUtil.class.getResource("/").getPath();basePack =  basePack.replace(".", File.separator);String searchPath = classPath + basePack;doPath(new File(searchPath),classPath);//这个时候我们已经得到了指定包下所有的类的绝对路径了。我们现在利用这些绝对路径和java的反射机制得到他们的类对象return classPaths;}/*** 该方法会得到所有的类,将类的绝对路径写入到classPaths中* @param file*/private static void doPath(File file,String classpath) {if (file.isDirectory()) {//文件夹//文件夹我们就递归File[] files = file.listFiles();for (File f1 : files) {doPath(f1,classpath);}} else {//标准文件//标准文件我们就判断是否是class文件if (file.getName().endsWith(".class")) {String path = file.getPath().replace(classpath.replace("/","\\").replaceFirst("\\\\",""),"").replace("\\",".").replace(".class","");//如果是class文件我们就放入我们的集合中。classPaths.add(path);}}}public static void main(String[] args) {List<String> classes = SearchClassUtil.searchClass();for (String s: classes) {System.out.println(s);}}
}

核心作用

  • 递归扫描指定包路径

  • 转换.class文件为全限定类名

  • 支持动态类加载的基础

2.1.3 WebServlet:自定义注解

package com.qcby.util;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)//源文件阶段保留
@Target(ElementType.TYPE)//表明@WebSerlet注解是写在类上
public @interface WebServlet {//String path=null;String urlMapping() default "" ;
}

核心作用

  • 替代XML配置的注解式声明

  • 建立Servlet与URL的映射关系

  • 运行时(RUNTIME)保留策略支持反射读取可读取注解信息

2.2 Servlet核心实现包(com.qcby.webapps.servlet)

2.2.1 HttpServletRequest:请求对象

package com.qcby.webapps.servlet.req;public class HttpServletRequest {private String path;private String method;public String getPath(){return path;}public void setPath(String path){this.path=path;}public String getMethod(){return method;}public void setMethod(String method){this.method=method;}
}
  • 职责分离:请求封装客户端数据,响应处理输出流

2.2.2 HttpServletResponse:响应对象

package com.qcby.webapps.servlet.req;import java.io.IOException;
import java.io.OutputStream;public class HttpServletResponse {private OutputStream outputStream;public HttpServletResponse(OutputStream outputStream ){this.outputStream=outputStream;}public void writeServlet(String context) throws IOException{outputStream.write(context.getBytes());}}

2.2.3 Servlet接口

package com.qcby.webapps.servlet;import com.qcby.webapps.servlet.req.HttpServletRequest;
import com.qcby.webapps.servlet.req.HttpServletResponse;import java.io.IOException;public interface Servlet<response> {public void init();public void service(HttpServletRequest request, HttpServletResponse response) throws IOException;public void destroy();}

2.2.4 GenericServlet抽象类

package com.qcby.webapps.servlet;public abstract  class GenericServlet implements  Servlet {public void init(){System.out.println("------初始化servlet------");}public void destroy(){System.out.println("------实现servlet对象的销毁------");}}

2.2.5 HttpServlet实现类

package com.qcby.webapps.servlet;import com.qcby.webapps.servlet.req.HttpServletRequest;
import com.qcby.webapps.servlet.req.HttpServletResponse;import java.io.IOException;public  abstract  class HttpServlet extends GenericServlet{public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {if(request.getMethod().equals("GET")){doGet(request,response);}else{doPost(request,response);}}protected  abstract  void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException;protected  abstract  void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException;}
  • 设计模式:模板方法模式处理HTTP方法分发

  • 继承体系:HttpServlet -> GenericServlet -> Servlet

核心作用

  • 构建完整的Servlet生命周期

  • 实现HTTP方法的分发机制

  • 提供请求响应的标准接口

2.3 业务Servlet实现(com.qcby.webapps.myweb)

2.3.1 LoginServlet

package com.qcby.webapps.myweb;import com.qcby.util.ResponseUtil;
import com.qcby.util.WebServlet;
import com.qcby.webapps.servlet.HttpServlet;
import com.qcby.webapps.servlet.req.HttpServletRequest;
import com.qcby.webapps.servlet.req.HttpServletResponse;import java.io.IOException;
@WebServlet(urlMapping = "/login")
public class LoginServlet  extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("我是login的doGet方法");response.writeServlet(ResponseUtil.getResponseHeader200("hello"));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {}
}

2.3.2 ShowServlet

package com.qcby.webapps.myweb;import com.qcby.util.ResponseUtil;
import com.qcby.util.WebServlet;import com.qcby.webapps.servlet.HttpServlet;
import com.qcby.webapps.servlet.req.HttpServletRequest;
import com.qcby.webapps.servlet.req.HttpServletResponse;import java.io.IOException;@WebServlet(urlMapping="/show")
public class ShowServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {// GET请求处理逻辑System.out.println("我是show");response.writeServlet(ResponseUtil.getResponseHeader200("show"));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) {// POST请求处理逻辑}
}

核心作用

  • 演示具体业务实现

  • 展示注解驱动的路由配置

  • 体现模板方法模式的应用

2.4 核心控制模块(com.qcby)

2.4.1 ServletConfigMapping:Servlet配置中心

package com.qcby;import com.qcby.util.SearchClassUtil;
import com.qcby.util.WebServlet;
import com.qcby.webapps.servlet.HttpServlet;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class ServletConfigMapping {public static Map<String, HttpServlet> servletMap =new HashMap<>();static{List<String> classNames = SearchClassUtil.searchClass();for (String path:classNames){try{Class clazz =Class.forName(path);WebServlet webServlet =(WebServlet) clazz.getDeclaredAnnotation(WebServlet.class);HttpServlet servlet =(HttpServlet) clazz.newInstance();servletMap.put(webServlet.urlMapping(), servlet);System.out.println(servletMap);}catch (Exception e){e.printStackTrace();}}}}

核心流程

  1. 静态初始化块在类加载时执行

  2. 使用SearchClassUtil扫描所有类

  3. 通过反射获取注解信息

  4. 实例化Servlet并建立URL映射

2.4.2 MyTomcat:服务器入口

package com.qcby;import com.qcby.webapps.servlet.HttpServlet;
import com.qcby.webapps.servlet.req.HttpServletRequest;
import com.qcby.webapps.servlet.req.HttpServletResponse;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;import static com.qcby.ServletConfigMapping.servletMap;public class MyTomcat {static HttpServletRequest request =new HttpServletRequest();public static void main(String[] args) throws IOException {ServerSocket serverSocket =new ServerSocket(8081);while (true){Socket socket =serverSocket.accept();InputStream inputStream = socket.getInputStream();OutputStream outputStream =socket.getOutputStream();HttpServletResponse response= new HttpServletResponse(outputStream);int count = 0;while (count == 0){count = inputStream.available();}byte[] bytes = new byte[count];inputStream.read(bytes);String Context = new String(bytes);System.out.println(Context);//解析数据if(Context.equals("")){System.out.println("你输入了一个空请求");}else {String firstLine = Context.split("\\n")[0]; //根据换行来获取第一行数据request.setPath(firstLine.split("\\s")[1]);request.setMethod(firstLine.split("\\s")[0]);}if(servletMap.containsKey(request.getPath())){System.out.println("存在于HashMap中");HttpServlet servlet=ServletConfigMapping.servletMap.get(request.getPath());servlet.service(request,response);} else {System.out.println("不存在于HashMap中");}}}}

核心流程

  1. 创建ServerSocket监听8081端口

  2. 循环接受客户端连接

  3. 解析HTTP请求首行

  4. 根据路径查找对应的Servlet

  5. 调用service方法处理请求

  6. 返回404响应处理异常路径

2.5 运行流程全景图

启动流程:
1. MyTomcat.main()启动
2. ServletConfigMapping静态块初始化→ SearchClassUtil扫描类→ 反射创建Servlet实例→ 建立URL映射表请求处理流程:
客户端请求 → ServerSocket接收 → 解析请求路径 → 
查找Servlet映射 → 调用service() → 执行doGet/doPost → 
生成响应 → 返回客户端

2.6 关键设计思想

2.6.1 控制反转

  • Servlet实例由容器创建
  • 开发者通过注解声明路由

2.6.2 反射机制

  • 动态加载类文件
  • 读取注解配置信息

2.6.3 模板方法模式

  • HttpServlet定义处理骨架
  • 子类实现具体业务逻辑

2.6.4 职责分离

  • Request/Response对象封装协议细节
  • Util类处理通用逻辑

三、总结

通过实现这个简易Tomcat,我们深入理解了:

  1. Servlet容器的启动流程

  2. 请求-响应生命周期管理

  3. 注解驱动与反射的应用

  4. HTTP协议的基础解析

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

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

相关文章

【Java开发指南 | 第三十四篇】IDEA没有Java Enterprise——解决方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 1、新建Java项目2、单击项目名&#xff0c;并连续按两次shift键3、在搜索栏搜索"添加框架支持"4、勾选Web应用程序5、最终界面6、添加Tomcat 1、新建Java项目 2、单击项目名&#xff0c;并连续按两次…

在MATLAB中实现PID控制仿真

在MATLAB中实现PID控制仿真可以通过代码编程或Simulink图形化建模两种方式完成。以下是两种方法的详细操作步骤和示例&#xff1a; 方法1&#xff1a;使用MATLAB脚本编程&#xff08;基于控制系统工具箱&#xff09; 步骤1&#xff1a;定义被控对象的数学模型 假设被控对象是…

蓝桥杯历年真题题解

1.轨道炮&#xff08;数学模拟&#xff09; #include <iostream> #include <map> using namespace std; const int N1010; int x[N],y[N],v[N]; char d[N]; int main() {int n;int ans-100;cin>>n;for(int i1;i<n;i)cin>>x[i]>>y[i]>>v…

Pytorch的一小步,昇腾芯片的一大步

Pytorch的一小步&#xff0c;昇腾芯片的一大步 相信在AI圈的人多多少少都看到了最近的信息&#xff1a;PyTorch最新2.1版本宣布支持华为昇腾芯片&#xff01; 1、 发生了什么事儿&#xff1f; 在2023年10月4日PyTorch 2.1版本的发布博客上&#xff0c;PyTorch介绍的beta版本…

阿里千问大模型(Qwen2.5-VL-7B-Instruct)部署

参考链接 知乎帖子 B站视频 huggingface 镜像网站&#xff08;不太全&#xff0c;比如 Qwen/Qwen2.5-VL-7B-Instruct就没有&#xff09; huggingface 5种下载方式汇总 通过huggingface-cli下载模型 不一样的部分是预训练权重的下载和demo 首先安装huggingface_hub pip insta…

Jenkins在Windows上的使用(二):自动拉取、打包、部署

&#xff08;一&#xff09;Jenkins全局配置 访问部署好的Jenkins服务器网址localhost:8080&#xff0c;完成默认插件的安装后&#xff0c;接下来将使用SSH登录远程主机以实现自动化部署。 1. 配置插件 选择dashboard->Manage Jenkins->plugins 安装下面两个插件  …

群晖DS 223 Docker:开启私有云

群晖DS 223 Docker&#xff1a;开启私有云的无限可能 引言 在数据存储与管理的不断演进中&#xff0c;群晖 DS 223 凭借其出色的性能和丰富的功能&#xff0c;成为众多用户搭建私有云的热门选择。而当它与 Docker 技术相遇&#xff0c;犹如为数据管理的舞台添上了绚丽多彩的灯…

Three.js 进阶(灯光阴影关系和设置、平行光、阴影相机)

本篇主要学习内容 : 灯光与阴影聚光灯点光源平行光阴影相机和阴影计算投射阴影接受阴影 点赞 关注 收藏 学会了 1.灯光与阴影 1、材质要满足能够对光有反应 2、设置渲染器开启阴影计算 renderer.shadowMap.enabledtrue 3、设置光照投射阴影 directionalLight.castShadow …

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Tomcat 的工作原理:从启动到请求处理的流程

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Tomcat…

计网面试准备

正确理解网络数据传输过程 同一路由器的不同接口属于不同局域网&#xff0c;广播只能在同一个局域网

【技术白皮书】内功心法 | 第二部分 | Telnet远程登录的工作原理

远程登录的工作原理 背景介绍远程登录远程登录的服务模式远程登录服务的实现基础远程登录服务的运行模式Telnet服务为什么不被操作系统管理 Telnet协议的原理网络虚终端&#xff08;NVT&#xff09;结束标示NVT的原理NVT屏蔽差异 背景介绍 绝大多数计算机都是运行多用户操作系…

游戏引擎学习第150天

回顾与当天计划 我们在这里完全不使用任何库&#xff0c;所以我们完全是引擎和库免疫的, 正如大家所知道的&#xff0c;我们正在编写自己的资源处理系统&#xff0c;准确来说&#xff0c;是一个资源加载系统。过去一周我们已经完成了很多工作&#xff0c;现在只剩下最后几步&a…

Flutter中stream学习

Flutter中stream学习 概述Stream的基础概念stream的常用方法Stream.fromFuture(Future<T> future)Stream.fromFutures(Iterable<Future<T>> futures)Stream.fromIterable(Iterable<T> elements)Stream.periodic(Duration period, [T computation(int c…

基于javaweb的SSM房屋租赁管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

物联网商业模式

物联网商业模式是一种战略规划&#xff0c;它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于&#xff0c;它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中&#xff0c;这种商业模式通过利用实时数据来提供创新服务…

从0开始的操作系统手搓教程45——实现exec

目录 建立抽象 实现加载 实现sys_execv &#xff01;&#xff01;&#xff01;提示&#xff1a;因为实现问题没有测试。所以更像是笔记&#xff01; exec 函数的作用是用新的可执行文件替换当前进程的程序体。具体来说&#xff0c;exec 会将当前正在运行的用户进程的进程体&…

【python爬虫】酷狗音乐爬取练习

注意&#xff1a;本次爬取的音乐仅有1分钟试听&#xff0c;仅作学习爬虫的原理&#xff0c;完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌&#xff0c;在请求里发现一段mp3文件&#xff0c;复制网址&#xff0c;确实是我们需要的url。 复制音频的…

Linux开发工具----vim

目录 Linux编辑器-vim使用 1. vim的基本概念 正常/普通/命令模式(Normal mode) 插入模式(Insert mode) 底行模式(last line mode) 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. vim操作总结 (本篇文章相当于vim常用命令字典) Linux编辑器-vim使用 我们先来看…

基于云函数的自习室预约微信小程序+LW示例参考

全阶段全种类学习资源&#xff0c;内涵少儿、小学、初中、高中、大学、专升本、考研、四六级、建造师、法考、网赚技巧、毕业设计等&#xff0c;持续更新~ 文章目录 [TOC](文章目录) 1.项目介绍2.项目部署3.项目部分截图4.获取方式 1.项目介绍 技术栈工具&#xff1a;云数据库…

卷积神经网络与计算机视觉:从数学基础到实战应用

卷积神经网络与计算机视觉&#xff1a;从数学基础到实战应用 摘要 本文深入解析卷积神经网络&#xff08;CNN&#xff09;的核心原理及其在计算机视觉中的应用。首先介绍卷积与互相关的数学定义及在神经网络中的实际应用差异&#xff0c;接着从系统设计视角分析卷积的线性代数…