2

Tomcat にデプロイされた非常に単純な Java Web アプリケーションがあります。

このアプリケーションには、次のようなコードがあります。

package com.mywebapp.hello;

import javax.servlet.http.*;
import java.io.*;

public class PdfTwoServlet extends HttpServlet {

    public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {

        httpServletResponse.setContentType("application/pdf");
        InputStream is = PdfTwoServlet.class.getResourceAsStream("/two.pdf");

コードをコンパイルして tomcat にデプロイすると、ディレクトリ構造は次のようになります。

これは、たとえば C:\Tomcat\webapps\myApplication の下にあります。

ここに画像の説明を入力

そう

PdfTwoServlet.class.getResourceAsStream("/two.pdf");

正常に動作し、classes フォルダーの下にあるファイル two.pdf を見つけますが、これがどのように機能するのかわかりません。

ここでプログラムによって JSF アプリケーションのプロパティ ファイルにアクセスすると、 BalusC は次のように述べています。

Class#getResourceAsStream() は、開始点として使用しているクラスの場所に相対的なパスを取ることができます。/foo/filename.properties を使用すると、実際にはクラスパス ルートから foo/filename.properties がロードされます。

2 つの質問があります。

1) クラスパスのルートが WEB-INF\classes フォルダーであるのはなぜですか? どこで決まる?(私が理解している限り、私が言ったようにコードがうまく機能しているからでしょう。)

これによると:http://docs.oracle.com/javase/tutorial/essential/environment/paths.html、ローカルマシンにクラスパスが設定されていません。それで、Tomcatを起動すると、クラスパスが設定されるのでしょうか? しかし、デプロイされている Web アプリはほとんどなく、クラスパスもほとんどありませんか?

2) PdfTwoServlet.class.getResourceAsStreamの代わりに、これを機能させるより良い方法はありますか? getClassPath().getResourceAsStrem のようなものですか?

編集:経験豊富で英語が上手な人がこの質問のタイトルを編集できるかもしれません。それで十分かどうかはわかりません。

4

1 に答える 1

2

1) サーブレット アプリケーションのクラスパス ルートは、仕様により、jar の WEB-INF\classes フォルダーと、その WAR の WEB-INF/lib 内のすべての jar のルートです。これらの場所にあるものはすべて、クラスパスのルートと見なされます。

Tomcat のクラスパスがどのように機能するかについての質問については、Tomcat がデプロイされると、クラスパスが次のように設定されます。各 WAR は、WEB-INF/classes および WEB-INF/lib のすべての jar にアクセスできる個別のクラス ローダーに対応します。

デフォルトでは、検索されたリソースがここに見つからない場合、tomcat/lib ディレクトリで検索されます。そこに見つからない場合は、親クラスローダーなどに問い合わせます。説明はここにあります

複数の Web アプリがデプロイされている場合、各 WAR には、独自の WEB-INF/classes および WEB-INF/lib jar を指す独自のクラス ローダーがあります。

2) getClasspath() のようなメソッドがない場合、ServletContext.getResourceAsStream() は、サーブレット アプリケーションで WAR 内からリソースを取得するための推奨される方法です。WAR は圧縮または展開されている可能性があり、これは両方で機能します。この回答を参照してください。

于 2013-10-22T21:24:05.503 に答える