我有一个使用插件架构的 Java Web 应用程序。我想知道是否有人有一个解决方案,可以在 Web 应用程序运行时添加一个 servlet,并将 servlet 映射到 servletconfig?这个想法是可以将一个类添加到 /WEB-INF/classes 文件夹并作为 servlet 激活,而无需重新启动 Web 应用程序。同样,如果用户选择删除“插件”,则让代码从 servletconfig 中删除该类。
3 回答
没有标准的 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
,这应该可以正常工作。如果这些类正在使用中,则删除这些类可能会更加困难。您可能希望执行 2 步过程,首先部署web.xml
不再路由到给定 servlet 类的类,然后等待类用户离开,然后删除类并重新部署更新的类web.xml
。
我不认为你可以动态地做到这一点,但你可以尝试使用预先配置的过滤器使 servlet 处于活动状态或非活动状态。使过滤器检查您可以在数据库或文件系统中动态更改的值,并告诉它如果 servlet “关闭”时如何重新路由请求。
我认为在不给用户某种反馈的情况下简单地关闭一个 servlet 是不礼貌的。