Web框架业务层设计与实现

模块概述

这是一个轻量级但功能完整的Web MVC框架,支持常见的Web应用功能,包括路由、控制器、请求处理、响应生成等。通过反射机制实现了优雅的控制器注册和方法调用。

类结构设计

1. Request类

处理HTTP请求:

1
2
3
4
5
6
7
8
9
class Request {
private:
string m_method; // 请求方法(GET/POST)
string m_uri; // 完整URI
string m_path; // 请求路径
string m_body; // 请求体
Json m_post; // POST数据
std::map<string, FileUpload> m_files; // 上传文件
};

2. Response类

1
2
3
4
5
6
7
8
9
10
class Response {
public:
void html(const string & data); // 返回HTML
void json(const string & data); // 返回JSON
void render(const string & filename); // 渲染模板
private:
int m_code; // 状态码
Type m_type; // 响应类型
string m_data; // 响应数据
};

3. Server类

1
2
3
4
5
6
7
8
9
10
class Server {
public:
void start(); // 启动服务器
void bind(const string & path, server_handler handler); // 路由绑定
string handle(const Request & req); // 请求处理
private:
std::map<string, server_handler> m_handlers; // 路由表
string m_template_folder; // 模板目录
string m_static_folder; // 静态文件目录
};

4. 控制器示例

1
2
3
4
5
class Form : public Controller {
public:
void index(const Request & req, Response & resp); // 渲染表单页面
void reply(const Request & req, Response & resp); // 处理表单提交
};

继承于Controller就实现了/Form/reply的路由注册

常见问题解答(Q&A)

Q1: 请描述该Web框架的整体架构设计和主要组件?

A1: 框架主要包含以下核心组件:

  1. Server组件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Server {
    void start(); // 启动服务器
    void bind(const string & path, server_handler handler); // 路由绑定
    string handle(const Request & req); // 请求处理
    private:
    std::map<string, server_handler> m_handlers; // 路由表
    string m_template_folder; // 模板目录
    string m_static_folder; // 静态资源目录
    };
  2. 请求处理流程:

  • URL解析
  • 路由匹配
  • 控制器调用
  • 响应生成

Q2: 框架如何处理文件上传功能?

A2: 主要通过以下机制实现:

  1. FileUpload类:

    1
    2
    3
    4
    5
    6
    7
    8
    class FileUpload {
    void parse(const char * buf, int len); // 解析上传数据
    bool save(const string & filename); // 保存文件
    private:
    string m_name; // 表单字段名
    string m_filename; // 文件名
    string m_type; // 文件类型
    };
  2. 处理流程:

  • 解析multipart/form-data
  • 提取文件信息和内容
  • 保存到指定目录

Q3: 框架支持哪些响应类型?如何处理不同类型的响应?

A3: 支持多种响应类型:

  1. Response类型枚举:
  • HTML
  • JSON
  • JS
  • CSS
  • 图片(JPG/PNG/GIF)
  • ICO
  1. 响应处理示例:
    1
    2
    3
    4
    5
    void Response::data(Type type, const string & data) {
    m_type = type;
    m_data = data;
    // 根据类型设置不同的Content-Type
    }

Q4: 请详细描述框架的路由实现机制?

A4: 路由实现包含:

  1. URL解析:

    1
    2
    std::vector<string> arr = String::split(String::trim(path, " /"), '/');
    // 解析为控制器名和方法名
  2. 路由匹配优先级:

  • 显式路由绑定
  • 静态资源匹配
  • 控制器方法映射
  1. 反射调用:
    1
    2
    Object * ctrl = factory->create_class(classname);
    ctrl->call(methodname, req, resp);