【问题标题】: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再次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          相关资源
          最近更新 更多