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