大厨小鲜——自己动手实现一个极简Web框架

Java SSM微信小程序毕设项目拆解:家庭大厨从架构到答辩 在Java Web开发中,SSM(Spring+SpringMVC+MyBatis)作为经典的后端框架组合,与MySQL数据库、微信小程序前端共同构成了当前高校毕业设计中最常见的全栈技术栈。理解SSM如何通过IoC容器管理对象、前端控制器路由HTTP请求、Mapper完成ORM映射,是掌握Java后端工程化开发的基础。这类技术组合广泛适用于点餐预约、校园服务、私教预约等重业务闭环场景,能完整跑通用户端、运营端与订单流转链路。从角色权限设计到状态机异常处理,从登录鉴权闭环到数据库表关联关系,每一步都体现工程实 阅读详情

640?wx_fmt=png

上节课我们自己动手制作了一个RPC框架,本节课我们挑战一个稍有难度的一点的任务,手动制作一个Web框架。

首先我们看看这个Web框架使用起来如何简单

Hello World

import httpkids.server.KidsRequestDispatcher;
import httpkids.server.Router;
import httpkids.server.internal.HttpServer;

public class HelloWorld {

    public static void main(String[] args) {
        var rd = new KidsRequestDispatcher("/kids", new Router((ctx, req) -> {
            ctx.html("Hello, World");
        }));
        new HttpServer("localhost", 8080, 2, 16, rd).start();
    }

}

http://localhost:8080/kids
640?wx_fmt=png

KidsRequestDispatcher是请求派发器,用于将收到的HTTP请求对象扔给响应的RequestHandler进行处理。Router用于构建路由,它负责的是将URL规则和RequestHandler挂接起来,形成一个复杂的映射表。

Router为了简化实现细节,所以没有支持复杂的URL规则,例如像RESTFUL这种将参数写在URL里面的这种形式是不支持的。

HttpServer是Web服务器的核心对象,构建HttpServer除了IP端口之外,还需要提供3个关键参数,分别是IO线程数、业务线程数和请求派发器对象。IO线程用于处理套件字读写,由Netty内部管理。业务线程专门用于处理HTTP请求,由httpkids框架来管理。

一个全面的例子

import java.util.HashMap;

import httpkids.server.KidsRequestDispatcher;
import httpkids.server.Router;
import httpkids.server.internal.HttpServer;

public class HelloWorld {

    public static void main(String[] args) {
        var router = new Router((ctx, req) -> {
            ctx.html("Hello, World"); // 纯文本网页
        }).handler("/hello.json", (ctx, req) -> {
            ctx.json(new String[] { "Hello", "World" });  // json api
        }).handler("/hello", (ctx, req) -> {
            var res = new HashMap<String, Object>();
            res.put("req", req);
            ctx.render("playground.ftl", res);  // 模版渲染
        }).handler("/world", (ctx, re) -> {
            ctx.redirect("/hello");  // 302跳转
        }).child("/user", () -> {  //  URL嵌套
            return new Router((ctx, req) -> {
                ctx.html("Hello, World");
            }).handler("/hello.json", (ctx, req) -> {
                ctx.json(new String[] { "Hello", "World" });
            }).handler("/hello", (ctx, req) -> {
                var res = new HashMap<String, Object>();
                res.put("req", req);
                ctx.render("playground.ftl", res);
            }).handler("/world", (ctx, re) -> {
                ctx.redirect("/hello");
            }).filter((ctx, req, before) -> {  // 请求过滤器、拦截器
                if (before) {
                    System.out.printf("before %s\n", req.path());
                } else {
                    System.out.printf("after %s\n", req.path());
                }
                return true;
            });
        }).resource("/pub", "/static");

        var rd = new KidsRequestDispatcher("/kids", router);
        rd.templateRoot("/tpl"); // 模版所在的classpath目录

        var server = new HttpServer("localhost", 8080, 2, 16, rd);
        server.start();

        // 优雅停机
        Runtime.getRuntime().addShutdownHook(new Thread() {

            public void run() {
                server.stop();
            }

        });
    }

}

