动态添加servlet到servletConfig

发布于 2024-08-13 19:25:37 字数 219 浏览 12 评论 0原文

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

I have a Java web application that uses a plugin architecture. I would like to know if anyone has a solution where by one could add a servlet, with serlvet mapping to the servletconfig while the web app is running? The idea being that a class could be added to the /WEB-INF/classes folder and be made active as a servlet without restarting the web app. By the same nature, if the user chooses to remove the "plugin" then have the code remove the class from the the servletconfig.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

聆听风音 2024-08-20 19:25:37

没有标准的 Servlet API 可以完成此任务。

您可以在 Tomcat 中执行此操作。在您的 Web 应用程序中,您的主 Servlet(创建其他 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 或写入您自己的文件来完成此操作。

There is no standard Servlet API to accomplish this.

You can do this in Tomcat. In your webapp, your master servlet (the one creates others) must implements ContainerServlet so you can get hold of the Wrapper object. Once you have your class file installed, you can make following calls,

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);

These calls create a servlet on the fly. You need to find way to persist this information. You can do this by updating web.xml or write to your own file.

川水往事 2024-08-20 19:25:37

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

如果您的用户没有运行很长时间的对话/会话,则您的 Web 应用程序的重新启动可能会足够快,以至于他们不会注意到。如果这对你有用,那么问题就变得很简单了。

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

Adding and removing classes to/from a running application is hard. You may want to look at JRebel for a commercial solution.

If your users don't have very long running conversations/sessions, possibly a restart of your Web app can be quick enough that they won't notice. If this will do it for you, then the problem becomes pretty easy.

Assuming you're running Tomcat, you can configure your server with reloadable=true and it will restart your app whenever you throw a new web.xml into the webapps directory. You can add new classes to the WEB-INF/classes directory and then update web.xml, that should work fine. Removing classes may be harder if those classes are in use. You may want to do a 2 step process where you first deploy a web.xml that no longer routes to a given servlet class, then wait a bit for class users to go away, and then delete the class and redeploy an updated web.xml again.

鸩远一方 2024-08-20 19:25:37

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

我认为简单地关闭 servlet 而不向用户提供某种反馈是不礼貌的。

I don't think you can do that dynamically, but you might try making the servlet active or inactive using a filter that's preconfigured. Make the filter check for a value that you can alter dynamically, in either a database or the file system, and tell it how to reroute the request if the servlet is "turned off."

I think it'd be rude to simply turn off a servlet without giving users some kind of feedback.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文