web-dev-qa-db-ja.com

Jettyが埋め込まれた静的ファイルの提供

現在の作業ディレクトリのサブディレクトリである「html」ディレクトリから静的ファイルを提供する埋め込みJettyを使用した簡単なデモアプリを構築しようとしています。アイデアは、デモjarとコンテンツを含むディレクトリを新しい場所に移動しても動作するということです。

以下のバリエーションを試しましたが、404を取得し続けています。

ServletContextHandler context = 
                       new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");

context.getInitParams().put(
                       "org.Eclipse.jetty.servlet.Default.resourceBase", "html");
context.addServlet(new ServletHolder(new DefaultServlet()), "/html");

Server jetty = new Server(8080);
jetty.setHandler(context);

jetty.start();

更新: Jettyチュートリアルに記載されているソリューションを次に示します。正解で述べたように、ResourceHandlerの代わりにServletContextHandlerを使用します。

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

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

    resource_handler.setResourceBase(".");

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

    server.start();
    server.join();
52
HolySamosa

ResourceHandler の代わりに ServletContextHandler を使用します。

33
Sane Dog

ResourceHandlerを使用する静的コンテンツとDefaultServletを使用する(ServletContextHandlerを使用する)には重要な違いがあります。

ResourceHandler(または複数のHandlerListインスタンスを保持するResourceHandler)がコンテキストハンドラーとして設定されると、要求を直接処理し、登録されているjavax.servlet.Filterインスタンスを無視します。

フィルターが必要な場合は、ServletContextHandlerを使用してフィルターを追加し、DefaultServletを追加して、最後にベースResourceを設定するしか方法がありません。

ベースResourceは、ResourceHandlerが初期化されるresourceBaseパスを表します。複数のディレクトリから静的リソースを提供する場合は、ResourceCollection(依然としてResourceのままです)を使用し、resourceBase文字列の配列で初期化します。

ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());
19
xorcus

私の小さなWebサーバーには、index.htmlinfo.jsの2つのファイルが/src/webappの下にあり、それらを組み込みの桟橋Webサーバーから提供したいです。

これが、静的コンテンツの問題を解決する方法です。

Server server = new Server(8080);

ServletContextHandler ctx = new ServletContextHandler();
ctx.setContextPath("/");

DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/webapp/");

ctx.addServlet(holderPwd, "/*");
ctx.addServlet(InfoServiceSocketServlet.class, "/info");

server.setHandler(ctx);

魅力のように働いた!

15
akatran

Web.xmlに「css」ディレクトリのマッピングを追加することで、同様のことを達成できました。 DefaultServletを使用するよう明示的に指示します。

<servlet>
  <servlet-name>DefaultServlet</servlet-name>
  <servlet-class>org.Eclipse.jetty.servlet.DefaultServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>DefaultServlet</servlet-name>
  <url-pattern>/css/*</url-pattern>
</servlet-mapping>
2
QaZ

これは Main.Javaファイル:

import org.Eclipse.jetty.server.Handler;
import org.Eclipse.jetty.server.Server;
import org.Eclipse.jetty.server.handler.DefaultHandler;
import org.Eclipse.jetty.server.handler.HandlerList;
import org.Eclipse.jetty.server.handler.ResourceHandler;

public class Main
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);
        ResourceHandler resource_handler = new ResourceHandler();
        resource_handler.setResourceBase("C:/Users/serge.klimkovitch/Documents/images");
        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
        server.setHandler(handlers);
        server.start();
        server.join();
    }
}

=====================================

そしてこれは gradle.buildファイル:

apply plugin: 'Java'
apply plugin: 'application'

mainClassName = 'SheetsQuickstart'
sourceCompatibility = 1.7
targetCompatibility = 1.7
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
compile group: 'org.Eclipse.jetty', name: 'jetty-server', version: '9.4.16.v20190411'

}

jar {
  manifest {
    attributes(
      'Main-Class': 'SheetsQuickstart'
    )
  }
  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

=====================================

次のファイルが存在すると仮定します:C:\Users\serge.klimkovitch\Documents\images\image.html

次に、Eclipseで実行し、http://localhost:8080/image.htmlブラウザでこのファイルが提供されていることを確認します。

0
sklimkovitch