动态地将servlet添加到servletConfig

我有一个使用插件架构的Java Web应用程序。 我想知道是否有人有一个解决方案,其中一个人可以添加一个servlet,在web应用程序运行时serlvet映射到servletconfig? 这个想法是可以将类添加到/ WEB-INF / classes文件夹中,并在不重新启动Web应用程序的情况下将其作为servlet激活。 同样的性质,如果用户选择删除“插件”,则让代码从servletconfig中删除该类。

没有标准的Servlet API来实现这一目标。

您可以在Tomcat中执行此操作。 在您的webapp中,您的主servlet(创建其他人)必须实现ContainerServlet以便您可以获取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); 

这些调用动态创建一个servlet。 您需要找到保留此信息的方法。 您可以通过更新web.xml或写入您自己的文件来完成此操作。

在正在运行的应用程序中添加和删除类很难。 您可能希望查看JRebel的商业解决方案。

如果您的用户没有很长时间运行的会话/会话,可能会重新启动您的Web应用程序,以便他们不会注意到。 如果这样做会为你做,那么问题就变得非常简单了。

假设您正在运行Tomcat,您可以使用reloadable=true配置服务器,并且每当您将新的web.xml放入webapps目录时它都会重新启动您的应用程序。 您可以将新类添加到WEB-INF/classes目录,然后更新web.xml ,这应该可以正常工作。 如果正在使用这些类,删除类可能会更难。 您可能希望执行两个步骤,首先部署不再路由到给定servlet类的web.xml ,然后等待类用户离开,然后删除该类并重新部署更新的web.xml再次。

我认为你不能动态地做到这一点,但你可能会尝试使用预先配置的filter使servlet处于活动或非活动状态。 使filter检查您可以在数据库或文件系统中动态更改的值,并告诉它如果servlet“关闭”,如何重新路由请求。

我认为在不给用户提供某种反馈的情况下简单地关闭servlet是很粗鲁的。