2013-11-26 37 views
10

我正嘗試創建一個嵌入式碼頭服務器,它既有一個用於提供某些動態數據的自定義servlet,也有用於提供某些圖像的默認servlet。我有自定義的servlet工作,但我不知道如何添加默認的servlet來提供圖像文件。在嵌入式Jetty中從替代路徑提供靜態文件

這是我...

private void setUpServer(ServerOptions options){ 
    s = new Server(options.getPort()); 
    this.options = options; 
    context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    context.setContextPath("/"); 
    s.setHandler(context); 
    context.addServlet(new ServletHolder(new DataServlet()), "/data/*"); 
    context.addServlet(new ServletHolder(new DefaultServlet()), "/pictures/*"); 
} 

我無法弄清楚如何將DefaultServlet配置爲一個文件服務器的工作,而且還有自定義DataServelet仍然有效。

有沒有人有任何想法?

回答

28

你需要什麼:

  1. 一個DefaultServlet以「/」(推薦,這是Servlet規範的要求)
    • 這應該是「默認」的命名調度程序(另一項要求Servlet規範)的
  2. 一種替代DefaultServlet與自定義的靜態內容,通過INIT-PARAMS配置
    • 使用除「默認」不同的命名調度(避免其他Servlet規範特徵之間的名稱衝突)
    • 可以使用ServletHolder.setInitParameter(name,value)來完成這個
    • 確保您的pathInfoOnly參數設置爲true(避開「默認」指定調度員的特殊情況)
  3. 您自己的servlet,提供動態內容。

AltDefaultServlet.java

package jetty.demo; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.ServerConnector; 
import org.eclipse.jetty.servlet.DefaultServlet; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 

public class AltDefaultServlet 
{ 
    public static void main(String[] args) 
    { 
     System.setProperty("org.eclipse.jetty.LEVEL","INFO"); 

     Server server = new Server(); 
     ServerConnector connector = new ServerConnector(server); 
     connector.setPort(8080); 
     server.addConnector(connector); 

     // The filesystem paths we will map 
     String homePath = System.getProperty("user.home"); 
     String pwdPath = System.getProperty("user.dir"); 

     // Setup the basic application "context" for this application at "/" 
     // This is also known as the handler tree (in jetty speak) 
     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     context.setResourceBase(pwdPath); 
     context.setContextPath("/"); 
     server.setHandler(context); 

     // add a simple Servlet at "/dynamic/*" 
     ServletHolder holderDynamic = new ServletHolder("dynamic", DynamicServlet.class); 
     context.addServlet(holderDynamic, "/dynamic/*"); 

     // add special pathspec of "/home/" content mapped to the homePath 
     ServletHolder holderHome = new ServletHolder("static-home", DefaultServlet.class); 
     holderHome.setInitParameter("resourceBase",homePath); 
     holderHome.setInitParameter("dirAllowed","true"); 
     holderHome.setInitParameter("pathInfoOnly","true"); 
     context.addServlet(holderHome,"/home/*"); 

     // Lastly, the default servlet for root content (always needed, to satisfy servlet spec) 
     // It is important that this is last. 
     ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class); 
     holderPwd.setInitParameter("dirAllowed","true"); 
     context.addServlet(holderPwd,"/"); 

     try 
     { 
      server.start(); 
      server.dump(System.err); 
      server.join(); 
     } 
     catch (Throwable t) 
     { 
      t.printStackTrace(System.err); 
     } 
    } 

} 
+0

這完美地工作。謝謝!!!!!!!!! – user3034643

+0

這個作品...幾經浪費了幾個小時終於。謝謝!!! – thisarattr

+0

這解決了我的問題與嵌入式Jetty版本9.4,謝謝@Joakim Erdfelt –