为什么 Java webapps 使用 .do 扩展名?它从何而来?

2022-08-31 09:03:26

我一直想知道为什么这么多Java开发人员使用“.do”作为他们的Web控制器(MVC)资源的扩展。示例:http://example.com/register.do

它甚至似乎不是特定于框架的,因为我在Spring MVC和Struts项目中看到了它。这种“.do”扩展实践从何而来。为什么这样做而不是不延长?我觉得我错过了Java世界关于这个的备忘录。

就个人而言,我更喜欢不扩展。


答案 1

据我所知,这个惯例已经由Struts1传播。用户指南是这样说的:

5.4.2 配置操作服务器映射

注意:本节中的材料并非特定于支柱。Servlet 映射的配置在 Java Servlet 规范中定义。本节介绍配置应用程序的最常见方法。

定义将由控制器 servlet 处理的 URL 有两种常用方法 - 前缀匹配和扩展匹配。下面将介绍每种方法的适当映射条目。

前缀匹配意味着您希望将所有以特定值开始(在上下文路径部分之后)的 URL 传递给此 Servlet。这样的条目可能如下所示:

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>/do/*</url-pattern>
</servlet-mapping>

这意味着与前面描述的路径匹配的请求 URI 可能如下所示:/logon

http://www.mycompany.com/myapplication/do/logon

where 是部署应用程序的上下文路径。/myapplication

另一方面,扩展映射将请求 URI 与操作 Servlet 进行匹配,基于 URI 以句点结尾,后跟一组定义的字符。例如,JSP 处理 servlet 映射到模式,以便调用它来处理所请求的每个 JSP 页。要使用 *.do 扩展名(这意味着“做点什么”),映射条目将如下所示:*.jsp

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

和与前面描述的路径匹配的请求 URI 可能如下所示:/logon

http://www.mycompany.com/myapplication/logon.do

警告 - 如果为控制器 servlet 定义多个元素,框架将无法正常运行。<servlet-mapping>

警告 - 如果自 1.1 版以来一直使用新模块支持,则应注意仅支持扩展映射。

我认为这个约定已经被保留了下来(有时即使在替换Struts1之后也不会更改URL,有时只是因为人们对它感到满意)。


答案 2

通常的做法是将 struts servlet 映射到 web 中的 *.do.xml将 URL 传递给 struts servlet。例如:

<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

除了惯例之外,真的没有理由这样做。如果您不使用扩展名,则需要执行一些魔术来处理图像和其他静态内容,而不会将它们发送到您的sevlet。通常,这是在前端 Web 服务器的负载平衡器上完成的。


推荐