大厨小鲜——自己动手实现一个极简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

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

基于Django+Vue+微信小程序的全栈项目实战:家庭大厨系统设计与实现 在当今的Web开发领域,前后端分离架构已成为主流范式,它通过将前端展示逻辑与后端业务逻辑解耦,提升了开发效率和系统可维护性。其核心原理在于前端(如Vue.js、微信小程序)通过HTTP协议调用后端(如Django、Spring Boot)提供的RESTful API进行数据交互,后端专注于数据处理和业务规则。这种架构的技术价值在于支持多端复用、便于团队协作和独立部署。在应用场景上,尤其适合需要同时拥有移动端(如小程序)和Web管理后台的中小型项目,例如内容管理、电商、工具类应用等。本文以“家庭大厨”食谱管理 阅读详情

相关推荐

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 (

Dotfiles模板项目使用教程

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

gitblog_00089的博客 385

简单的web界面

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

框架组件,究竟要不要自研?

一、问题的提出询问框架组件,是否需要自研?18年规划系统介绍58到家的技术体系,15年加盟58到家后,架构部正好也是负责范围的一部分,故谈一谈自己的想法,个人观点:如果公...

shenjian58的博客 613

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

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

CSS字体样式全攻略

🧱 让文字有空间感,适合标题或LOGO。🖋️适合插画、创意工作者的个人页面。🔥 适合标题、品牌名,视觉冲击力强。🧘‍♀️适合极简设计、文化类网站。✨适合科技类网站、博客、作品集。🚀适合游戏、AI、科技类项目。🐰 适合儿童类网站或节日氛围。📖适合时尚、生活方式类内容。🌫️ 适合神秘、梦幻主题。🌃 夜店风、科技感十足。具体效果是文字会上下跳动。

dreams_dream的博客 1806

自己动手设计一个Web框架

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

weixin_33725515的博客 393

一篇NS SAR ADC的学习记录

一篇NS SAR ADC的学习记录 内容包含: OverSampling Noise Shaping Dynamic Amplifier DAC with Redundancy 最近看了些有意思的SAR ADC结构,但是因为确实对模拟这个领域不太熟,导致了一系列的级联查找,最终达到了一个大概能懂的状态,为了理清思路,顺便别让看了这么些天的东西浪费了,还是计划写篇文章。 ps:由于不是一篇特别正紧的报告,参考文献就写的比较随便,且我还是个做数字的 A 13.5-ENOB, 107-μW Noise-Sha

weixin_45669724的博客 8714

关于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

ZXDoc工业级CAN总线仿真工具全解析与应用实践

CAN总线作为现代工业通信的核心协议,其仿真技术是汽车电子和工业控制领域的关键支撑。通过物理层信号模拟、协议层报文解析和应用层人机交互的三维仿真,开发者能够构建完整的硬件在环测试环境。ZXDoc作为工业级仿真工具,集成了DBC工程化管理、HMI面板设计和自动化测试脚本等核心功能,特别适用于ECU开发、产线验证等场景。工具支持ISO11898标准协议,提供错误帧注入、负载压力测试等高级特性,结合Python API可实现复杂测试用例的自动化执行。在新能源车VCU测试等实践中,通过优化采样点等参数配置,显著提升

weixin_30096975的博客 474

Windows下玩转Spark:零基础本地集群搭建与实战演示

本文详细介绍了在Windows系统下零基础搭建Spark本地集群的完整流程,包括环境准备、集群启动、实战案例演示及性能优化技巧。通过Standalone模式快速部署,结合WordCount等经典案例帮助初学者快速掌握Spark数据处理,特别适合Windows环境下的大数据开发入门学习。

weixin_33734785的博客 425

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

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

Java技术江湖 6205

光电振荡器(OEO):从原理到应用,解锁高频微波信号新纪元

本文深入解析了光电振荡器(OEO)的核心原理与前沿应用。OEO通过巧妙的光-电-光转换机制,利用光学谐振腔产生高频、高纯度、低相位噪声的微波信号,有效突破了传统电子电路的频率瓶颈。文章详细拆解了其工作流程,并探讨了在雷达系统、高速光通信及精密测量等领域的硬核应用价值。

weixin_29231027的博客 368

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

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

weixin_31742871的博客 296

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 444

万字详解YOLOv8网络结构Backbone/neck/head以及Conv、Bottleneck、C2f、SPPF、Detect等模块

YOLOv8是由Ultralytics开发的最先进的目标检测模型,推升了速度、准确性和用户友好性的界限。YOLO这一缩写代表“你只看一次”(You Only Look Once),通过在一次网络传递中同时预测所有边界框,提升了算法的效率和实时处理能力。相比之下,其他一些目标检测技术需要经过多个阶段或过程来完成检测。YOLOv8在流行的YOLOv5架构上进行了扩展,在多个方面提供了改进。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 14万+

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

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

宋三丝的专栏 2209

Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配

目前阻抗匹配多直接有制版厂进行,PCB设计师在设计阶段可不关注阻抗设计,在加工阶段只需标注需要控制的阻抗线,制板厂即可按照要求对阻抗线进行调整和控制。但是对于设计师来讲掌握阻抗线的设计方法也是非常必要的。本文介绍Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配。

fydar的博客 894

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

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

weixin_42596246的博客 83

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

dengyilang123的博客 1575

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

weixin_42499004的博客 219

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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
上一篇: 全栈虚拟机GraalVM初体验
下一篇: 码洞技术文章大全
codehole_
博客等级 码龄7年 34粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值