Skip to content

SmartWeb 与 Spring MVC

SmartWeb 和 Spring MVC 都解决“请求如何找到业务方法、参数如何进入方法、结果如何变成响应”的问题,但实现规模和扩展哲学明显不同。

核心模型对照

问题SmartWeb / Rain ControllerSpring MVC
Controller@WebController@Controller / @RestController
路径@Path + Action 注解@RequestMapping 及派生注解
参数绑定WebMethodInvokerHandlerMethodArgumentResolver
前后处理@Before / @After / ProcessProviderHandlerInterceptor、Filter、AOP
异常处理@Catch@ExceptionHandler / @ControllerAdvice
返回渲染SmartWeb Render / TempleHttpMessageConverter / ViewResolver
路由实现静态/动态树直接持有 ActionHandlerMapping + HandlerAdapter

SmartWeb 为什么更简单

Spring MVC 为 Servlet 生态、内容协商、大量参数解析器和多种 Handler 类型提供统一扩展层,能力全面,但请求链也更长。SmartWeb 的核心路径更短:

text
Request → WebRouter → WebActionInvoker
        → Before[] → Action → After[] / Catch[]
        → Render → Response

路由节点直接保存按 HTTP 方法区分的 Action,Action 直接保存已经排序的过程数组。启动后请求执行不需要重新发现 Controller 流程。

这种简单实现的收益是源码易读、定制直接、运行模型容易掌握;代价是内容协商、参数解析生态、验证、OpenAPI、Servlet 集成等成熟能力需要项目自行补充或封装。

Interceptor 与过程链

Spring HandlerInterceptor 通常围绕所有 Handler 提供 preHandlepostHandleafterCompletion。它适合基础设施级拦截,但要精确表达“只有带某业务注解的 Action 需要某权限”,通常还要读取 HandlerMethod 元数据。

SmartWeb 的 ProcessProvider 在启动期看到 Controller、Action 和业务注解,为目标 Action 直接生成过程调用器。因此业务语义与执行链绑定得更早:

kotlin
@RequirePermission("invoice:approve")
@PostAction("{id}/approve")
fun approve(id: Long) = invoiceService.approve(id)

这比在一个大型全局 Interceptor 中维护 URL 白名单更贴近业务,也比为每类权限创建独立 MVC Interceptor 更轻。

ControllerAdvice 与 Catch

Spring MVC 使用 @ExceptionHandler@ControllerAdvice 建立成熟的异常解析体系,可按异常、Controller 范围和优先级选择处理器。SmartWeb 使用更直接的 Catch 数组:异常类型匹配后调用过程方法。

SmartWeb 的优点是链路简单且可与 Before/After 使用同一权重和作用域模型;需要注意的是其异常返回语义不像 Spring MVC 那样自动经过完整的 HandlerMethodReturnValueHandler 体系,项目应建立统一的 ApiError 和 Render 约定。

参数解析

Spring MVC 通过大量 HandlerMethodArgumentResolver 逐个判断参数。SmartWeb 的 WebMethodInvoker.init() 在初始化时为每个参数确定读取函数,运行时直接从 Request、路径变量、Session、Cookie 或 Context 取值。

这种方案代码少、运行路径直接;但复杂媒体类型、校验、multipart 边界和自定义 resolver 生态不如 Spring MVC。对公开 API,应补充显式参数注解和集成测试。

什么时候选择谁

选择 SmartWeb,当你:

  • 已使用 Rain,希望保持模块和运行时轻量。
  • 愿意理解并直接控制请求执行链。
  • 业务拦截规则很多,希望用注解 + Provider 精确组合。
  • 不依赖 Spring Boot 的大规模 Web 生态。

选择 Spring MVC,当你:

  • 需要成熟的 Servlet、验证、内容协商、OpenAPI 和安全生态。
  • 团队已经形成 Spring 技术栈和运维规范。
  • 更重视标准集成数量,而不是框架源码规模和可直接修改性。

二者不是“功能多少”的简单竞争。Rain/SmartWeb 强调用较少抽象把核心请求链说明白,Spring MVC 强调在大生态中用稳定扩展协议容纳大量场景。

基于 Apache License 2.0 发布