Spring MVC 接口命名为什么会有 *.do/actions等身影?

Spring MVC 接口命名为什么会有 *.do/actions等身影?

一、 始于 Struts 1 的统治时代

要把时间拨回到 2000 年到 2005 年 。那是 Java Web 的"战国时代",而最终一统天下的霸主框架叫做 Struts 1

在那个年代,Servlet 还是新鲜事物。Struts 1 为了规范开发,引入了一个核心控制器(ActionServlet)。为了让 Web 服务器(如 Tomcat)知道哪些请求是静态的 HTML,哪些请求需要交给 Java 程序处理,开发者需要在 web.xml 中配置拦截规则。

Struts 官方文档和示例代码中,约定俗成地使用了一个后缀------.do 。意思非常直白:Do Something(做点什么)

code Xmldownloadcontent_copyexpand_less

复制代码
    <!-- Struts 1 的经典配置 -->
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

因为 Struts 1 太过流行,市场占有率一度超过 80%,导致整整一代 Java 程序员形成了肌肉记忆:看到 .do,就知道这是个 Java 写的动态接口。

二、 Spring MVC 的崛起与"伪装"

后来,Spring MVC 出现了。它设计更优雅、扩展性更强。但当它试图进入企业级开发市场时,面临一个巨大的问题:存量系统的迁移

很多公司已经有了庞大的 Struts 系统。如果把后台换成 Spring MVC,接口路径必须从 /user/login.do 变成 /user/login,这意味着:

  1. 前端 JS 要全改:所有的 AJAX 请求路径都要变。
  2. 老旧页面要全改:JSP 里的 form 表单提交地址要变。
  3. 外部接口要全挂:别的系统调用你的接口也会报错。

为了实现**"平滑升级"**,架构师们想了一个聪明的办法:换芯不换皮

虽然 Spring MVC 天生支持 RESTful 风格(无后缀),但它完全兼容后缀匹配。于是,大家在 Spring MVC 的配置里照样写上:

复制代码
    <!-- Spring MVC 模仿 Struts -->
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

这样,前端根本感觉不到后台框架变了。这就是为什么很多明明是 Spring MVC 的项目,却依然留着 Struts 的"纹身"。

三、 还有哪些有趣的后缀?

在 Java Web 的历史长河中,不同的后缀往往代表着不同的技术流派:

  1. *.doStruts 1 的标志,也是 Spring MVC 兼容模式的常客。
  2. *.actionStruts 2(WebWork)的默认后缀。如果你看到这个,说明系统可能经历过 Struts 2 的时代。
  3. *.jsf / *.facesJSF (JavaServer Faces) 的标志,常见于银行和政府的老内网系统。
  4. *.jsp :最原始的 JSP Model 1 开发模式,业务逻辑直接写在页面里。
  5. 无后缀 ( /api/user ) :现代 Spring Boot + RESTful 风格,也是目前的主流。它利用 HTTP Method (GET/POST/PUT/DELETE) 来区分操作,URL 更加简洁语义化。

总结

它是一块活化石,记录着从 Struts 王朝到 Spring 盛世的权力交接,也体现了软件工程中**"向后兼容"**这一至高无上的生存法则。它就像你键盘上那个几乎不用的 Scroll Lock 键,虽然时代变了,但它依然在那里,默默守护着旧日的秩序。

相关推荐
狼爷2 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
祎雪双十Gy6 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java12346 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java
考虑考虑9 小时前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫10 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev10 小时前
广播接收器 → Flow + Lifecycle
android·java·kotlin
plainGeekDev10 小时前
EventBus → SharedFlow
android·java·kotlin
带刺的坐椅10 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
用户37215742613511 小时前
Java 将一个 PPT 文档拆分为多个文件
java
人活一口气1 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc