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

相关推荐
葡萄成熟时 !1 小时前
黑马学生管理系统
java·开发语言
h***67371 小时前
springboot中配置logback-spring.xml
spring boot·spring·logback
沐浴露z1 小时前
为什么使用SpringAI时通常用Builder来创建对象?详解 【Builder模式】和【直接 new】的区别
java·python·建造者模式
阿杰真不会敲代码1 小时前
Filter与Interceptor深度解析:分清这两个“拦截器”,面试不再掉坑
java·spring boot·面试
带刺的坐椅2 小时前
Solon AI 开发学习6 - chat - 两种 http 流式输入输出
java·ai·solon
客梦2 小时前
Java 道路信息系统
java·笔记
l***74943 小时前
开源模型应用落地-工具使用篇-Spring AI-Function Call(八)
人工智能·spring·开源
我是小妖怪,潇洒又自在3 小时前
springcloud alibaba(四)OpenFeign实现服务调用
后端·spring·spring cloud·springboot