web-dev-qa-db-ja.com

Java EE WebアプリケーションでWEB-INFは何に使用されますか?

私は次のソースコード構造を持つ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が記載されています - 他のソースファイルの場所に加えてこれらがいつ必要になるのか完全に把握できません。

156
Steve Chambers

サーブレット2.4仕様 は、WEB-INFについて説明しています(70ページ)。

アプリケーション階層内にWEB-INFという名前の特別なディレクトリがあります。このディレクトリには、アプリケーションのドキュメントルートにないアプリケーションに関連するすべてのものが含まれています。 WEB-INFノードはアプリケーションのパブリックドキュメントツリーの一部ではありませんWEB-INFディレクトリに含まれるファイルは、コンテナによって直接クライアントに提供されることはありません。ただし、WEB-INFディレクトリの内容は、getResourcename__に対してgetResourceAsStreamname__およびServletContextname__メソッド呼び出しを使用してサーブレットコードに表示され、RequestDispatchername__呼び出しを使用して公開することができます。

これは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プロジェクトにlibname__フォルダーがないのはそのためです。

190
mwhs

Java EE Webアプリケーションをデプロイするとき(フレームワークを使用するかどうかにかかわらず)、その構造はいくつかの要件/仕様に従う必要があります。これらの仕様は、

  • サーブレットコンテナ(例:Tomcat)
  • JavaサーブレットAPI
  • あなたのアプリケーションドメイン
  1. サーブレットコンテナの要件
    Apache Tomcatを使用している場合、アプリケーションのルートディレクトリはwebappフォルダに配置する必要があります。他のサーブレットコンテナまたはアプリケーションサーバーを使用している場合は、これが異なる場合があります。

  2. 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"ディレクトリ)に置くことを要求します。

51
Patrick B.

公開したくないページ、またはページの一部をWEB-INFに入れる必要があります。通常、JSPまたはファセットはWEB-INFの外部にありますが、この場合はどのユーザーにとっても簡単にアクセスできます。許可制限がある場合は、WEB-INFを使用できます。

WEB-INF/libには、システムレベルでパックしたくないサードパーティのライブラリを含めることができます(JARは、サーバー上で実行されているすべてのアプリケーションに使用できます)。ただし、この特定のアプリケーションにのみ使用できます。

一般的に言って、多くの設定ファイルはWEB-INFにも入ります。

WEB-INF/classesに関して - それはすべてのコンパイルされたソースが置かれているフォルダであるので(それはJARSではなく、あなたがあなた自身が書いたコンパイルされた.Javaファイルです)、それはあらゆるウェブアプリに存在します。

11
Artem Moskalev

この規則はセキュリティ上の理由から守られています。たとえば、許可されていない人がURLから直接ルートJSPファイルにアクセスすることを許可されている場合、彼らは認証なしでアプリケーション全体をナビゲートでき、すべての保護されたデータにアクセスできます。

4
user6432170

Jspページを深くリンクしたりブックマークしたりできないように、jspページをWEB-INFディレクトリの下に配置するという規則があります(必須ではありません)。このようにjspページへのすべてのリクエストは我々のアプリケーションを通して向けられなければならない、それでユーザーエクスペリエンスは保証される。

2