2013-11-26 1 views
10

Я пытаюсь создать встроенный сервер причала как с помощью специального сервлета, обслуживающего некоторые динамические данные, так и по умолчанию, который будет обслуживать некоторые изображения. У меня работает пользовательский сервлет, но я не могу понять, как добавить сервлет по умолчанию для обслуживания файлов изображений.Обслуживать статические файлы из альтернативного пути во встроенном 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. A DefaultServlet на "/" (рекомендуется, это является требованием сервлета спецификации)
    • это должно быть по имени диспетчеру "по умолчанию" (другое требование из сервлета спецификации)
  2. альтернативного DefaultServlet с вашим пользовательским статическим контентом, сконфигурированное с помощью инициализации-Params
    • Использование другого имени диспетчера, чем «по умолчанию» (чтобы избежать столкновения имен между другими функциями сервлета спецификации)
    • Вы можете использовать ServletHolder.setInitParameter(name,value) для достижения этой цели
    • Убедитесь, что вы установили параметр pathInfoOnly в true (чтобы обойти специальные случаи для «дефолтных» названных диспетчеров)
  3. Сервлет, обслуживающий динамический контент.

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 –