私は次のソースコード構造を持つ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
、サーブレットをセットアップするためのXMLファイル、Spring beanワイヤリングコンテキスト、そしてJSPタグとビューを含みます。
私は何がこの構造を制約/定義しているのか理解しようとしています。例えば。 JSPファイルは常にWEB-INF
内にある必要がありますか、それとも他の場所にある可能性がありますか。そしてWEB-INF
に入るかもしれない何か他にありますか?ウィキペディアの WARファイル エントリには、Javaクラス用のclasses
とJARファイル用のlib
が記載されています - 他のソースファイルの場所に加えてこれらがいつ必要になるのか完全に把握できません。
サーブレット2.4仕様 は、WEB-INFについて説明しています(70ページ)。
アプリケーション階層内に
WEB-INF
という名前の特別なディレクトリがあります。このディレクトリには、アプリケーションのドキュメントルートにないアプリケーションに関連するすべてのものが含まれています。WEB-INF
ノードはアプリケーションのパブリックドキュメントツリーの一部ではありません。WEB-INF
ディレクトリに含まれるファイルは、コンテナによって直接クライアントに提供されることはありません。ただし、WEB-INF
ディレクトリの内容は、getResource
name__に対してgetResourceAsStream
name__およびServletContext
name__メソッド呼び出しを使用してサーブレットコードに表示され、RequestDispatcher
name__呼び出しを使用して公開することができます。
これはWEB-INF
リソースがあなたのWebアプリケーションのリソースローダーにアクセス可能であり、一般に直接見えないことを意味します。
これが、多くのプロジェクトがJSPファイル、JAR /ライブラリ、独自のクラスファイル、プロパティファイル、その他の機密情報などのリソースをWEB-INF
フォルダに配置する理由です。それ以外の場合は、単純な静的URLを使用してアクセスできます(CSSやJavascriptなどをロードするのに便利です)。
技術的な観点から見ると、JSPファイルはどこでもかまいません。たとえばSpringでは、明示的にWEB-INF
に入れるように設定できます。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" >
</bean>
Wikipediaの WARファイル の記事に記載されているWEB-INF/classes
およびWEB-INF/lib
フォルダーは、実行時にサーブレット仕様で必要とされるフォルダーの例です。
プロジェクトの構造と結果のWARファイルの構造との間に違いを生じさせることは重要です。
プロジェクトの構造は、場合によってはWARファイルの構造を部分的に反映することになります(JSPファイル、HTMLファイル、JavaScriptファイルなどの静的リソースの場合)が、必ずしもそうとは限りません。
プロジェクト構造から結果のWARファイルへの移行はビルドプロセスによって行われます。
あなたは通常あなた自身のビルドプロセスを自由に設計できますが、今日ではほとんどの人が Apache Maven のような標準化されたアプローチを使うでしょう。特にMavenは、プロジェクト構造内のどのリソースが結果成果物内のどのリソースにマップされるかについてのデフォルトを定義します(この場合、結果成果物はWARファイルです)。場合によっては、マッピングはプレーンコピープロセスで構成され、他の場合ではマッピングプロセスはフィルタリングやコンパイルなどの変換を含みます。
1つの例:WEB-INF/classes
フォルダーには、後でアプリケーションを起動するためにクラスローダーによってロードされる必要があるすべてのコンパイル済みJavaクラスおよびリソース(src/main/Java
およびsrc/main/resources
)が含まれます。
もう1つの例:WEB-INF/lib
フォルダーには、後でアプリケーションで必要なすべてのjarファイルが含まれます。 Mavenプロジェクトでは依存関係が自動的に管理され、Mavenは必要なjarファイルを自動的にWEB-INF/lib
フォルダーにコピーします。 Mavenプロジェクトにlib
name__フォルダーがないのはそのためです。
Java EE Webアプリケーションをデプロイするとき(フレームワークを使用するかどうかにかかわらず)、その構造はいくつかの要件/仕様に従う必要があります。これらの仕様は、
- サーブレットコンテナ(例:Tomcat)
- JavaサーブレットAPI
- あなたのアプリケーションドメイン
JavaサーブレットAPIの要件
JavaサーブレットAPIは、ルートアプリケーションディレクトリが以下の構造を持つ必要があると述べています。
ApplicationName
|
|--META-INF
|--WEB-INF
|_web.xml <-- Here is the configuration file of your web app(where you define servlets, filters, listeners...)
|_classes <--Here goes all the classes of your webapp, following the package structure you defined. Only
|_lib <--Here goes all the libraries (jars) your application need
これらの要件は、Java Servlet APIによって定義されています。
3。あなたのアプリケーションドメイン
サーブレットコンテナ(またはアプリケーションサーバ)の要件とJavaサーブレットAPIの要件に従ったので、必要なものに基づいてWebアプリケーションの他の部分を整理できます。
- リソース(JSPファイル、プレーンテキストファイル、スクリプトファイル)をアプリケーションのルートディレクトリに置くことができます。しかし、そうすれば、あなたのアプリケーションが提供するロジックによってリクエストが処理されるのではなく、ブラウザから直接アクセスできるようになります。そのため、あなたのリソースがそのように直接アクセスされるのを防ぐために、あなたはそれらのコンテンツがサーバによってのみアクセス可能であるWEB-INFディレクトリに置くことができます。
- いくつかのフレームワークを使用する場合、それらはしばしば設定ファイルを使用します。これらのフレームワーク(struts、spring、hibernate)の大部分はそれらの設定ファイルをクラスパス( "classes"ディレクトリ)に置くことを要求します。
公開したくないページ、またはページの一部をWEB-INFに入れる必要があります。通常、JSPまたはファセットはWEB-INFの外部にありますが、この場合はどのユーザーにとっても簡単にアクセスできます。許可制限がある場合は、WEB-INFを使用できます。
WEB-INF/libには、システムレベルでパックしたくないサードパーティのライブラリを含めることができます(JARは、サーバー上で実行されているすべてのアプリケーションに使用できます)。ただし、この特定のアプリケーションにのみ使用できます。
一般的に言って、多くの設定ファイルはWEB-INFにも入ります。
WEB-INF/classesに関して - それはすべてのコンパイルされたソースが置かれているフォルダであるので(それはJARSではなく、あなたがあなた自身が書いたコンパイルされた.Javaファイルです)、それはあらゆるウェブアプリに存在します。
この規則はセキュリティ上の理由から守られています。たとえば、許可されていない人がURLから直接ルートJSPファイルにアクセスすることを許可されている場合、彼らは認証なしでアプリケーション全体をナビゲートでき、すべての保護されたデータにアクセスできます。
Jspページを深くリンクしたりブックマークしたりできないように、jspページをWEB-INFディレクトリの下に配置するという規則があります(必須ではありません)。このようにjspページへのすべてのリクエストは我々のアプリケーションを通して向けられなければならない、それでユーザーエクスペリエンスは保証される。