Причал 6: Как удалить сервлет? - PullRequest
1 голос
/ 09 марта 2012

Мне нужно программно добавить и удалить сервлет на сервере Jetty 6.Хотя это почти просто добавить, я не могу найти эффективный способ удаления.Для моих целей важно добавлять и удалять сервлет, потому что он связан с динамической компонентной архитектурой.Мне нужно добавить новый сервис, когда я добавляю компонент, и мне нужно удалить сервис, когда я удаляю компонент.

Чтобы добавить сервлет, я использовал этот шаблон:

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
}

Почемуудаление сервлета не так очевидно?Можете ли вы объяснить мне мотивы?

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Вот инструкции для этого на Jetty 7.

Причал: динамическое удаление зарегистрированного сервлета

Должно быть довольно просто перенести этот код на Jetty 6.

1 голос
/ 10 марта 2012

Прежде всего, я бы порекомендовал обновить до пристани 7 или 8, если это возможно, причал 6 довольно стар в этот момент и ему не хватает последних двух лет разработки, которые присутствуют в 7 и 8. Черт, мол 9 активно работал сейчас.

во-вторых, я бы не стал рассматривать это на уровне сервлетов, но на уровне обработчиков, работая с сервером для добавления и удаления обработчиков, которые могут быть либо статическими обработчиками типа ресурса, либо полноценными обработчиками контекста сервлета, либо даже обработчиками контекста webapp .

относительно того, почему обработчики контекста сервлета не имеют операций удаления типа сервлета, это действительно не является частью спецификации сервлета для удаления активных сервлетов на этом уровне, больше подходит для уровня развертывания / отмены развертывания war. не стесняйтесь, чтобы открыть проблему по этому вопросу, хотя я экспериментировал с добавлением и удалением на уровне обработчика контекста сервлета, и вы можете удалить их, но это кажется проблематичным, тогда добавляя больше потом, поэтому я подозреваю, что удаление самого контекста и добавление нового будет вашим лучшим выбором на данный момент.

0 голосов
/ 20 марта 2012

Похоже, это решение работает:

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

}
...