【问题标题】:Dynamically add a servlet to the servletConfig将 servlet 动态添加到 servletConfig
【发布时间】:2010-12-25 10:53:09
【问题描述】:
我有一个使用插件架构的 Java Web 应用程序。我想知道是否有人有一个解决方案,可以在 Web 应用程序运行时添加一个 servlet,并将 servlet 映射到 servletconfig?这个想法是可以将一个类添加到 /WEB-INF/classes 文件夹并作为 servlet 激活,而无需重新启动 Web 应用程序。同样,如果用户选择删除“插件”,则让代码从 servletconfig 中删除该类。
【问题讨论】:
标签:
java
class
web-applications
servletconfig
【解决方案1】:
没有标准的 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 或写入您自己的文件来做到这一点。
【解决方案2】:
我认为您不能动态地执行此操作,但您可以尝试使用预配置的过滤器使 servlet 处于活动或非活动状态。让过滤器检查您可以在数据库或文件系统中动态更改的值,并告诉它在 servlet 被“关闭”时如何重新路由请求。
我认为简单地关闭 servlet 而不给用户某种反馈是不礼貌的。
【解决方案3】:
在正在运行的应用程序中添加和删除类是很困难的。您可能想查看 JRebel 以获得商业解决方案。
如果您的用户没有很长时间运行的对话/会话,那么重新启动您的 Web 应用程序可能会足够快,以至于他们不会注意到。如果这能帮到你,那么问题就变得很简单了。
假设您正在运行 Tomcat,您可以使用reloadable=true 配置您的服务器,只要您将新的web.xml 放入webapps 目录,它就会重新启动您的应用程序。您可以将新类添加到WEB-INF/classes 目录,然后更新web.xml,应该可以正常工作。如果这些类正在使用中,则删除这些类可能会更加困难。您可能需要执行一个两步过程,首先部署一个不再路由到给定 servlet 类的 web.xml,然后等待类用户离开,然后删除该类并重新部署更新的 web.xml再次。