web-dev-qa-db-ja.com

埋め込み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を引き続き機能させる方法がわかりません。

誰かアイデアはありますか?

15
user3034643

あなたが必要なもの:

  1. 「/」にあるDefaultServlet(推奨、サーブレット仕様の要件です)
    • これは、「デフォルト」の名前付きディスパッチャにある必要があります(サーブレット仕様の別の要件)
  2. Init-params を介して構成されたカスタム静的コンテンツを含む代替DefaultServlet
    • 「デフォルト」とは異なる名前のディスパッチャを使用する(他のサーブレット仕様機能間の名前の衝突を回避するため)
    • 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.setBaseResource(Resource.newResource(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);
        }
    }

}
32
Joakim Erdfelt