チュートリアル3(DummyPage)

試しにブラウザに直接 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)

実ソースを見ると、

tutorial1/logic/HelloHtml.java
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. Web サーバーへ HTTP リクエスト発生。
  2. Gate クラスが URL を検証し、遷移元ページを特定します。しかし遷移元が指定されていません。
    遷移元が無い場合、DummyPage クラスを new します。
  3. そして DummyPage クラスの input() が呼び出されます。
  4. Gate クラスは input() の戻り値より、遷移先ページを特定します。ここでは HelloHtml クラスがそれに当たります。
  5. 続いて HelloHtml クラスの outputMain() が呼び出され、例外が発生しました。
tutorial1/DummyPage.java①
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 へは、遷移元が無い場合に呼び出されます。 遷移元が無いケースは次のような場合です。

  • ブラウザに直接 URL を入力された。または、お気に入り(ブックマーク)から開かれた。
  • 別サイトのリンクから遷移してきた。または、リダイレクトされてきた。

言い方を変えると、自サイトに対しユーザー操作が開始された瞬間、と言えます。
また、この例ではログイン後のページを直接見ようとしていますので、不正アクセスとも考えられます。
ですので、今回のようなケースではログイン画面へ遷移させます。

DummyPage.java②
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 が呼ばれます。

チュートリアル4(履歴管理)

最終更新: 2009/10/21
特に明示されていない限り、本Wikiの内容は次のライセンスに従います:CC Attribution 3.0 Unported
文書の先頭へ
SourceForge.JP
2009 © Akira Terasaki.  
Driven by DokuWiki The Apache Software Foundation