2009-12-10 9 views
9

Ich habe eine Java-Webanwendung, die eine Plugin-Architektur verwendet. Ich würde gerne wissen, ob jemand eine Lösung hat, bei der man ein Servlet mit servvet-Mapping zum servletconfig hinzufügen kann, während die Web-App läuft? Die Idee ist, dass eine Klasse zum Ordner/WEB-INF/classes hinzugefügt und als Servlet aktiviert werden kann, ohne die Web-App neu zu starten. Wenn der Benutzer das "Plug-in" entfernt, muss der Code aus der servletconfig entfernt werden.Dynamisch ein Servlet zur ServletConfig hinzufügen

Antwort

5

Es gibt keine Standard-Servlet-API, um dies zu erreichen.

Sie können dies in Tomcat tun. In Ihrer Webanwendung muss Ihr Master-Servlet (das andere erstellt) ContainerServlet implementieren, damit Sie das Objekt Wrapper erreichen können. Sobald Sie Ihre Klassendatei installiert haben, können Sie folgende Anrufe tätigen:

Diese Anrufe erstellen ein Servlet im laufenden Betrieb. Sie müssen Wege finden, diese Informationen zu erhalten. Sie können dies tun, indem Sie web.xml aktualisieren oder in Ihre eigene Datei schreiben.

+0

Das ist perfekt, vielen Dank. – BigBadOwl

1

Das Hinzufügen und Entfernen von Klassen zu/von einer laufenden Anwendung ist schwierig. Sie können sich für eine kommerzielle Lösung JRebel ansehen.

Wenn Ihre Benutzer nicht sehr lange Konversationen/Sitzungen haben, kann ein Neustart Ihrer Web App möglicherweise schnell genug sein, dass sie nicht bemerken. Wenn dies für Sie funktioniert, wird das Problem ziemlich einfach.

Angenommen, Sie verwenden Tomcat, können Sie Ihren Server mit reloadable=true konfigurieren, und die Anwendung wird neu gestartet, sobald Sie ein neues web.xml in das Verzeichnis webapps werfen. Sie können dem Verzeichnis WEB-INF/classes neue Klassen hinzufügen und dann web.xml aktualisieren, das sollte gut funktionieren. Das Entfernen von Klassen kann schwieriger sein, wenn diese Klassen verwendet werden. Möglicherweise möchten Sie einen 2-Schritt-Prozess ausführen, bei dem Sie zuerst eine web.xml bereitstellen, die nicht mehr an eine bestimmte Servlet-Klasse weiterleitet, dann ein wenig auf Klassenbenutzer warten und dann die Klasse löschen und erneut eine aktualisierte web.xml bereitstellen.

0

Ich glaube nicht, dass Sie das dynamisch machen können, aber Sie könnten versuchen, das Servlet mit einem vorkonfigurierten Filter aktiv oder inaktiv zu machen. Stellen Sie sicher, dass der Filter nach einem Wert sucht, den Sie entweder in einer Datenbank oder im Dateisystem dynamisch ändern können, und geben Sie an, wie die Anforderung umgeleitet werden soll, wenn das Servlet "ausgeschaltet" ist.

Ich denke, es wäre unhöflich, einfach ein Servlet auszuschalten, ohne den Benutzern irgendeine Art von Feedback zu geben.

Verwandte Themen