試しにブラウザに直接 http://localhost:8080/tutorial1/on.ex257q.na(Hello 画面)を入力して表示するとブラウザにエラー 500 が返されました。
例外が発生すると、標準エラー出力に例外のスタックトレースが出力されますので、catalina.out ログに記録されます。
※Gateクラスの onError メソッドにも通知されます。
1: 2:
java.lang.NullPointerException at tutorial1.logic.HelloHtml.outputMain(HelloHtml.java:72)
実ソースを見ると、
1: 2: 3: 4: 5: 6: 7:
public Page outputMain( Page from, RequestParameter req ) throws PageException { // 出力内容を設定します。 // 初期化したい場合は、init()をコールして下さい。 LoginHtml login = (LoginHtml)from; this.getUserIdSpan().setValueString( login.getUserIdInput().getValueString() ); return this; }
login 変数が null のためダウンしています。直接 HelloHtml を開こうとしたので、当然の結果ではあります。
この部分のコーディングとして、login が null かどうかを判定する if 文が必要だとも考えられますが、if ( login == null ) だったら、結局 PageException をスローする以外に処理のしようがありません。
考え方を変えると、この画面はログインされている事が前提で動作します。
チュートリアル1-2のように、この時の処理フローを説明すると以下のようになります。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
package tutorial1; import tutorial1.base.*; import paraselene.*; import paraselene.supervisor.*; /** * 遷移元が無い場合の処理ページ。 */ public class DummyPage extends NullPage { /** * コンストラクタ。 */ public DummyPage() { super(); } /** * 遷移元ページがない場合のinput。 * @param req リクエスト内容。 * @param fw 遷移先。 * @exception PageException 処理の継続が不可能(ブラウザには500を返す)。 */ public Forward input( RequestParameter req, Forward fw ) throws PageException { // fwが直接呼び出してはいけないページであれば、 // 別のForwardインスタンスを生成してリターンして下さい。 return fw; } }
DummyPage へは、遷移元が無い場合に呼び出されます。 遷移元が無いケースは次のような場合です。
言い方を変えると、自サイトに対しユーザー操作が開始された瞬間、と言えます。
また、この例ではログイン後のページを直接見ようとしていますので、不正アクセスとも考えられます。
ですので、今回のようなケースではログイン画面へ遷移させます。
1: 2: 3: 4: 5: 6: 7: 8:
public Forward input( RequestParameter req, Forward fw ) throws PageException { // fwが直接呼び出してはいけないページであれば、 // 別のForwardインスタンスを生成してリターンして下さい。 if ( fw.getPageID() != PageType.LOGIN_HTML ) { fw = new Forward( PageType.LOGIN_HTML, false, true ); } return fw; }
また補足として、getAliasURI() の URL で開かれた場合も遷移元が存在しない、とみなされ DummyPage が呼ばれます。