2012-07-10 25 views
12

Tìm cách sử dụng nhiều thư mục tĩnh với Jetty. Khi chạy server:Thêm nhiều hơn một thư mục tài nguyên vào cầu cảng

http://localhost:8282/A 
    http://localhost:8282/B 
    http://localhost:8282/C 
  • A được đặt trong X/V/A
  • B được đặt trong Q/Z/B
  • C được đặt trong P/T/C

Sau đây thất bại:

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

Làm thế nào tôi có thể thêm nhiều hơn một thư mục tài nguyên tĩnh?

Trả lời

16

Kể từ 6.1.12, điều này được hỗ trợ bằng cách sử dụng một ResourceCollection đến nguồn gốc của WebAppContext:

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

sau đó Để mở một tập tin, sử dụng ServletContext (ví dụ, WebAppContext), mà có thể là một phần của một định nghĩa giao diện, chẳng hạn như:

/** 
    * 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); 
    } 

chẳng hạn như:

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

Thao tác này sẽ mở ra filename.txt nếu nó tồn tại ở một trong các thư mục đã cho. Lưu ý rằng getResourceAsStream sẽ trở lại null, chứ không phải ném một ngoại lệ, vì vậy nó là một ý tưởng tốt để kiểm tra cho nó:

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

    return in; 
    } 

Sau đó, bạn có thể cập nhật các phương pháp open như sau:

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

Nếu bạn muốn để "gắn kết" các thư mục tài nguyên độc lập với các URI tùy ý trong không gian tên máy chủ, sử dụng nhiều phiên bản của DefaultServlet với các cấu hình độc lập resourceBase là lựa chọn tốt nhất.

Đoạn sau đây sẽ phục vụ các URI /A/* từ đường dẫn hệ thống tập tin X/V/A/B/* từ đường dẫn hệ thống tập tin Q/Z/B:

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

Lưu ý: Như bạn có thể nhìn thấy từ đoạn mã trên, không có nhu cầu mà tên của thư mục từ đó /A/* được phục vụ chính xác là A như trong ví dụ của bạn. Cả hai tên - tên hệ thống tệp của thư mục để phân phối và URI để ánh xạ nội dung đến - hoàn toàn độc lập.

Các vấn đề liên quan