QA@IT
«回答へ戻る

タグが消えていたので修正

42
     `-- static
         `-- index.html
 
-例えば、Tomcat においては、デフォルトではHTMLなどのスタティックファイルのリソース処理は、org.apache.naming.resources.FileDirContext クラスが行います。これの処理を変更すれば良いので、これを extends した独自クラス MyDirContext クラスを用意すればできそうです。クラスを用意したら、app.war/META-INF/context.xml へ <Context><Resources className="MyDirContext" /></Context> のような感じで指定すればできるかもしれません(自分では確認してません)。
+例えば、Tomcat においては、デフォルトではHTMLなどのスタティックファイルのリソース処理は、org.apache.naming.resources.FileDirContext クラスが行います。これの処理を変更すれば良いので、これを extends した独自クラス MyDirContext クラスを用意すればできそうです。クラスを用意したら、app.war/META-INF/context.xml へ &lt;Context&gt;&lt;Resources className=&quot;MyDirContext&quot; /&gt;&lt;/Context&gt; のような感じで指定すればできるかもしれません(自分では確認してません)。
  
  
 

開発時のディレクトリ構成と、サーブレットコンテナへデプロイしたときのディレクトリ構成は別です。tm_senda さんやasahina_cp さんが指摘しているように、例えば開発時の src/main/webapp/styles/application.css というファイルがデプロイ時にサーブレットコンテナ用のWARファイル内のどこに入れられるのかは、ant、maven といったビルドツールでの指定が使われます。Eclipseを使っているなら、Eclipseプロジェクトのプロパティによりどうなるか決まります。まずは、この点について理解が必要です。
 
 

静的コンテンツのサーブ機能はサーブレットコンテナが持っているものだと思う

サーブレットコンテナが提供しています。
 
 

 1. app/index.html にアクセスするとき、app/ という URL と src/main/webapp が対応していると思うのですが、この関係はどこで決まっているのでしょうか?

