なぜこれほど多くのJava開発者がWebコントローラー(MVC)リソースの拡張として ".do"を使用するのかといつも疑問に思っていました。例: http://example.com/register.do
Spring MVCおよびStrutsプロジェクトで見たように、フレームワーク固有でさえないようです。この「.do」拡張のプラクティスはどこから来たのですか。なぜこれが拡張なしではなく行われたのですか?これに関するJavaの世界メモを見逃したように感じます。
個人的に私は拡張子を好みません。
私の知る限り、この規約は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を置き換えた後でも、時には人々が喜んでいたからです)。
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サーバーのロードバランサーで実行されます。