0

JSPページからJavaアプリケーションを実行しています。JavaアプリがSystem.outに出力するすべてのものを私のページにリダイレクトすることは可能ですか?

編集: main関数を含む パッケージpkgがあります。この関数には多くのSystem.out.println呼び出しがあります。例えば

package pkg;
public class pkg {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

私のindex.jspでは、次のように呼び出します。

<%
    pkg.pkg.main(new String[] {});
%>

pkg.pkg.mainがページに印刷するすべてのものを確認する必要があります。例えば

Hello
4

3 に答える 3

2

単純なアプローチは、適切にラップされた応答出力ストリームを使用してSystem.setOut()を呼び出すことです。ただし、異なるスレッドからの出力に違いがないため、複数の同時リクエストが開始されると、これは機能しません。

pkgmain()各リクエストでメソッドを呼び出す前に、レスポンスの出力ストリームに設定した別のスレッドローカル出力ストリームに委任する独自の出力ストリームサブクラスを作成できます。追加のスレッドを生成する場合、このアプローチは機能しない可能性があります(ただし、この場合はInheritableThreadLocalpkgmain()を使用してみることができます)。

于 2012-05-26T12:33:15.090 に答える
1

呼び出されたクラスのコードをリファクタリングして、引数としてWriterを取り、System.outではなくこのWriterに出力します。

package pkg;
public class pkg {
    public static void main(String[] args) {
        main(new OutputStreamWriter(System.out), args);
    }

    public static void main(Writer writer, String[] args) {
        PrintWriter out = new PrintWriter(writer);
        out.println("Hello");
    }
}

そして、JSP(サーブレットである必要があります)からこの2番目のメインメソッドを呼び出します。

<%
    pkg.main(out, new String[] {});
%>
于 2012-05-26T12:40:51.750 に答える
0

実行するクラスのソースコードを編集できない場合の別のアプローチは、コマンドプロンプトで実行するのと同じようにRuntime#exec()、コマンドを使用してプログラムでクラスを実行し、そのstdout(およびstderr)をキャプチャすることです。 java!)によってProcess

Process process = Runtime.getRuntime().exec("java -cp /path/to/your/pkg pkg.pkg");
InputStream stdout = process.getInputStream();
InputStream stderr = process.getErrorStream();
// Read and write it to response.getOutputStream() the usual way.

これまで実際に使用したことがない場合は、このよく知られたJavaWorldの記事(4ページすべて)を読んで、その警告を学び、理解することRuntime#exec()を強くお勧めします。

最後になりましたが、Java / JSPコードは、Webブラウザが実行される場所(クライアント側)ではなく、Webサーバーが実行されるマシン(サーバー側)で物理的に実行され、WebサーバーのJavaランタイムセキュリティマネージャーが許可する必要があることに注意してください。 Webアプリ内から実行Runtime#exec()します。このアプリをセキュリティマネージャーを制御できないサードパーティのホストにデプロイする場合は、Runtime#exec()通話がブロックされてスローされる可能性が高くなりますSecurityException

言うまでもなく、これはすべてかなり臭いです。これらのクラスがユーザー制御のコードに関係している場合は、おそらく巨大なセキュリティエクスプロイトの穴を開いていることになります。

于 2012-05-28T16:32:29.127 に答える