动态地将servlet添加到servletConfig

时间:2009-12-10 21:52:03

标签: java class web-applications servletconfig

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

3 个答案:

答案 0 :(得分:6)

没有标准的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或写入您自己的文件来完成此操作。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

我认为您不能动态地执行此操作,但您可以尝试使用预先配置的过滤器使servlet处于活动或非活动状态。使过滤器检查您可以在数据库或文件系统中动态更改的值,并告诉它如果servlet被“关闭”,如何重新路由请求。

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