Jettyの使い方3、Embedded-Jettyにwarファイルを配備
※Jettyに関する全投稿は/tag/jettyにあるので参照されたい。
Embeddedとして使うJettyにWarファイルを配備する。バージョンは9.4.8である。
配備の仕方
これは単純だ。
WebAppContext war = new WebAppContext();
// コンテキストパスの指定
war.setContextPath("/wt");
// ディレクトリインデックスの表示禁止
war.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
// warファイルのありかを指定
war.setWar("....../sample.war");
とした後に、WebAppContextはContextHandlerであるので、Jettyの使い方1で見たようにContextHandlerCollectionに追加してやればよい。
ディレクトリインデックスの禁止
上記の「ディレクトリインデックスの表示禁止」を行わないと、以下が表示されてしまう。
表示禁止を行うと以下になる。
しかし、403になってしまう。もちろん、Jettyサーバの方に設定したデフォルトのハンドラは使用されないようだ。404の場合でも同じだ。
warの403や404のハンドリングを行うには?
setErrorHandlerでエラーハンドラを設定すれば良いらしい。とりあえず、設定してみて、呼び出されることを確認する。
war.setErrorHandler(new ErrorHandler() {
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("error handler");
}
});
とりあえず何も返さないので、ブラウザには何も表示されない。
.warファイルではなく、.warファイルを展開した後のディレクトリ構造は使用できるのか?
可能だ。setWarの代わりに、setResourceBaseを呼び出せばよい。
war.setResourceBase("...../sample");
sample以下に次のようなディレクトリ構造があるものとする。
warの場合には展開されてしまうことに注意
.warファイルを配備した場合、Jettyは実行前にそれを展開してしまう。展開先としては、通常の一時ファイル領域が用いられる。
例えばWindowsの場合で、ユーザ名がadminの場合には、以下のようなものになる。
C:\Users\admin\AppData\Local\Temp\jetty-0.0.0.0-8080-webterm.war-_wt-any-7725045132932423229.dir
この下にwebappディレクトリが作成され、そこに.warが展開されている。
そして、このdir自体は、.warファイルがなくとも、Jettyの実行ごとに作成されるようだ。
ディスカッション
コメント一覧
まだ、コメントがありません