2012-07-10 22 views
12

Jetty ile birden çok statik dizin kullanmak için. Sunucu çalışması için: bir X/V yerleştirilirBirden fazla kaynak dizini ekle jetty

http://localhost:8282/A 
    http://localhost:8282/B 
    http://localhost:8282/C 
  • /A
  • B S/Z yerleştirilir/B
  • Cı P yerleştirilir/T/C

başarısız aşağıdaki:

ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setWelcomeFiles(new String[]{"index.html"}); 
    resource_handler.setResourceBase(HTML_SITE); 

    ResourceHandler resource_handler1 = new ResourceHandler(); 
    resource_handler1.setWelcomeFiles(new String[]{"index.html"}); 
    resource_handler1.setResourceBase(HTML_CLIENTZONE_SITE); 

    // deploy engine 
    WebAppContext webapp = new WebAppContext(); 

    String dir = System.getProperty("user.dir"); 
    webapp.setResourceBase(getWebAppPath()); 
    webapp.setContextPath("/"); 


    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[]{resource_handler,resource_handler1 ,webapp, new DefaultHandler()}); 
    server.setHandler(handlers); 

nasıl ekleyebilir birden fazla statik kaynak dizini? Bir parçası olabilir ki,

Server server = new Server(8282); 
WebAppContext context = new WebAppContext(); 
context.setContextPath("/"); 
ResourceCollection resources = new ResourceCollection(new String[] { 
    "project/webapp/folder", 
    "/root/static/folder/A",  
    "/root/static/folder/B",  
}); 
context.setBaseResource(resources); 
server.setHandler(context); 
server.start(); 

sonradan (örneğin WebAppContext) ServletContext kullanın dosyasını açmak için:

cevap

16

6.1.12 beri bu WebAppContext baz kaynağına ResourceCollection kullanılarak desteklenir arayüz tanımı, örneğin,

/** 
    * Opens a file using the servlet context. 
    */ 
    public default InputStream open(ServletContext context, String filename) { 
    String f = System.getProperty("file.separator") + filename; 
    return context.getResourceAsStream(f); 
    } 

gibi:

InputStream in = open(context, "filename.txt"); 

Bu, belirtilen dizinlerden birinde mevcutsa filename.txt'u açacaktır. getResourceAsStream null dönmek yerine bir istisna olacağını unutmayın, bu nedenle bunun için kontrol etmek iyi bir fikirdir:

return validate(context.getResourceAsStream(filename), filename); 
2

İsterseniz şu şekildedir:

public default InputStream validate(InputStream in, String filename) 
    throws FileNotFoundException { 
    if(in == null) { 
     throw new FileNotFoundException(filename); 
    } 

    return in; 
    } 

Sonra open yöntemini güncelleyebilir Bağımsız kaynak dizinleri, sunucu ad alanında rasgele URI'lere "mount etmek" için, DefaultServlet'un birden çok örneğini bağımsız resourceBase yapılandırmalarıyla kullanmak en iyi seçimdir.

Server server = new Server(); 
SelectChannelConnector connector = new SelectChannelConnector(); 
connector.setPort(Integer.parseInt(port)); 
server.addConnector(connector); 

ServletContextHandler servletHandler = new ServletContextHandler(null, "/", true, false); 

// Configuration for serving /A/* from X/V/A 
DefaultServlet aServlet = new DefaultServlet(); 
ServletHolder aHolder = new ServletHolder(aServlet); 
aHolder.setInitParameter("resourceBase", "X/V/A"); 
aHolder.setInitParameter("pathInfoOnly", "true"); 
servletHandler.addServlet(aHolder, "/A/*"); 

// Configuration for serving /B/* from Q/Z/B 
DefaultServlet bServlet = new DefaultServlet(); 
ServletHolder bHolder = new ServletHolder(bServlet); 
bHolder.setInitParameter("resourceBase", "Q/Z/B"); 
bHolder.setInitParameter("pathInfoOnly", "true"); 
servletHandler.addServlet(bHolder, "/B/*"); 

HandlerList handlers = new HandlerList(); 
handlers.setHandlers(new Handler[] { servletHandler }); 
server.setHandler(handlers); 

server.start(); 

Not:

şu pasajı dosya yolu Q/Z/B gelen dosya yolu X/V/A ve /B/* gelen URI'ları /A/* hizmet edecek Yukarıdaki koddan görebileceğiniz gibi, gerek yok bu dizinin adı /A/*'un sunulduğu, örneğinizde olduğu gibi tam olarak A'dur. Her iki isim - sunulacak dizinin dosya sistemi adı ve içeriği eşlemek için URI - tamamen bağımsızdır.