SmartWeb 与 Spring MVC
SmartWeb 和 Spring MVC 都解决“请求如何找到业务方法、参数如何进入方法、结果如何变成响应”的问题,但实现规模和扩展哲学明显不同。
核心模型对照
| 问题 | SmartWeb / Rain Controller | Spring MVC |
|---|---|---|
| Controller | @WebController | @Controller / @RestController |
| 路径 | @Path + Action 注解 | @RequestMapping 及派生注解 |
| 参数绑定 | WebMethodInvoker | HandlerMethodArgumentResolver |
| 前后处理 | @Before / @After / ProcessProvider | HandlerInterceptor、Filter、AOP |
| 异常处理 | @Catch | @ExceptionHandler / @ControllerAdvice |
| 返回渲染 | SmartWeb Render / Temple | HttpMessageConverter / ViewResolver |
| 路由实现 | 静态/动态树直接持有 Action | HandlerMapping + HandlerAdapter |
SmartWeb 为什么更简单
Spring MVC 为 Servlet 生态、内容协商、大量参数解析器和多种 Handler 类型提供统一扩展层,能力全面,但请求链也更长。SmartWeb 的核心路径更短:
Request → WebRouter → WebActionInvoker
→ Before[] → Action → After[] / Catch[]
→ Render → Response路由节点直接保存按 HTTP 方法区分的 Action,Action 直接保存已经排序的过程数组。启动后请求执行不需要重新发现 Controller 流程。
这种简单实现的收益是源码易读、定制直接、运行模型容易掌握;代价是内容协商、参数解析生态、验证、OpenAPI、Servlet 集成等成熟能力需要项目自行补充或封装。
Interceptor 与过程链
Spring HandlerInterceptor 通常围绕所有 Handler 提供 preHandle、postHandle、afterCompletion。它适合基础设施级拦截,但要精确表达“只有带某业务注解的 Action 需要某权限”,通常还要读取 HandlerMethod 元数据。
SmartWeb 的 ProcessProvider 在启动期看到 Controller、Action 和业务注解,为目标 Action 直接生成过程调用器。因此业务语义与执行链绑定得更早:
@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 强调在大生态中用稳定扩展协议容纳大量场景。