web-dev-qa-db-ja.com

Java webappsが.do拡張子を使用するのはなぜですか?それはどこから来たの?

なぜこれほど多くのJava開発者がWebコントローラー(MVC)リソースの拡張として ".do"を使用するのかといつも疑問に思っていました。例: http://example.com/register.do

Spring MVCおよびStrutsプロジェクトで見たように、フレームワーク固有でさえないようです。この「.do」拡張のプラクティスはどこから来たのですか。なぜこれが拡張なしではなく行われたのですか?これに関するJavaの世界メモを見逃したように感じます。

個人的に私は拡張子を好みません。

109
Adam Gent

私の知る限り、この規約はStruts1によって広まっています。ユーザーガイドには次のように記載されています。

5.4.2 ActionServletマッピングの設定

注:このセクションの内容は、Strutsに固有のものではありません。サーブレットマッピングの構成は、Javaサーブレット仕様で定義されています。このセクションでは、アプリケーションを構成する最も一般的な方法について説明します。

コントローラーサーブレットによって処理されるURLを定義するには、プレフィックスマッチングと拡張子マッチングの2つの一般的なアプローチがあります。各アプローチに適切なマッピングエントリを以下に説明します。

プレフィックス一致とは、特定の値で(コンテキストパス部分の後に)始まるすべてのURLをこのサーブレットに渡すことを意味します。このようなエントリは次のようになります。

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

つまり、前述の/logonパスに一致するリクエストURIは次のようになります。

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

ここで、/myapplicationは、アプリケーションがデプロイされるコンテキストパスです。

一方、拡張マッピングは、URIがピリオドで終了し、その後に定義された文字セットが続くという事実に基づいて、リクエストURIをアクションサーブレットに一致させます。たとえば、JSP処理サーブレットは*.jspパターンにマップされるため、要求されたすべてのJSPページを処理するために呼び出されます。 *.do拡張機能(「何かをする」ことを意味します)を使用するには、マッピングエントリは次のようになります。

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

また、前述の/logonパスに一致するリクエストURIは次のようになります。

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

WARNING-コントローラーサーブレットに複数の<servlet-mapping>要素を定義すると、フレームワークは正しく動作しません。

WARNING-バージョン1.1以降の新しいモジュールサポートを使用している場合、拡張マッピングのみがサポートされていることに注意する必要があります。

そして、この慣習は守られていると思います(時々 RLを変更しないため Struts1を置き換えた後でも、時には人々が喜んでいたからです)。

72
Pascal Thivent

StrutsサーブレットにURLを渡すために、strutsサーブレットをweb.xmlの* .doにマップするのが一般的な方法でした。例えば:

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

これには慣習以外の理由はありません。拡張機能を使用しない場合、画像やその他の静的コンテンツをsevletに送信しない方法で処理するための魔法をかける必要があります。多くの場合、これはフロントWebサーバーのロードバランサーで実行されます。

9
leonm