JavaのPushBuilderクラスpathメソッドを完全ガイド!初心者でもわかるHTTP/2プッシュ対象の指定方法
生徒
「先生、PushBuilderでリソースをサーバープッシュしたいんですが、どのファイルを送るかってどう指定するんですか?」
先生
「それにはpathメソッドを使います。プッシュしたいリソースのパスを指定すればOKですよ。」
生徒
「なるほど!たとえばCSSファイルとかJavaScriptファイルもいけますか?」
先生
「もちろん。サーバーが提供しているリソースであれば何でも指定できます。それでは詳しく見ていきましょう!」
1. PushBuilderとは?
Java Servlet APIのjavax.servlet.http.PushBuilderは、HTTP/2で導入されたサーバープッシュ機能を使うためのインターフェースです。WebページのHTMLを返すと同時に、必要なリソース(CSS、JavaScript、画像など)をクライアントに先回りして送ることができます。
2. pathメソッドとは?
path(String path)メソッドは、PushBuilderでサーバーからプッシュする対象のリソースパスを指定するためのメソッドです。このパスはWebアプリケーションのルートからの相対パスになります。たとえばstyles/main.cssやscripts/app.jsなどです。
3. pathメソッドの基本的な使い方
次の例は、pathメソッドを使ってCSSファイルをプッシュするサンプルコードです。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.PushBuilder;
@WebServlet("/push-path")
public class PushPathServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PushBuilder pushBuilder = request.newPushBuilder();
if (pushBuilder != null) {
pushBuilder.path("styles/theme.css").push();
}
response.setContentType("text/html");
response.getWriter().println("<html><body>CSSをプッシュしました</body></html>");
}
}
4. pathに指定する値のポイント
pathで指定する文字列には、次のようなルールがあります。
- スラッシュ(
/)から始めない(アプリケーションルートからの相対パス) - 静的リソースの配置場所と一致していること
- URLエンコードが必要な場合は事前に処理すること
5. 複数リソースをプッシュしたい場合
PushBuilderは同じリクエストの中で複数回使用可能です。たとえば、CSSとJavaScriptを一緒にプッシュしたい場合は、以下のように記述します。
if (pushBuilder != null) {
pushBuilder.path("styles/theme.css").push();
pushBuilder.path("scripts/app.js").push();
}
6. pathで指定するファイルが存在しないとどうなる?
プッシュ対象のファイルが存在しない場合、エラーにはなりませんが、クライアント側でリソースが受信できません。ログにワーニングが出ることがあります。プッシュ前にファイルの存在確認はできないため、事前にデプロイされた静的リソースを確認しておくことが大切です。
7. HTMLとの連携
PushBuilderでリソースをプッシュしても、HTML側で明示的にリンクやスクリプトタグを記述しないと、ブラウザが利用しません。以下のようにHTML側でも指定しておきましょう。
<head>
<link rel="stylesheet" href="styles/theme.css">
<script src="scripts/app.js"></script>
</head>
8. pathと他のPushBuilderメソッドの組み合わせ
pathは、method、queryString、sessionId、setHeader、addHeaderなどのメソッドと組み合わせて使うのが一般的です。以下はその例です。
pushBuilder.path("api/data")
.method("GET")
.queryString("lang=ja")
.setHeader("Accept", "application/json")
.push();