1. ホーム
  2. java

[解決済み】JavaEEのWebアプリケーションでWEB-INFは何のために使われるのですか?

2022-04-15 07:13:32

質問

以下のようなソースコードのディレクトリ構造を持つJava EE Webアプリケーションに取り組んでいます。

src/main/java                 <-- multiple packages containing Java classes
src/test/java                 <-- multiple packages containing JUnit tests
src/main/resources            <-- includes properties files for textual messages
src/main/webapp/resources     <-- includes CSS, images and all Javascript files
src/main/webapp/WEB-INF
src/main/webapp/WEB-INF/tags
src/main/webapp/WEB-INF/views

気になるフォルダーは WEB-INF : この中には web.xml サーブレット、Spring Beanの配線コンテキスト、JSPタグとビューを設定するためのXMLファイルです。私は、この構造を制約/定義するものを理解しようとしています。例えば、JSPファイルは常に WEB-INF それとも他の場所にあるのでしょうか?また、他に WEB-INF ? ウィキペディアの WARファイル の項目で触れています。 classes はJavaクラスで lib JARファイルについては、他のソースファイルの場所に加えて、これらがどのような場合に必要になるのか、完全に把握しているわけではありません。

どのように解決するのか?

その サーブレット2.4仕様 は、WEB-INFについてこのように述べています(70ページ)。

アプリケーション階層内に WEB-INF . このディレクトリには アプリケーションのドキュメントルートにないものです。 は、その WEB-INF の公開ドキュメントツリーに含まれないノードです。 アプリケーション . に含まれるファイルはありません。 WEB-INF ディレクトリを提供することができます。 コンテナによってクライアントに直接 しかし WEB-INF ディレクトリは、サーブレットコードから getResourcegetResourceAsStream メソッド呼び出しで ServletContext であり、また を使用して公開されます。 RequestDispatcher の呼び出しがあります。

これは、以下のことを意味します。 WEB-INF リソースは、Webアプリケーションのリソースローダーからアクセス可能であり、一般からは直接見えません。

このため、多くのプロジェクトでは、JSP ファイル、JARs/ライブラリ、独自のクラスファイルやプロパティファイルなどのリソースや、その他の機密情報を WEB-INF フォルダーに格納されます。そうでなければ、単純な静的URLでアクセスできてしまいます(例えばCSSやJavascriptを読み込むのに便利です)。

技術的な観点からは、JSPファイルはどこにでも置くことができます。例えばSpringでは、JSPファイルを WEB-INF を明示的に指定します。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/jsp/" 
    p:suffix=".jsp" >
</bean>

WEB-INF/classesWEB-INF/lib のフォルダは、Wikipedia の WARファイル の記事は、Servletの仕様上、実行時に必要となるフォルダの例です。

プロジェクトの構造と、出来上がったWARファイルの構造の違いを明確にすることが重要です。

プロジェクトの構造は、場合によってはWARファイルの構造を部分的に反映します(JSPファイルやHTML、JavaScriptファイルなどの静的なリソースの場合ですが、必ずしもそうとは限りません)。

プロジェクト構造から結果のWARファイルへの移行は、ビルドプロセスによって行われる。

通常、ビルドプロセスは自由に設計できますが、現在ではほとんどの人が次のような標準化されたアプローチを使用します。 アパッチ・メイブン . Mavenは、プロジェクト構造内のどのリソースが結果の成果物(この場合、結果の成果物はWARファイルです)のどのリソースにマッピングされるかのデフォルトを定義します。あるケースでは、マッピングは単純なコピープロセスで構成され、他のケースでは、マッピングプロセスにはフィルタリングやコンパイルなどの変換が含まれます。

一例 : は WEB-INF/classes フォルダには、後でコンパイルされたすべての Java クラスとリソース ( src/main/javasrc/main/resources ) が、アプリケーションを起動するためにクラスローダーによってロードされる必要があります。

もう一つの例 : は WEB-INF/lib フォルダには、後でアプリケーションに必要なすべての jar ファイルが格納されます。mavenプロジェクトでは、依存関係はあなたのために管理され、mavenは自動的に必要なjarファイルを WEB-INF/lib フォルダーを作成します。そのため lib フォルダを作成します。