2012-03-09 39 views
1

我需要以編程方式添加和刪除Jetty 6服務器上的servlet。 雖然它幾乎直接添加我找不到有效的方法來刪除。 對我而言,添加和刪除servlet非常重要,因爲它與動態組件體系結構相關聯。當我添加一個組件時,我需要添加一項新服務,而當我刪除該組件時,我需要刪除該服務。碼頭6:如何刪除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就不那麼明顯了?你能向我解釋動機嗎?

回答

1

首先我會建議更新到碼頭7或8,如果可能的話,碼頭6在這一點上是相當古老的,並且缺乏在7和8中出現的最後幾年的發展。嘿,碼頭9正在積極努力。

秒我不會在servlet級別看這個,但處理程序級別與服務器一起使用來添加和刪除處理程序,它可以是靜態資源類型處理程序,也可以是完全成熟的servlet上下文處理程序,甚至是webapp上下文處理程序。

至於爲什麼servlet上下文處理程序沒有刪除servlet類型操作,它實際上不是servlet規範的一部分,用於刪除該級別的活動servlet,更適合於war部署/ undeploy級別。儘管我可以自由地開啓一個問題,但我嘗試過在servlet上下文處理程序級別添加和刪除,並且可以刪除它們,但似乎有問題,之後再添加更多,所以我懷疑刪除上下文本身並添加一個新的在這一點上將是你最好的選擇。

+2

對於項目限制,我不能移動到碼頭7或8 ......無論如何感謝。 – alexroat 2012-03-20 13:22:10

+0

在開始時我實際上使用了處理程序,爲了提供與現有解決方案的交叉兼容性,我需要移動到標準的java servlet。 – alexroat 2012-03-20 13:23:41

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

}