9

プラグイン アーキテクチャを使用する Java Web アプリケーションがあります。Webアプリの実行中にサーブレットをservletconfigにマッピングして、サーブレットを追加できるソリューションを誰かが持っているかどうか知りたいですか? クラスを /WEB-INF/classes フォルダーに追加し、Web アプリを再起動せずにサーブレットとしてアクティブにできるという考えです。同様に、ユーザーが「プラグイン」を削除することを選択した場合は、コードで servletconfig からクラスを削除します。

4

3 に答える 3

5

これを実現する標準のサーブレット API はありません。

これは Tomcat で行うことができます。ContainerServletWeb アプリケーションでは、オブジェクトを取得できるように、マスター サーブレット (他のサーブレットを作成するサーブレット) を実装する必要がありWrapperます。クラスファイルをインストールしたら、次の呼び出しを行うことができます。

Context context = (Context) wrapper.getParent();
Wrapper newWrapper = context.createWrapper();
newWrapper.setName(name);
newWrapper.setLoadOnStartup(1);
newWrapper.setServletClass(servletClass);
context.addChild(newWrapper);
context.addServletMapping(pattern, name);

これらの呼び出しは、その場でサーブレットを作成します。この情報を保持する方法を見つける必要があります。これを行うには、web.xml を更新するか、独自のファイルに書き込みます。

于 2009-12-11T01:47:39.687 に答える
1

実行中のアプリケーションにクラスを追加したり、アプリケーションからクラスを削除したりするのは困難です。商用ソリューションについては、JRebelを参照してください。

ユーザーが会話やセッションを長時間実行していない場合は、Web アプリの再起動がすぐに完了して気付かない可能性があります。これで問題が解決する場合、問題は非常に簡単になります。

Tomcat を実行していると仮定すると、サーバーを構成することができ、ディレクトリreloadable=trueに新しいものをスローするたびにアプリが再起動されます。新しいクラスをディレクトリに追加してから更新できます。これは正常に機能するはずです。それらのクラスが使用されている場合、クラスを削除するのは難しいかもしれません。最初に特定のサーブレット クラスにルーティングされなくなった をデプロイし、クラスのユーザーが離れるのを少し待ってから、クラスを削除して更新された を再度デプロイするという 2 段階のプロセスを実行することをお勧めします。web.xmlwebappsWEB-INF/classesweb.xmlweb.xmlweb.xml

于 2009-12-10T22:52:20.817 に答える
0

これを動的に行うことはできないと思いますが、事前に構成されたフィルターを使用して、サーブレットをアクティブまたは非アクティブにしてみてください。データベースまたはファイル システムのいずれかで動的に変更できる値をフィルター チェックし、サーブレットが「オフ」になっている場合に要求を再ルーティングする方法を指定します。

ユーザーになんらかのフィードバックを提供せずにサーブレットをオフにするのは失礼だと思います。

于 2009-12-10T23:46:34.393 に答える