例外発生時のページ

Mayaa の描画中に例外が発生した場合、Mayaa のエラーページが表示されます。このとき、"例外のクラス名.html" というファイル名のテンプレートを用意することで、例外ごとのエラーページを表示させることができます。

発生した例外のクラス名を持つテンプレートが存在しない場合、例外の親クラスのクラス名で再度テンプレートを探します。 Mayaa の jar ファイルには /META-INF/java.lang.Throwable.html というファイルが含まれているため、 テンプレートを用意されていない例外はこのファイルをテンプレートとして使ってエラーページを表示します。 これが Mayaa の標準エラーページです。ただしエラーページの描画中に例外が発生した場合は、 ステータス 500 の Internal Server Error になります。

(※1.1.23以降) Mayaa 標準のエラーページには debug モードがあり、application.debugnull 以外の場合に debug モードが有効になります。debug モードでは、例外の情報と共に各スコープの内容などを表示します。(※1.1.22以前では標準で debug モードでした)

Mayaa 標準のエラーページを表示しないようにするには、コンテキストルートに java.lang.Throwable.html というファイル名のエラーテンプレートを作成してください。また、発生した例外オブジェクトを参照するには、スクリプトで handledError 変数を利用できます。

※「Mayaa の描画中」とは、おおむね forward してから Mayaa 内の処理が終わるまで、と考えてください。

具体的な例

存在しないページにアクセスがあった場合を考えてみましょう。*.html に対して MayaaServlet をマッピングしているとき、 存在しない URL (仮に http://localhost:8080/mayaa/not_exists.html とします) へアクセスがあっても Mayaaに 処理が渡ります。not_exists.html というテンプレートファイルが存在しない場合、 org.seasar.mayaa.impl.engine.PageNotFoundException が発生します。

例外に対応するページを作る

ここでの例外クラス名は org.seasar.mayaa.impl.engine.PageNotFoundException ですので、コンテキストルートに org.seasar.mayaa.impl.engine.PageNotFoundException.html という名前のテンプレートファイルを作成します。

コンテキストルート
  - org.seasar.mayaa.impl.engine.PageNotFoundException.html
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>404</title>
</head>
<body>
    指定されたページが見つかりません。
</body>
</html>

ブラウザで http://localhost:8080/mayaa/not_exists.html にアクセスしてみましょう。

実行結果 (改行などは実際の実行結果と異なります)
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>404</title>
</head>
<body>
    指定されたページが見つかりません。
</body>
</html>

先ほど作成したテンプレートの内容が表示されますね。

動的な描画をする

このエラーページは通常のテンプレートと同じ扱いですので、動的な値を含めることができます。先ほどのページにリクエストされたパス名を含めてみましょう。

コンテキストルート
  - org.seasar.mayaa.impl.engine.PageNotFoundException.html
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>404</title>
</head>
<body>
    指定されたページ
        "<span id="pageName">/dummy.html</span>"
        が見つかりません。
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org" noCache="true">
    <m:write m:id="pageName" value="${ request.requestedPath }" />
</m:mayaa>

ブラウザで http://localhost:8080/mayaa/not_exists.html にアクセスしてみましょう。

実行結果 (改行などは実際の実行結果と異なります)
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>404</title>
</head>
<body>
    指定されたページ
        /not_exists.html
        が見つかりません。
</body>
</html>

リクエストされたパス名が表示されますね。

例外発生時の処理をカスタマイズする

エンジン設定によってエラーページのパス、拡張子、あるいは処理をまるごと変更することができます。 詳しくはエラー処理の設定をご覧ください。