ZUMLページ(aka.,イベントリスナ実行中)を更新しているとき、例外が発生した場合、その例外はZKアップデートエンジンによって処理されます。
デフォルトでは、ただ単純に警告ボックスを表示して、ユーザーに警告します。
以下のように、WEB-INF/zk.xmlの中でエラーページを指定することで、エラー処理をカスタマイズできます。より詳しくは開発用リファレンス中のAppendix Bを参照してください。
<!-- zk.xml --> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/WEB-INF/sys/error.zul</location> </error-page>
イベントリスナの中でエラーが発生したら、ZKアップデートエンジンはプログラマーが指定したエラーページ,/error/error.zulで、ダイアログを作成します。
ZUMLページを読み込み中のエラー処理のように、一つ以上の<error-page>要素を指定できます。
そのどれも異なった例外のタイプ(<exception-type>要素の値)に関連しています。
エラーが発生したとき、ZKは対応する例外タイプが見つかるまで、エラーページを一つ一つ探します。
さらに、ZKはリクエスト属性のセットをエラーページに送信して、何が起こったかを表示します。これらの属性は以下のようです。
Request Attribute |
Type |
---|---|
javax.servlet.error.exception_type |
java.lang.Class |
javax.servlet.error.message |
java.lang.String |
javax.servlet.error.exception |
java.lang.Throwable |
以下はエラーページの一つの例です。
<window title="Error ${requestScope['javax.servlet.error.status_code']}" width="400px" border="normal" mode="modal"> <vbox> KillerApp encounters a fatal error, ${requestScope['javax.servlet.error.message']}. The error is recorded and we will look at it and fix it soon. <hbox style="margin-left:auto; margin-right:auto"> <button label="Continue" onClick="spaceOwner.detach()"/> <button label="Reload" onClick="Executions.sendRedirect(null)"/> </hbox> </vbox> <zscript> org.zkoss.util.logging.Log.lookup("Fatal").log( requestScope.get("javax.servlet.error.exception")); </zscript> </window>
【ヒント】:エラーページはエラーを起こした同一デスクトップで作成されます。つまり、そこから、関連した情報を取得できます。
【ヒント】:まったくモーダルを使用しないアプリケーションがあるため、バージョン2.3.1以降、ZKは自動的にモーダルとしてルートウィンドウを作成しません。モーダルを使用する場合は、前の例をご参照ください。
どのデバイスタイプもエラーページのセットを持っています。ZKモバイルデバイス(MILをサポートしているモバイルデバイス)にエラーページを指定するには 、以下のように mil をdevice-typeに指定しなければなりません。
<!-- zk.xml --> <error-page> <device-type>mil</device-type> <exception-type>java.lang.Throwable</exception-type> <location>/WEB-INF/sys/error.zul</location> </error-page>
【ヒント】:devie-type要素が省略された場合、ajaxが想定されます。つまり、Ajaxブラウザにエラーページを指定します。
<device-type>ajax</device-type> <!-- ajax is the default -->