2012-03-09 4 views
1

Мне нужно программно добавить и удалить сервлет на сервере Jetty 6. В то время как добавить почти невозможно, я не могу найти эффективный способ удаления. Для моих целей важно добавить и удалить сервлет, потому что он связан с динамической архитектурой componenttent. Мне нужно добавить новый сервис, когда я добавляю компонент, и мне нужно удалить службу, когда я удаляю компонент.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 
} 

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

ответ

1

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

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

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

+2

Для ограничений проекта я не могу перейти на пристань 7 или 8 ... Спасибо в любом случае. – alexroat

+0

В начале я использовал обработчиков, так или иначе, чтобы обеспечить кросс-совместимость с существующими решениями. Мне нужно перейти на стандартные сервлеты Java. – alexroat

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

} 
Смежные вопросы