-1

私はEclipseプロジェクトの絶対パスを取得しようとしています:だから私はこれを書きます;

   File file= new File("");
   System.out.println(file.getCanonicalPath());
   projectPath=file.getCanonicalPath();

クラスでJavaアプリケーションとして実行すると、正しいパスが得られます C:\Documents and Settings\Administrateur\Bureau\ready code\JavaServerFacesProject

しかし、Web アプリケーションで使用しようとすると、次のようになります。

C:\Documents and Settings\Administrateur\Bureau\eclipse\eclipse

だから、それを行う方法についてのアイデアはどうもありがとう

4

2 に答える 2

1

Web アプリケーションからファイルを読み取ることは、これを行うたびに苦しむ古典的な落とし穴です。

Web アプリ (特に Java EE) は、読み取り/書き込み操作にファイル システムを使用するようには考えられていません。コンテナー (この場合は Tomcat) が必要なリソースを取得する方法を知っているという事実に依存しています。

したがって、基本的なアドバイスは次のとおりです。それをしないでください。

しかし、私は基本的にこの種の回答が嫌いなので、アドバイスをします。

作業ディレクトリを使用しない

作業ディレクトリがどこにあるかはわかりません。多くの場合、実稼働システムでは、Web アプリには作業ディレクトリに書き込む権限がありません。

たとえば、webapp を tomcat サーバーにデプロイし、Windows マシンでサービスとして実行すると、作業ディレクトリは次のようになります。\Windows\System32

たとえば、アップロードされたファイルをそこに書き込みたくありません...

いくつかのオプションがあります。私が好むのは、パスを web-xml に設定し、おそらくサーバー構成から (コンテキストを使用して) オーバーライドすることです。

2 番目のオプションは、Web アプリがアクセスする db テーブルにパスを保存することです。

元:

設定したweb.xmlで

<context-param>
  <description>Uploaded files directory</description>
  <param-name>file-storage</param-name>
  <param-value>c:\app\storage\uploaded</param-value>
</context-param>

次に、server.xml (または、コンテキスト dir を使用して、次のコードを含むファイルをそこに配置することもできます) で、この設定をコンテキストでオーバーライドします。

<Context
    <Parameter
      name="file-storage"
      value="E:\app\storage\uploaded"
      type="java.lang.String"
      override="false" />
</Context>

Tomcat のドキュメントを確認する

3 番目のオプションは、少し幸せな状況で、一時ファイルだけを書きたい場合です。javax.servlet.context.tempdir という名前のサーブレット コンテキスト パラメータとしてアクセスできる webapp 作業ディレクトリがあり ます。

もしあなたがどこにいるなら、私はデータベーステーブルに行きます.

この複雑さはすべて、Tomcat の異なるインスタンス、異なるマシン、さらには異なる Web アプリケーションでさえ、同じアプリの複数のインスタンスを同じインスタンスに持つことができるため、「相対」パスを作成する簡単な方法がないためです。状況。

ほとんどの Web アプリケーションは、そのような必要がある場合はいつでも db でデータをシリアル化する (LOB または同様のオブジェクトを使用する) か、何らかのサービス (FTP、cifs、nfs ...) に依存することを解決します。

于 2012-11-29T13:29:41.143 に答える
1

Eclipse では、[実行構成] ダイアログでプロジェクトの作業ディレクトリを設定できます。

そこにデフォルト以外のものを設定しようとしましたか?

(何も設定できない場合は、ここで提案されている JVM オプションを試すことができます: https://stackoverflow.com/a/7838900/1143126 )

于 2012-11-29T12:22:44.030 に答える