app/ (この後はURLだとわかるように http://example.jp/app/ と表記します)という URL と src/main/webapp は直接は対応していません。下記の構成でデプロイされているとすると、「http://example.jp/app/ という URL に対して app.war/index.html を対応づける」という設定がサーブレットコンテナで指定できます。

app.war
|-- styles
|    |-- application.css
|    `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- index.html

Tomcatの場合は $CATALINA_HOME/conf/web.xml で下記のように指定されていて、これが適用されています。ちなみに、この指定はWebアプリ単位もできて、Webアプリごとにカスタマイズしたい場合は app.war/WEB-INF/web.xml に同様に指定します。

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

 
 

 2. 1. のマッピングを変更することは可能なのでしょうか?例えば app/index.html を src/main/webapp/static/index.html にマッピングするなど。

下記の構成でデプロイするときに、src/main/webapp/static/index.html を app.war/index.html へコピーするようにビルドを設定すれば、希望している動作になるはずです。

app.war
|-- styles
|    |-- application.css
|    `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- index.html

なお、Tomcat であれば $CATALINA_HOME/conf/Catalina/localhost/app.xml を用意して、下記のような指定をすれば、/var/www/tomcat-static/app を http://example.jp/app/ に対応づけることができます。このようにして、好きなディレクトリをドキュメントベースにできます。

<Context path="/app/"
 docBase="/var/www/tomcat-static/app/">
</Context>

この場合は、/var/www/tomcat-static/app/ 配下に下記のようなディレクトリ構成で必要なファイルを用意することになります。

/var/www/tomcat-static/app/
 |-- styles
 |    |-- application.css
 |    `-- lib.css
 |-- WEB-INF
 |   `-- web.xml
 `-- index.html

ところで、質問の意図としては、下記のような構成でデプロイして、サーブレットコンテナの設定で app.war/static を静的コンテンツのROOTにする方法を聞かれているかもしれませんが、これについて簡単に実現する方法は知りません。

app.war
|-- styles
|    |-- application.css
|    `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- static
    `-- index.html

例えば、Tomcat においては、デフォルトではHTMLなどのスタティックファイルのリソース処理は、org.apache.naming.resources.FileDirContext クラスが行います。これの処理を変更すれば良いので、これを extends した独自クラス MyDirContext クラスを用意すればできそうです。クラスを用意したら、app.war/META-INF/context.xml へ <Context><Resources className="MyDirContext" /></Context> のような感じで指定すればできるかもしれません(自分では確認してません)。
 
 

 3. ひとつの URL に対して、ふたつの静的コンテンツを格納したディレクトリを対応させるということは出来るのでしょうか?

下記のような構成のときに、http://example.jp/app/styles/ に対して、app.war/styles と app/thirdparty/styles/ の2つのディレクトリを対応させることはできません。

app.war
|-- styles
|    `-- application.css
|-- thirdparty
|    `-- styles
|         `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- index.html

開発中は「src/main/webapp/styles/application.css」と「src/main/webapp/thirdparty/styles/lib.css」と分けておいて、デプロイ時に下記のような構成になるようビルドの設定をすることはできます。このようにすることで、http://example.jp/app/styles/application.csshttp://example.jp/app/styles/lib.css とでCSSへアクセスできるようになります。

app.war
|-- styles
|    |-- application.css
|    `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- index.html
開発時のディレクトリ構成と、サーブレットコンテナへデプロイしたときのディレクトリ構成は別です。tm_senda さんやasahina_cp さんが指摘しているように、例えば開発時の src/main/webapp/styles/application.css というファイルがデプロイ時にサーブレットコンテナ用のWARファイル内のどこに入れられるのかは、ant、maven といったビルドツールでの指定が使われます。Eclipseを使っているなら、Eclipseプロジェクトのプロパティによりどうなるか決まります。まずは、この点について理解が必要です。
 
 
> 静的コンテンツのサーブ機能はサーブレットコンテナが持っているものだと思う

サーブレットコンテナが提供しています。
 
 
>  1. app/index.html にアクセスするとき、app/ という URL と src/main/webapp が対応していると思うのですが、この関係はどこで決まっているのでしょうか?

app/ (この後はURLだとわかるように http://example.jp/app/ と表記します)という URL と src/main/webapp は直接は対応していません。下記の構成でデプロイされているとすると、「http://example.jp/app/ という URL に対して app.war/index.html を対応づける」という設定がサーブレットコンテナで指定できます。

    app.war
    |-- styles
    |    |-- application.css
    |    `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- index.html

Tomcatの場合は $CATALINA_HOME/conf/web.xml で下記のように指定されていて、これが適用されています。ちなみに、この指定はWebアプリ単位もできて、Webアプリごとにカスタマイズしたい場合は app.war/WEB-INF/web.xml に同様に指定します。

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
 
 

>  2. 1. のマッピングを変更することは可能なのでしょうか?例えば app/index.html を src/main/webapp/static/index.html にマッピングするなど。

下記の構成でデプロイするときに、src/main/webapp/static/index.html を app.war/index.html へコピーするようにビルドを設定すれば、希望している動作になるはずです。

    app.war
    |-- styles
    |    |-- application.css
    |    `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- index.html

なお、Tomcat であれば $CATALINA_HOME/conf/Catalina/localhost/app.xml を用意して、下記のような指定をすれば、/var/www/tomcat-static/app を http://example.jp/app/ に対応づけることができます。このようにして、好きなディレクトリをドキュメントベースにできます。

    <Context path="/app/"
     docBase="/var/www/tomcat-static/app/">
    </Context>

この場合は、/var/www/tomcat-static/app/ 配下に下記のようなディレクトリ構成で必要なファイルを用意することになります。

    /var/www/tomcat-static/app/
     |-- styles
     |    |-- application.css
     |    `-- lib.css
     |-- WEB-INF
     |   `-- web.xml
     `-- index.html

ところで、質問の意図としては、下記のような構成でデプロイして、サーブレットコンテナの設定で app.war/static を静的コンテンツのROOTにする方法を聞かれているかもしれませんが、これについて簡単に実現する方法は知りません。

    app.war
    |-- styles
    |    |-- application.css
    |    `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- static
        `-- index.html

例えば、Tomcat においては、デフォルトではHTMLなどのスタティックファイルのリソース処理は、org.apache.naming.resources.FileDirContext クラスが行います。これの処理を変更すれば良いので、これを extends した独自クラス MyDirContext クラスを用意すればできそうです。クラスを用意したら、app.war/META-INF/context.xml へ &lt;Context&gt;&lt;Resources className=&quot;MyDirContext&quot; /&gt;&lt;/Context&gt; のような感じで指定すればできるかもしれません(自分では確認してません)。
 
 

>  3. ひとつの URL に対して、ふたつの静的コンテンツを格納したディレクトリを対応させるということは出来るのでしょうか?

下記のような構成のときに、http://example.jp/app/styles/ に対して、app.war/styles と app/thirdparty/styles/ の2つのディレクトリを対応させることはできません。

    app.war
    |-- styles
    |    `-- application.css
    |-- thirdparty
    |    `-- styles
    |         `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- index.html

開発中は「src/main/webapp/styles/application.css」と「src/main/webapp/thirdparty/styles/lib.css」と分けておいて、デプロイ時に下記のような構成になるようビルドの設定をすることはできます。このようにすることで、http://example.jp/app/styles/application.css と http://example.jp/app/styles/lib.css とでCSSへアクセスできるようになります。

    app.war
    |-- styles
    |    |-- application.css
    |    `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- index.html

回答を投稿

開発時のディレクトリ構成と、サーブレットコンテナへデプロイしたときのディレクトリ構成は別です。tm_senda さんやasahina_cp さんが指摘しているように、例えば開発時の src/main/webapp/styles/application.css というファイルがデプロイ時にサーブレットコンテナ用のWARファイル内のどこに入れられるのかは、ant、maven といったビルドツールでの指定が使われます。Eclipseを使っているなら、Eclipseプロジェクトのプロパティによりどうなるか決まります。まずは、この点について理解が必要です。
 
 

静的コンテンツのサーブ機能はサーブレットコンテナが持っているものだと思う

サーブレットコンテナが提供しています。
 
 

 1. app/index.html にアクセスするとき、app/ という URL と src/main/webapp が対応していると思うのですが、この関係はどこで決まっているのでしょうか?

app/ (この後はURLだとわかるように http://example.jp/app/ と表記します)という URL と src/main/webapp は直接は対応していません。下記の構成でデプロイされているとすると、「http://example.jp/app/ という URL に対して app.war/index.html を対応づける」という設定がサーブレットコンテナで指定できます。

app.war
|-- styles
|    |-- application.css
|    `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- index.html

Tomcatの場合は $CATALINA_HOME/conf/web.xml で下記のように指定されていて、これが適用されています。ちなみに、この指定はWebアプリ単位もできて、Webアプリごとにカスタマイズしたい場合は app.war/WEB-INF/web.xml に同様に指定します。

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

 
 

 2. 1. のマッピングを変更することは可能なのでしょうか?例えば app/index.html を src/main/webapp/static/index.html にマッピングするなど。

下記の構成でデプロイするときに、src/main/webapp/static/index.html を app.war/index.html へコピーするようにビルドを設定すれば、希望している動作になるはずです。

app.war
|-- styles
|    |-- application.css
|    `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- index.html

なお、Tomcat であれば $CATALINA_HOME/conf/Catalina/localhost/app.xml を用意して、下記のような指定をすれば、/var/www/tomcat-static/app を http://example.jp/app/ に対応づけることができます。このようにして、好きなディレクトリをドキュメントベースにできます。

<Context path="/app/"
 docBase="/var/www/tomcat-static/app/">
</Context>

この場合は、/var/www/tomcat-static/app/ 配下に下記のようなディレクトリ構成で必要なファイルを用意することになります。

/var/www/tomcat-static/app/
 |-- styles
 |    |-- application.css
 |    `-- lib.css
 |-- WEB-INF
 |   `-- web.xml
 `-- index.html

ところで、質問の意図としては、下記のような構成でデプロイして、サーブレットコンテナの設定で app.war/static を静的コンテンツのROOTにする方法を聞かれているかもしれませんが、これについて簡単に実現する方法は知りません。

app.war
|-- styles
|    |-- application.css
|    `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- static
    `-- index.html

例えば、Tomcat においては、デフォルトではHTMLなどのスタティックファイルのリソース処理は、org.apache.naming.resources.FileDirContext クラスが行います。これの処理を変更すれば良いので、これを extends した独自クラス MyDirContext クラスを用意すればできそうです。クラスを用意したら、app.war/META-INF/context.xml へ のような感じで指定すればできるかもしれません(自分では確認してません)。
 
 

 3. ひとつの URL に対して、ふたつの静的コンテンツを格納したディレクトリを対応させるということは出来るのでしょうか?

下記のような構成のときに、http://example.jp/app/styles/ に対して、app.war/styles と app/thirdparty/styles/ の2つのディレクトリを対応させることはできません。

app.war
|-- styles
|    `-- application.css
|-- thirdparty
|    `-- styles
|         `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- index.html

開発中は「src/main/webapp/styles/application.css」と「src/main/webapp/thirdparty/styles/lib.css」と分けておいて、デプロイ時に下記のような構成になるようビルドの設定をすることはできます。このようにすることで、http://example.jp/app/styles/application.csshttp://example.jp/app/styles/lib.css とでCSSへアクセスできるようになります。

app.war
|-- styles
|    |-- application.css
|    `-- lib.css
|-- WEB-INF
|   `-- web.xml
`-- index.html
開発時のディレクトリ構成と、サーブレットコンテナへデプロイしたときのディレクトリ構成は別です。tm_senda さんやasahina_cp さんが指摘しているように、例えば開発時の src/main/webapp/styles/application.css というファイルがデプロイ時にサーブレットコンテナ用のWARファイル内のどこに入れられるのかは、ant、maven といったビルドツールでの指定が使われます。Eclipseを使っているなら、Eclipseプロジェクトのプロパティによりどうなるか決まります。まずは、この点について理解が必要です。
 
 
> 静的コンテンツのサーブ機能はサーブレットコンテナが持っているものだと思う

サーブレットコンテナが提供しています。
 
 
>  1. app/index.html にアクセスするとき、app/ という URL と src/main/webapp が対応していると思うのですが、この関係はどこで決まっているのでしょうか?

app/ (この後はURLだとわかるように http://example.jp/app/ と表記します)という URL と src/main/webapp は直接は対応していません。下記の構成でデプロイされているとすると、「http://example.jp/app/ という URL に対して app.war/index.html を対応づける」という設定がサーブレットコンテナで指定できます。

    app.war
    |-- styles
    |    |-- application.css
    |    `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- index.html

Tomcatの場合は $CATALINA_HOME/conf/web.xml で下記のように指定されていて、これが適用されています。ちなみに、この指定はWebアプリ単位もできて、Webアプリごとにカスタマイズしたい場合は app.war/WEB-INF/web.xml に同様に指定します。

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
 
 

>  2. 1. のマッピングを変更することは可能なのでしょうか?例えば app/index.html を src/main/webapp/static/index.html にマッピングするなど。

下記の構成でデプロイするときに、src/main/webapp/static/index.html を app.war/index.html へコピーするようにビルドを設定すれば、希望している動作になるはずです。

    app.war
    |-- styles
    |    |-- application.css
    |    `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- index.html

なお、Tomcat であれば $CATALINA_HOME/conf/Catalina/localhost/app.xml を用意して、下記のような指定をすれば、/var/www/tomcat-static/app を http://example.jp/app/ に対応づけることができます。このようにして、好きなディレクトリをドキュメントベースにできます。

    <Context path="/app/"
     docBase="/var/www/tomcat-static/app/">
    </Context>

この場合は、/var/www/tomcat-static/app/ 配下に下記のようなディレクトリ構成で必要なファイルを用意することになります。

    /var/www/tomcat-static/app/
     |-- styles
     |    |-- application.css
     |    `-- lib.css
     |-- WEB-INF
     |   `-- web.xml
     `-- index.html

ところで、質問の意図としては、下記のような構成でデプロイして、サーブレットコンテナの設定で app.war/static を静的コンテンツのROOTにする方法を聞かれているかもしれませんが、これについて簡単に実現する方法は知りません。

    app.war
    |-- styles
    |    |-- application.css
    |    `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- static
        `-- index.html

例えば、Tomcat においては、デフォルトではHTMLなどのスタティックファイルのリソース処理は、org.apache.naming.resources.FileDirContext クラスが行います。これの処理を変更すれば良いので、これを extends した独自クラス MyDirContext クラスを用意すればできそうです。クラスを用意したら、app.war/META-INF/context.xml へ <Context><Resources className="MyDirContext" /></Context> のような感じで指定すればできるかもしれません(自分では確認してません)。
 
 

>  3. ひとつの URL に対して、ふたつの静的コンテンツを格納したディレクトリを対応させるということは出来るのでしょうか?

下記のような構成のときに、http://example.jp/app/styles/ に対して、app.war/styles と app/thirdparty/styles/ の2つのディレクトリを対応させることはできません。

    app.war
    |-- styles
    |    `-- application.css
    |-- thirdparty
    |    `-- styles
    |         `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- index.html

開発中は「src/main/webapp/styles/application.css」と「src/main/webapp/thirdparty/styles/lib.css」と分けておいて、デプロイ時に下記のような構成になるようビルドの設定をすることはできます。このようにすることで、http://example.jp/app/styles/application.css と http://example.jp/app/styles/lib.css とでCSSへアクセスできるようになります。

    app.war
    |-- styles
    |    |-- application.css
    |    `-- lib.css
    |-- WEB-INF
    |   `-- web.xml
    `-- index.html