http://localhost:8080/kids
http://localhost:8080/kids/hello
http://localhost:8080/kids/hello.json
http://localhost:8080/kids/world
http://localhost:8080/kids/user
http://localhost:8080/kids/user/hello
http://localhost:8080/kids/user/hello.json
http://localhost:8080/kids/user/world
http://localhost:8080/kids/pub/bootstrap.min.css
640?wx_fmt=png

堆栈深度

非Java程序员总是抱怨Java的框架过于复杂,特别爱拿Java恐怖的调用栈说事。比如下面这张图广为流传。

640?wx_fmt=png

所以这里我要亮出httpkids的调用栈,我们来看看它到底有多深

640?wx_fmt=png

项目代码

https://github.com/pyloque/httpkids

https://github.com/pyloque/rpckids

大爆炸

640?wx_fmt=jpeg

关注公众号「码洞」,让我们来一起聊聊这个框架。

httpkids:针对孩子的基于netty的http服务器 httpkids 面向孩子的基于netty的Web框架,需要Java10! 特点与缺点 与其他Web框架相比,极其轻巧。 极其易于使用,学习成本极低。 极其易于理解,带有大约1200行代码。 尚不支持https。 不支持风格宁静的URL。 你好,世界 import httpkids.server.KidsRequestDispatcher ; import httpkids.server.Router ; import httpkids.server.internal.HttpServer ; public class HelloWorld { public static void main ( String [] args ) { var rd = new KidsRequestDispatcher ( " /kids " , new Router ( 立即下载

相关推荐

简单的web界面

就是一个超简单的web界面只是来试试的 空连接、线条、字形、字体之类的

Dotfiles模板项目使用教程

Dotfiles模板项目使用教程 1. 项目介绍 dotfiles_template 是一个用于结构化管理 dotfiles 的模板项目,使用 Dotbot 作为安装工具。Dotfiles 是用于配置 Unix 和类 Unix 系统上各种应用程序的配置文件。这个模板项目旨在帮助用户快速启动并管理他们的 dotfiles,确保配置文件的版本控制和易于维护。 2. 项目快速启动 2.1 克隆项目 首先...

gitblog_00089的博客 385

极简主义:完整的Web响应界面

极简主义 基于Web组件(使用自定义元素)的Web UI套件,可以在有或没有任何框架的情况下使用。 npm install minimalist-ui 形式 内容 样式 这个怎么运作 极简主义者的每个组件都有一个用ES6类编写的核心,该核心遵循Custom Elements API v1,并提供了完整的样式,可供使用或使用CSS变量定制。 全部设计为允许组件之间的继承,例如<mn>定义外观和行为(如禁用状态)的输入文本。 但是,如果您需要输入数字,则<mn>扩展了mn-input-text样式和常见行为,但是实现了新功能,例如使用箭头键或最小

自己动手设计一个Web框架

为什么80%的码农都做不了架构师?>>> ...

weixin_33725515的博客 393

等时替代模型( Isotemporal Substitution Model)

文献阅读:Associations of sedentary time and physical activity with adverse health conditions: Outcome-wide analyses using isotemporal substitution model(该论文于2022年4月28日发表在柳叶刀子刊 EClinicalMedicine 上)

姚巨龙的博客 1万+

【3DSlicer】基于心脏ct影像重建3d模型及导出

软件:3DSlicer4.11 基于心脏ct影像重建3d模型

Liuees的博客 1万+

关于WEB框架

后端 太多了,目前用的是Java项目组自研WEB框架。 PHP相关: ThinkPHP俗称TP框架:http://document.thinkphp.cn/manual_3_2.html#url php框架CI(CodeIgniter ): http://codeigniter.org.cn/ 模板引擎Smarty PC前端 Bootstrap: http://www.b...

编程架构三分天下:分层、分治、分时序。 278

macOS Jdk1.8安装(目前主流版本的jdk)

添加环境环境变量,类似于windows的高级设置中path配置的环境变量。查看 JAVA_HOME 目录。查看 JDK 版本信息。一直下一步安装就好了。在终端的根目录下运行。

m0_50207524的博客 9356

探秘Netty6:基于Netty自己动手实现Web框架

大厨小鲜——基于Netty自己动手实现Web框架 上节课我们自己动手制作了一个RPC框架,本节课我们挑战一个稍有难度的一点的任务,手动制作一个Web框架。 我不太愿意叫什么MVC框架,因为我在制作这个小项目的时候可没想过它要怎么怎么的MVC,一切皆以易于使用为目标。 首先我们看看这个Web框架使用起来如何简单 Hello World import http...

Java技术江湖 6205

NFS共享速度慢?麒麟系统性能调优5个关键参数实测对比

本文针对银河麒麟服务器系统上NFS共享速度慢的问题,通过实测对比分析了五个关键调优参数。重点探讨了rsize/wsize传输块大小、TCP/UDP协议选择、sync/async模式权衡等,并结合麒麟系统特性提供了具体的优化建议与配置示例,旨在帮助用户有效提升国产化环境下的文件共享性能。

weixin_29254029的博客 338

告别Selenium!纯Python+Requests搞定微信视频号登录Cookie(附完整代码与避坑指南)

本文详细介绍了如何利用纯Python和Requests库实现微信视频号的自动化登录,替代传统的Selenium方案。通过解析HTTP请求交互流程,提供完整的代码实现和避坑指南,显著提升爬虫效率和隐蔽性,适用于轻量化爬虫开发。

weixin_30642561的博客 312

零基础Python Web后端入门:从Flask框架到数据库应用实战

Web后端开发是构建现代网站和应用程序的核心技术,它负责处理业务逻辑、数据存储和与前端的通信。其基本原理基于HTTP协议,通过接收请求、处理数据并返回响应来完成用户交互。Python凭借其简洁的语法和丰富的库生态,成为后端开发的高效选择,尤其适合初学者快速上手。在众多Python Web框架中,Flask以其轻量级和灵活性著称,它允许开发者从基础的路由和视图函数开始,清晰地理解请求-响应循环。结合SQLAlchemy等ORM工具,可以方便地进行数据库操作,实现数据的持久化存储。这种技术组合广泛应用于博客系统

weixin_31742871的博客 296

从Delphi 7到Delphi 10.4.1的代码迁移:关键挑战与实用解决方案

本文详细探讨了从Delphi 7升级到Delphi 10.4.1进行代码迁移的关键挑战与实用解决方案。核心内容包括应对Unicode字符串处理、64位数据类型变化、VCL/FMX界面框架选择、第三方组件迁移以及数据库层现代化改造(如从BDE迁移至FireDAC)。文章为开发者提供了系统的迁移前准备、核心问题攻克策略及测试落地指南,旨在帮助团队高效、平稳地完成系统现代化升级。

weixin_29250403的博客 533

自己动手编写IoC容器(一)

很久没写技术性的文档,编写此文档的目的一来作为最近学习的总结,二来这里有不少和我一样做WEB开发刚刚开始挨踢生涯的毕业生,希望本文档对大家有所帮助。本文思路来自《疯狂java实战讲义》和网上的无数文章。 此文档主要的内容为设计并且实现一个简单的IoC容器,IoC我们每天都在用,但都是借助于第三方框架,我们可以试着自己写一个IoC最简单的容器,什么东西都要拆开了解才好玩。 本文档大体分为三个部分

宋三丝的专栏 2209

从Chimera到ChimeraX:科研绘图升级指南,让你的论文配图更专业

本文详细介绍了从UCSF Chimera升级到ChimeraX的科研绘图指南,帮助研究者提升论文配图质量。ChimeraX在渲染引擎、大分子处理能力和动画功能上具有显著优势,特别适合生命科学和结构生物学领域。文章涵盖材质设置、专业配色、工作流程和期刊适配等核心技巧,助力产出出版级分子可视化图像。

weixin_33670786的博客 940

Win10 系统下VisualStudio2022 配置Open3D-0.18.0(C++)

Win10 系统下VisualStudio2022 配置Open3D-0.18.0

点云侠的博客 2658

Ostrakon-VL-8B项目实战:从零搭建一个完整的菜品识别Web服务

本文介绍了如何在星图GPU平台上自动化部署Ostrakon-VL-8B专为餐饮零售(FSRS)场景优化的开源多模态大模型,并基于此构建一个完整的菜品识别Web服务。该服务能够通过上传图片,智能识别并回答关于菜品的各类问题,例如菜名、口味或食材,为餐饮零售场景提供便捷的视觉问答解决方案。

weixin_42596246的博客 83

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

一次完整的web服务搭建过程

虽然自己做开发已经好几年了,可是重来没有为自己做过网站。这就好比做了几年的大厨,从来没有真正为自己下过厨一样,自己想为自己做一个网站,不需要做得多好,只是想看看这整个过程需要做哪些事情,这也更加有利于自己理解服务请求的整个过程。想法敲定后,马上开始动手做自己的网站,想想都心情激动,主要分如下几步进行: 软件开发 当前自己一直使用Node.js进行后台开发,所以这次开发语...

dengyilang123的博客 1575

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

M2LOrder项目实战:从零开始搭建一个情感分析Web应用

本文介绍了如何在星图GPU平台上自动化部署M2LOrder情绪识别与情感分析服务轻量级WebUI镜像,快速搭建一个可交互的情感分析Web应用。该平台简化了部署流程,用户可轻松构建用于分析文本情感倾向(如积极、消极、中性)的工具,适用于产品评论分析、社交媒体情绪监控等典型场景。

weixin_42499004的博客 219

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

GPT-SoVITS如何接入Web?前端交互部署详细步骤

本文介绍了如何在星图GPU平台上自动化部署GPT-SoVITS镜像,快速搭建语音克隆与合成服务。通过该平台,用户可轻松将这一强大工具转化为Web应用,实现只需少量录音即可生成个性化语音,典型应用于为有声读物、视频配音等场景提供定制化语音解决方案。

weixin_34471637的博客 332

嵌入式系统轻量级Web服务:lighttpd与FastCGI的实战配置与优化

本文详细介绍了在嵌入式系统中部署轻量级Web服务的实战方案,重点解析了lighttpd与FastCGI的协同工作机制与配置优化。通过交叉编译、核心配置详解及C语言应用示例,指导开发者如何在资源受限环境下构建高效、稳定的动态Web服务,并分享了性能调优与故障排查的实用技巧。

o0p1q2r3的博客 466

微软==厨师???

声明: 本文是本人在“头脑发热”下的产场,纯属个人观点,因些有些比喻和语气偏激再所难免,如果认为这 是一篇垃圾,那我只能对给您的思想所带来的“精神污染”和侵害深表报歉了:) 这些年一直在Windows平台上做开发,坐在Microsoft这只船上,总体上感觉是自己越来越懒了,什么都 想去用现成的,如果有什么问题,基本上都会去MSDN,BAIDU或 GOOGLE上S...

weixin_30919235的博客 113

JavaScript全栈开发:Node.js后端+Web前端集成MogFace-large

本文介绍了如何在星图GPU平台上自动化部署MogFace人脸检测模型-large镜像,并构建一个完整的JavaScript全栈人脸检测应用。通过该平台,开发者可快速搭建基于Node.js后端和Web前端的集成环境,实现上传图片并自动识别人脸的核心功能,适用于智能相册、安防监控等场景。

weixin_42610010的博客 40

OpenClaw:不止是开源AI助手,更是能动手做事的数字“超级打工人”

这是OpenClaw最核心的亮点之一。其Gateway进程运行在用户自己控制的设备上,所有会话记录、配置信息、任务数据都存储在本地(以JSONL格式保存),不经过第三方云端服务器,从根源上保障了数据隐私与安全。对于注重隐私保护的用户、企业团队而言,这种“数据自主可控”的模式,避免了敏感信息泄露的风险,也是它区别于主流云端AI助手的关键竞争力。

weixin_61979812的博客 1272
上一篇: 全栈虚拟机GraalVM初体验
下一篇: 码洞技术文章大全
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值