0

私は tomcat/サーブレットの初心者で、ここ 3/4 日間これに固執しています。どんな助けでも大歓迎です!静的変数 name_print を持つサーブレット クラスがあります。静的関数 appInput は文字列を受け取り、name_print をその文字列に設定します。このクラス appmonitor.java のコードは次のとおりです。

パッケージ AppMonitor_pack;

インポートステートメント...

private static String name_print;
public app_monitor() {
    // TODO Auto-generated constructor stub
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TOsDO Auto-generated method stub

}

public static void appInput (String name){
    name_print = name;
    System.out.println("From appInput " + name_print);
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    PrintWriter writer = resp.getWriter();
    writer.println("<body> "+ name_print +" </body>");
}

}

この単純なプロジェクトを Sockets という別のプロジェクトに含めました。その中に、name という文字列を受け取る Listening ソケットがあります。最初のプロジェクトの静的関数 appInput を呼び出し、受け取った文字列名をそれに渡し、name_print をこの新しい値に設定します。

これに関連する Socket.java の行は次のとおりです。 app_monitor.appInput(name);

これをコンパイルして実行すると、値の名前が入力値「abc」に設定されていることがわかります。次に、デバッガーは別のプロジェクトの appInput 関数に入り、name_print の値も "abc" に設定します。

しかし、Tomcat サーバーが実行されている Web ページを更新すると、新しく設定された name_print の値は表示されず、appMonitor サーブレット クラスが初めて読み込まれたときに設定された古い値「null」が引き続き表示されます。

私は問題を解決しようとしましたが、4日間役に立ちませんでした。アイデア/ヘルプはありますか?ありがとう!

4

1 に答える 1

1

これをコンパイルして実行すると、値の名前が入力値「abc」に設定されていることがわかります。次に、デバッガーは別のプロジェクトの appInput 関数に入り、name_print の値も "abc" に設定します。

これをTomcatとは別に実行しているようです。つまり、2 つの異なるクラスローダがあるだけでなく、たまたま同じコンピュータ上で実行される 2 つの完全に別個の JVM があるということです。静的変数は、これらのプロセス間で共有されることはありません。

何を達成しようとしているのかは明確ではありませんが、あるプロセスからの情報を別のプロセスで利用できるようにする場合は、プロセス間通信を使用するか、単なる静的変数よりもグローバルなものを共有する必要があります- たとえば、あるプロセス内でファイルにデータを書き込み、別のプロセスでファイルからデータを読み取ります。

于 2012-12-27T00:42:10.350 に答える