2 Stimmen

Jetty 6: Wie entfernt man ein Servlet?

Ich muss programmatisch ein Servlet auf einem Jetty 6 Server hinzufügen und entfernen. Während das Hinzufügen fast problemlos möglich ist, kann ich keinen effektiven Weg zum Entfernen finden. Für meine Zwecke ist es wichtig, ein Servlet hinzuzufügen und zu entfernen, weil es mit einer dynamischen Inhaltsarchitektur verbunden ist. Ich muss einen neuen Dienst hinzufügen, wenn ich eine Komponente hinzufüge, und ich muss den Dienst entfernen, wenn ich die Komponente entferne.

Um ein Servlet hinzuzufügen, habe ich dieses Muster verwendet:

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
}

Warum ist das Entfernen eines Servlets nicht so offensichtlich? Können Sie mir die Beweggründe erklären?

1voto

jesse mcconnell Punkte 7032

Zunächst einmal würde ich empfehlen, ein Update auf Jetty 7 oder 8, wenn es möglich ist, Jetty 6 ist ziemlich alt an dieser Stelle und fehlt die letzten paar Jahre der Entwicklung, die in 7 und 8 vorhanden sind. heck, Jetty 9 wird aktiv auf jetzt gearbeitet.

Zweitens würde ich dies nicht auf der Servlet-Ebene, sondern auf der Handler-Ebene betrachten, indem ich mit dem Server zusammenarbeite, um Handler hinzuzufügen und zu entfernen, bei denen es sich entweder um statische Ressourcentyp-Handler oder vollwertige Servlet-Kontext-Handler oder sogar Webapp-Kontext-Handler handeln kann.

warum die Servlet-Kontext-Handler nicht haben entfernen Servlet-Typ Operationen, seine wirklich nicht ein Teil der Servlet-Spezifikation zum Entfernen von aktiven Servlets auf dieser Ebene, passt mehr auf die War-Deploy / Undeploy-Ebene. fühlen Sie sich frei, ein Problem auf es zu öffnen, obwohl, ich habe experimentieren mit Hinzufügen und Entfernen auf Servlet-Kontext-Handler-Ebene und Sie können sie entfernen, aber es scheint problematisch zu sein, dann das Hinzufügen von mehr danach, so dass ich vermute, den Kontext selbst zu entfernen und einen neuen hinzufügen wäre Ihre beste Wette an dieser Stelle.

1voto

Tim Punkte 6351

Hier finden Sie eine Anleitung für Jetty 7.

Jetty : Dynamisches Entfernen des registrierten Servlets

Es sollte ziemlich einfach sein, diesen Code auf Jetty 6 zu portieren.

0voto

alexroat Punkte 1617

Diese Lösung scheint zu funktionieren:

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

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X