I created and started jetty server with WebAppContext. I can also add servlet to the WebAppContext with addServlet method. But I want to dynamically remove this servlet. How can I do this ? Something like removeServlet() is not provided in the WebAppContext.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
You need to do it manually (there probably should be a convenience method, but there isn't)
In Jetty 7 it would be something like (untested):
public void removeServlets(WebAppContext webAppContext, Class<?> servlet)
{
ServletHandler handler = webAppContext.getServletHandler();
/* A list of all the servlets that don't implement the class 'servlet',
(i.e. They should be kept in the context */
List<ServletHolder> servlets = new ArrayList<ServletHolder>();
/* The names all the servlets that we remove so we can drop the mappings too */
Set<String> names = new HashSet<String>();
for( ServletHolder holder : handler.getServlets() )
{
/* If it is the class we want to remove, then just keep track of its name */
if(servlet.isInstance(holder.getServlet()))
{
names.add(holder.getName());
}
else /* We keep it */
{
servlets.add(holder);
}
}
List<ServletMapping> mappings = new ArrayList<ServletMapping>();
for( ServletMapping mapping : handler.getServletMappings() )
{
/* Only keep the mappings that didn't point to one of the servlets we removed */
if(!names.contains(mapping.getServletName()))
{
mappings.add(mapping);
}
}
/* Set the new configuration for the mappings and the servlets */
handler.setServletMappings( mappings.toArray(new ServletMapping[0]) );
handler.setServlets( servlets.toArray(new ServletHolder[0]) );
}