如何创建自己的 Mini MVC 框架(如何无框架写个 Web App)

简介: 如何创建自己的 Mini MVC 框架(如何无框架写个 Web App)

我们都知道 Rails、Grape 等等都是 Rack App 框架。

所谓 Rack App 是指遵循了 Rack 协议的 App,其中最主要的,或者最容易理解的一点就是,他们有共同的入口点:即 config.ru 文件。

其中,对于 config.ru 的规定是:

  1. run 命令后面加一个可以响应 call 方法的一个实例
  2. 这个 call 方法需要返回一个数组,其中,第一个为 HTTP 状态码,第二个为 Hash 组成的,代表 HTTP 协议中的 Headers,第三个是个字符串数组,数据个数为 1。 示例:[200, { 'Content-Type' => 'application/json'}, ["I am html body"]]

对于 Ruby 来说,具有call 这个方法的默认的就有 Proc, proc, lambda 等等,当然也可以自己声明。

依据上面这些基础知识,我们可以实现一个所谓的 Web App:

# config.ru
run proc {
      [200, {'Content-Type' => 'text/html'},
        ["Hello, world!"]]
}

这时候我们在这个文件所在的目录下运行:

$ rackup -p 300

我们就能在浏览器里面查看了: http://localhost:3000

到目前来说,我们算是可以实现一个简单的 Web APP 了。

那么我们如何实现一个 MVC 分层的 Web App 呢?

首先,我们可以按照 Rails 框架的思路,做一个分层: 数据库我们用 Sqlite 3,

# app/model/user.rb
class User
  attr_accessor :name, :email
  def initialize(name, email)
    @name = name
    @email = email
  end
  def self.all
    @users = []
    db = SQLite3::Database.new "toyapp.db"
    db.execute('select * from users where 1 = 1 limit 1;') do |row|
      @users << self.new(row[1], row[2])
    end
    @users
  end
  #method_missing
end

View 层我们用 ERB 来实现:

# index.html.erb
<div>
  name: <%= @user.name %>
  <br>
  email: <%= @user.email %>
</div>

Controller 层,我们简单的模仿 Rails:

class UsersController
  def index
    @user = User.all[0]
    puts @user
    template = File.open("./index.html.erb").read
    template = ERB.new(template)
    template.result(binding)  # 通过 binding 切换作用域
  end
end

我们通过 Application 可以把这些串起来:

class Application
  def call(env)   # env 参数是 Rack 默认会传过来的,其中包含了一个请求常见的信息
    [ 200,
      {'Content-Type'=>'text/html'},
      [UsersController.new.index]
    ]
  end
end

然后我们通过 Rack 来运行我们的 App:

# config.ru
run Application.new

现在,我们可以来试试我们的 Web APP

$ rackup -p 3000

屏幕截图 2023-09-06 115436.png

源码地址:https://github.com/rocLv/no-framework-app.git

感兴趣的也可以找我来索要视频录像,视频剪辑好以后会发布在这。


相关文章
|
4月前
|
移动开发 前端开发 JavaScript
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
508 0
|
2月前
|
JSON 自然语言处理 数据格式
使用Tabs选项卡组件快速搭建鸿蒙APP框架
ArkUI提供了很多布局组件,其中Tabs选项卡组件可以用于快速搭建鸿蒙APP框架,本文通过案例研究Tabs构建鸿蒙原生应用框架的方法和步骤。
357 5
使用Tabs选项卡组件快速搭建鸿蒙APP框架
|
1月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
336 1
|
4月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
330 0
|
5月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
5月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
5月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
7月前
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
908 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
《仿盒马》app开发技术分享-- 兑换订单列表框架(75)
上一节我们针对订单兑换的业务逻辑进行了完善,成功的在兑换物品之后修改了用户信息的修改,新增了积分消费的记录。这一节我们实现订单创建之后进入的列表展示页框架。
112 0
|
8月前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
210 5

热门文章

最新文章

下一篇
oss云网关配置