【问题标题】:Jetty 6: How to remove a Servlet?Jetty 6:如何删除 Servlet?
【发布时间】:2012-03-27 03:14:40
【问题描述】:

我需要以编程方式在 Jetty 6 服务器上添加和删除 servlet。 虽然添加几乎是直截了当的,但我找不到有效的删除方法。 出于我的目的,添加和删除 servlet 很重要,因为它与动态组件体系结构相关联。添加组件时需要添加新服务,删除组件时需要删除服务。

为了添加一个 servlet,我使用了这个模式:

Server server = new Server(8080);

class MyServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {

        resp.getOutputStream().write("Hello World!".getBytes());
    }
}


...


public void addServlet(HttpServlet s, String path)
{
    Context root = new Context(server,"/",Context.SESSIONS);
    root.addServlet(new ServletHolder(new MyServlet()), "/test/*");
    root.getServletHandler().
}
public void removeServlet(HttpServlet s, String path)
{
    //What I have to put here ? There is no removeServlet like methods in server/Context/ServletHolder
}

为什么删除 servlet 不那么明显?你能解释一下动机吗?

【问题讨论】:

    标签: java http servlets jetty


    【解决方案1】:

    这个解决方案似乎有效:

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.mortbay.jetty.Server;
    import org.mortbay.jetty.handler.ContextHandler;
    import org.mortbay.jetty.handler.ContextHandlerCollection;
    import org.mortbay.jetty.handler.ResourceHandler;
    import org.mortbay.jetty.servlet.Context;
    import org.mortbay.jetty.servlet.ServletHandler;
    import org.mortbay.jetty.servlet.ServletHolder;
    import org.mortbay.jetty.servlet.ServletMapping;
    
    public class MyServer extends Server
    {
    
    
        ServletHandler sh = new ServletHandler();
    
    
        public MyServer()
        {
            super(9090);
            setHandler(sh);
            test();
        }
    
    
        class MyServlet extends HttpServlet
        {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;
    
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                    throws ServletException, IOException
            {
                resp.getWriter().println("CIAO!");
            }
        }
    
        void test()
        {
    
    
    
            MyServlet ms = new MyServlet();
    
            addServlet(ms, "/ciao/*");
    
            //removeServlet(ms);//uncomment this ilne in order to remove the servlet right after the deploy
    
        }
    
        public void addServlet(HttpServlet s, String path)
        {
            sh.addServletWithMapping(new ServletHolder(s), path);
    
    
            for (ServletHolder so : sh.getServlets())
                try
                {
                    System.out.println((so.getServlet() == s));
                } catch (ServletException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
        }
    
    
        public void removeServlet(HttpServlet s)
        {
            try
            {
                HashSet<String> names = new HashSet<String>();
                for (ServletHolder so : sh.getServlets())
                    if (so.getServlet() == s)
                        names.add(so.getName());
    
                HashSet<ServletMapping> sms = new HashSet<ServletMapping>();
                for (ServletMapping sm : sh.getServletMappings())
                {
                    if (!names.contains(sm.getServletName()))
                        sms.add(sm);
                }
    
                sh.setServletMappings(sms.toArray(new ServletMapping[] {}));
            } catch (ServletException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      这是在 Jetty 7 上执行此操作的说明。

      Jetty : Dynamically removing the registered servlet

      将代码移植到 Jetty 6 应该非常简单。

      【讨论】:

      • 谢谢,我使用了为 Jetty 6 调整的相同方法
      【解决方案3】:

      首先,如果可能的话,我建议更新到 jetty 7 或 8,jetty 6 在这一点上已经很老了,并且缺乏最近几年在 7 和 8 中的发展。哎呀,jetty 9 正在积极现在开始工作了。

      其次,我不会在 servlet 级别而是在处理程序级别上查看它,与服务器一起添加和删除处理程序,这些处理程序可以是静态资源类型处理程序或完整的 servlet 上下文处理程序,甚至是 webapp 上下文处理程序.

      至于为什么 servlet 上下文处理程序没有删除 servlet 类型的操作,它实际上不是 servlet 规范的一部分,用于删除该级别的活动 servlet,更适合战争部署/取消部署级别。不过,请随意打开一个问题,我确实尝试在 servlet 上下文处理程序级别添加和删除,您可以删除它们,但它似乎有问题,然后添加更多,所以我怀疑删除上下文本身并添加一个新的这将是您目前最好的选择。

      【讨论】:

      • 由于项目限制,我无法搬到 7 或 8 号码头……无论如何,谢谢。
      • 一开始我实际上使用了处理程序,无论如何,为了提供与现有解决方案的交叉兼容性,我需要迁移到标准 java servlet。
      猜你喜欢
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 2010-10-27
      • 2012-03-25
      • 2016-10-14
      • 2012-04-10
      • 2021-12-25
      相关资源
      最近更新 更多