13

Jetty で複数の静的ディレクトリを使用しようとしています。サーバーの実行時:

  http://localhost:8282/A
  http://localhost:8282/B 
  http://localhost:8282/C
  • A は X/V/A に配置されます
  • B は Q/Z/B に配置されます
  • C は P/T/C に配置されます

以下は失敗しました:

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

複数の静的リソース ディレクトリを追加するにはどうすればよいですか?

4

2 に答える 2

18

6.1.12 以降、これは ResourceCollection を 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();

後でファイルを開くには、ServletContext (WebAppContext など) を使用します。これは、次のようなインターフェイス定義の一部である可能性があります。

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

そのような:

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

filename.txtこれは、指定されたディレクトリのいずれかに存在する場合に開きます。getResourceAsStream はnull、例外をスローするのではなく、 を返すことに注意してください。そのため、確認することをお勧めします。

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

    return in;
  }

openその後、次のようにメソッドを更新できます。

return validate( context.getResourceAsStream( filename ), filename );
于 2012-07-18T00:25:50.497 に答える
2

独立したリソース ディレクトリをサーバー名前空間の任意の URI に「マウント」する場合は、DefaultServlet独立したresourceBase構成で の複数のインスタンスを使用するのが最良の選択です。

次のスニペットは/A/*、ファイルシステム パスX/V/A/B/*ファイルシステム パスから URI を提供し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();

注:上記のコードからわかるように、提供されるディレクトリの名前が例/A/*とまったく同じである必要はありませんA。両方の名前 (提供するディレクトリのファイルシステム名とコンテンツをマップする URI) は完全に独立しています。

于 2015-06-27T19:52:21.803 に答える