山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

インクルードファイルをHTMLコメントとして挿入する

JSPファイルのインクルードは便利です。しかしオイシックスのサイトくらいの規模になると1ページのHTMLやCSSの量が多いですしファイルのインクルードも多くなっています。インクルードファイルの中でさらにインクルードしていて1ページを表示するのにたくさんのファイルが使われています。そうするとページを更新したいときに実際に表示されている画面に対応するファイルを探すのがとても大変です。ブラウザのweb開発ツールでDOMは簡単に特定できます。そこにあるHTMLの断片をもとにファイルを検索してなけばインクルードファイルを検索してなければさらにインクルードされているファイルを検索して・・の繰り返しでしんどいです。

そんなわけで生成されたHTMLの中のインクルードファイルの部分の前後にHTMLコメントでファイル名を入れてみます。

ポイントは2つあります。

まずインクルードの前後に処理を挟み込みたい。やり方としてはサーブレットフィルタがあります。サーブレット2.4からインクルードのタイミング、フォワードのタイミングでサーブレットフィルタを発動することができるようになっているのでこれを利用します。指定の仕方は以下のようにフィルタークラスのクラス宣言でアノテーションで指定します。

@WebFilter(urlPatterns = { "*.jsp", "*.html", "*.jspx" }, dispatcherTypes = DispatcherType.INCLUDE)
public class JspIncludeFilter implements Filter {

今時のサーブレットフィルタはweb.xmlじゃなくてもいいんですね。すばらしい。

もう1つはサーブレットフィルタでJSPのファイル名をどうやって取るかです。request.getServletName()やgetRequestURI()では取れません。これは

request.getAttribute("javax.servlet.include.servlet_path")

で取れます。

というわけで以下完成品です。

@WebFilter(urlPatterns = { "*.jsp", "*.html", "*.jspx" }, dispatcherTypes = DispatcherType.INCLUDE)
public class JspIncludeFilter implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
			ServletException {
		PrintWriter out = response.getWriter();
		String jspName = (String) request.getAttribute("javax.servlet.include.servlet_path");
		out.print("<!-- include-start:" + jspName + " -->");
		chain.doFilter(request, response);
		out.print("<!-- include-end:" + jspName + " -->");
	}

	(インターフェース実装メソッドは省略)
}