Webアプリケーション内で、WEB-INFディレクトリの下にある「仮想ディレクトリ」を作成したいと思います。実際、私が達成しようとしているのは、アプリケーションが展開されて実行された場合にファイルシステムにソフトリンクを作成するのと同じ効果です。私はこれを(最も重要な)weblogicと(理想的な世界では)桟橋の両方で達成しようとしています。
私は仮想ディレクトリの構成を知っていますが、コンテンツがURLを介して直接提供されることを望まないため、これらは私の目的に適していません(したがって、それがWEB-INFに存在する理由)。 jettyまたはweblogicの構成ドキュメントで、リソース解決に同様の概念を提供しているように見えるものは何も見つかりませんでした(jettyに「extraClassPath」を追加しようとしましたが、成功しませんでした)。さらなる背景として、アプリケーションはSpring MVCを使用しており、ビューリゾルバーはWEB-INFの下のJSPを指しています。
<bean id="myResolverBean"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/foo/baz/" p:suffix=".jsp" />
スプリングコードを調べた後、リソースのロードに関しては何もしていないと私は信じています。パスを解決するのはコンテナ(weblogic/jetty)です。ファイルURIも使用してみましたが、コンテナは常にパスをコンテキストルートからの相対パスとして解釈するようです(つまり、絶対パスはありません)。
だから私の質問は、これを達成するためにweb.xml、サーバー構成、またはSpring構成に任意の種類の構成ディレクティブを追加することは可能ですか?
当然のことながら、weblogicでのこの質問に対する答えは仮想ディレクトリです。このディレクティブは、URLを提供される(通常は静的ファイル)のセットにマッピングする標準的な動作の両方(私が考えるもの)を提供しますが、パスがWEB-INFの下にある場合は「仮想ソフトリンク」としても機能します。そのようなURLをブラウザー経由で要求した場合でも、404を与えるという望ましい動作が提供されます(これを初めて試したときに、何かを誤って構成したと思います)。したがって、以下は望ましい動作を生成します。
<virtual-directory-mapping>
<local-path>/absolute/path/outside/of/webapp</local-path>
<url-pattern>/WEB-INF/foo/*</url-pattern>
</virtual-directory-mapping>
Jettyでも同様の機能を発見しました。これは、構成で複数の「基本リソース」を指定することによって実現されます。説明といくつかの例を提供する いくつかの桟橋のドキュメント があります。 1つの機能(状況に応じて、これは有用であり、有害であることがわかります)は、構造がマージされるため、パスが衝突する可能性があり、指定順に解決されます。桟橋の上記の例:
<Set name="baseResource">
<New class="org.mortbay.resource.ResourceCollection">
<Arg>
<Array type="Java.lang.String">
<Item>/path/to/normal/webapp</Item>
<Item>/absolute/path/outside/of/webapp</Item>
</Array>
</Arg>
</New>
</Set>
これらの両方の1つの落とし穴は、正しく機能するために、ディレクトリ構造を外部ディレクトリに再作成する必要があることです(つまり、/ abstract/path/outside/of/webapp/WEB-INF/fooである必要があります)。あるディレクトリを別の任意の名前のディレクトリにマップする方法はありません。