例えばvmファイルが無い等によってエラーになると、スタックトレースがダラダラ表示されたエラー画面が表示される。「VelocityViewServlet : Error processing」でググってみると、そんな恥ずかしいエラー画面がたっぷり出てくる。
これではイカンというわけでカスタムエラーページを設定したいのだが、どうやらこのエラー画面はVelocityViewServlet#error()にハードコーディングされているようなので、このerrorメソッドをオーバーライドするしかないっぽい…。errorメソッド内でServletExceptionを投げるか、レスポンスにステータスコードを設定すればいいんじゃなかろうか。
public class CustomVelocityViewServlet extends VelocityViewServlet { protected void error( HttpServletRequest request, HttpServletResponse response, Exception e) throws ServletException { if (e instanceof ResourceNotFoundException) { try { response.sendError(404, request.getRequestURI()); } catch (IOException ignore) { throw new ServletException(e); } } else { throw new ServletException(e); } } }
web.xmlでerror-pageを設定する。
<error-page> <error-code>404</error-code> <location>/error/notFound.html</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/serverError.html</location> </error-page>
VelocityLayoutServlet
VelocityLayoutServletというのがあるらしい。これを使うのが正解なんだろうなあ…