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 键,虽然时代变了,但它依然在那里,默默守护着旧日的秩序。

相关推荐
axng pmje15 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv716 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫16 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_4352879216 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本16 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin52112316 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯18 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户606487671889618 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java
我命由我1234518 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
aXin_ya18 小时前
微服务第八天 Sentinel 四种分布式事务模式
java·数据库·微服务