現在の作業ディレクトリのサブディレクトリである「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();
ResourceHandler
の代わりに ServletContextHandler
を使用します。
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());
私の小さなWebサーバーには、index.html
とinfo.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);
魅力のように働いた!
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>
これは 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
ブラウザでこのファイルが提供されていることを確認します。