Jetty 6:如何删除Servlet?

时间:2012-03-09 16:57:28

标签: java http servlets jetty

我需要以编程方式在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不是那么明显?你能解释一下我的动机吗?

3 个答案:

答案 0 :(得分:1)

首先我会建议更新到7号或8号码头,如果可能的话,码头6在这一点上相当老,并且缺少7和8中出现的最近几年的发展。哎,码头9正在积极现在就工作了。

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

为什么servlet上下文处理程序没有删除servlet类型操作,它实际上不是删除该级别的活动servlet的servlet规范的一部分,更适合于war deploy / undeploy级别。随便在它上面打开一个问题,我确实尝试在servlet上下文处理程序级别添加和删除它们你可以删除它们但是它似乎有问题然后添加更多,所以我怀疑删除上下文本身并添加一个新的这是你最好的选择。

答案 1 :(得分:1)

以下是在Jetty 7上进行此操作的说明。

Jetty : Dynamically removing the registered servlet

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

答案 2 :(得分:0)

这个解决方案似乎有效:

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

}