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,这意味着:
- 前端 JS 要全改:所有的 AJAX 请求路径都要变。
- 老旧页面要全改:JSP 里的 form 表单提交地址要变。
- 外部接口要全挂:别的系统调用你的接口也会报错。
为了实现**"平滑升级"**,架构师们想了一个聪明的办法:换芯不换皮。
虽然 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 的历史长河中,不同的后缀往往代表着不同的技术流派:
- *.do :Struts 1 的标志,也是 Spring MVC 兼容模式的常客。
- *.action :Struts 2(WebWork)的默认后缀。如果你看到这个,说明系统可能经历过 Struts 2 的时代。
- *.jsf / *.faces :JSF (JavaServer Faces) 的标志,常见于银行和政府的老内网系统。
- *.jsp :最原始的 JSP Model 1 开发模式,业务逻辑直接写在页面里。
- 无后缀 ( /api/user ) :现代 Spring Boot + RESTful 风格,也是目前的主流。它利用 HTTP Method (GET/POST/PUT/DELETE) 来区分操作,URL 更加简洁语义化。
总结
它是一块活化石,记录着从 Struts 王朝到 Spring 盛世的权力交接,也体现了软件工程中**"向后兼容"**这一至高无上的生存法则。它就像你键盘上那个几乎不用的 Scroll Lock 键,虽然时代变了,但它依然在那里,默默守护着旧日的秩序。