CodeZine(コードジン)

特集ページ一覧

Apache Beehiveの開発を体験する(NetUI編)

Apache BeehiveのNetUIを利用した効率的な開発

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/06/10 00:00
目次

サンプルアプリケーションの実装詳細 - 1

 実際にサンプルアプリケーションの仕様を満たす実装方法を、NetUIでどのように実現するのかを解説していきます。ここでは、画面ごとクラスごとではなく、NetUIの実装方法ごとに分けて解説を進めます。次にサンプルアプリケーションのMVCイメージと構成図を示します。

サンプルアプリケーションMVCイメージ
サンプルアプリケーションMVCイメージ

 ファイル構成は次のとおりです。

表3 サンプルアプリケーションの構成ファイル
ファイル名概要
Controller.javaコントローラー
CreateFileLogic.javaファイル出力ロジッククラス
LoginForm.javaログインフォーム
MemoForm.javaメモフォーム
login.jspログイン画面
input.jsp入力画面
confirm.jsp確認画面

基本的なコントローラークラスの作成

 まず、ページフローとなるコントローラークラスを作成する必要があります。

サンプル1 「Controller.java」のソースの一部
@Jpf.Controller(
……
)
public class Controller
    extends PageFlowController
{

……
}

 コントローラークラスは、org.apache.beehive.netui.pageflow.PageFlowControllerを継承したクラスとして定義し、@Jpf.Controllerorg.apache.beehive.netui.pageflow.annotations.Jpf.Controller)アノテーションを指定します。これが最低限のコントローラーの骨組みです。

シンプルアクション

 シンプルアクションとは、特にビジネスロジックを行わずに別のView(JSPなど)に遷移させる制御のことです。例えば、サンプルアプリケーションでは、メモ入力完了画面からログイン画面に戻す制御などで使われます。実際のソースは次のようになります。

サンプル2 Controller.javaのソースの一部
@Jpf.Controller(
    simpleActions={
        @Jpf.SimpleAction(name="begin", path="login.jsp")
    }

)
public class Controller
    extends PageFlowController
{

……

}

 @Jpf.Controllerアノテーションの中にsimpleActionsというプロパティを含めています。この中に @Jpf.SimpleActionorg.apache.beehive.netui.pageflow.annotations.Jpf.SimpleAction)アノテーションをつけた1つのプロパティを設定しています。@Jpf.SimpleActionnameはシンプルアクションの名称を表し、パスはリンク先のJSPページを指定します。これで、JSPのタグなどにアクション名を指定するだけで、JSPへ遷移させるコードを出力させることができます。例えば、beginの名前を指定して「login.jsp」に遷移させたいリンクをJSPで記述するには次のようになります。

<netui:anchor action="begin">link</netui:anchor>

 また、シンプルアクションは@Jpf.Controllerアノテーションの中のSimpleActionsの中に、カンマ区切りで複数の設定を行うこともできます。

アクションメソッド

 アクションメソッドとは、シンプルアクションのような単純な遷移だけでなく、ログイン処理やファイル出力といったビジネスロジックを含んだ遷移処理です。ここでは、ログイン処理と、メモ入力画面から完了画面へ遷移する際に使用されています。サンプルアプリケーションのソースは次のようになります。

サンプル3 「Controller.java」のソース一部
//Login Process
@Jpf.Action(
    forwards = {
          @Jpf.Forward(name="success", path="input.jsp")
    }
)
public Forward loginProcess(LoginForm form)throws LoginFailedException {
    
    boolean isLoginOK = false;
    if(form.getId()!=null&&form.getId().equals("admin")
      &&form.getPassword()!=null&&form.getPassword().equals("pass")){
        isLoginOK = true;
    }
    
    if(isLoginOK==false){
        System.out.println("login failed");
        throw new LoginFailedException();
    }
    
    Forward fwd = new Forward("success");
    return fwd;
}

……<中略>……

//Input Memo Process
@Jpf.Action(
    forwards = {
          @Jpf.Forward(name="success", path="complete.jsp")
    }
)
public Forward inputMemoProcess(MemoForm form) {
    
    try {
        new CreateFileLogic().write(form.getTitle(),form.getBody());
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    Forward fwd = new Forward("success");
    fwd.addActionOutput("title", form.getTitle());
    fwd.addActionOutput("body", form.getBody());
    return fwd;
}

 アクションメソッドはコントローラークラスに定義するインスタンスメソッドであり、 @Jpf.Actionorg.apache.beehive.netui.pageflow.annotations.Jpf.Action)アノテーションを指定します。アクションメソッドは、アクションフォームを引数として持ち、org.apache.beehive.netui.pageflow.Forwardを返り値とするメソッドです。

 Forwardは、インスタンスを生成する際に遷移先を表す文字列を引数として受け取り、アクションメソッドが終了した時点で、@Jpf.Actionforwardsの中から該当する遷移先を判定します。上のソースではsuccessという文字列を持ったForwardを返すことにより、「complete.jsp」に遷移させるように実装しています。

 このサンプルアプリケーションの例では常に遷移先が1つに固定となっていますが、複数の遷移先に動的に振り分けることもあると思います。例えば、ログイン処理で、アカウントが有効期限切れかどうかを判定し、期限切れであれば期限切れのページに飛ばし、期限が有効であれば入力画面に遷移といったような場合です。その場合は次のように、@Jpf.Actionforwardsの中にカンマ区切りで、複数の@Jpf.Forwardを記述します。

サンプル4 複数の遷移先にForwardする場合
@Jpf.Action(
    forwards = {
        @Jpf.Forward(name="success", path="complete.jsp"),
        @Jpf.Forward(name="expired", path="expired.jsp")
    }
)
public Forward loginProcess(LoginForm form) {

    String fwd = null;
    if(expired == true){
        fwd = "expired";
    }else{
        fwd = "success";
    }
    return new Forward(fwd);
}

例外処理

 アクションメソッドで呼び出されるビジネスロジックから例外が起きた際に、特定の遷移をさせたい場合があると思います。この場合にはアクションメソッドの中で例外をcatchして特定のForwardオブジェクトを作成する方法以外に、ページフロー特有の例外処理を使う方法があります。これは、アクションメソッドで特定の例外が起きた際にcatchして特定の処理・遷移を行います。例外をcatchしているソースは次のようになります。

サンプル5 「Controller.java」のソースの一部
@Jpf.Controller(
    catches={
        @Jpf.Catch(type=LoginFailedException.class,
                   method="handleLoginFailedException")
    },
……
)
public class Controller

 サンプルアプリケーションでは、ログインを試みた際に不正なアカウントであればLoginFailedExceptionthrowします。これをcatchして特定のメソッドを実行するように指定しているのが@Jpf.Controllerの中のcatchesプロパティに含まれる、@Jpf.Catchorg.apache.beehive.netui.pageflow.annotations.Jpf.Catch)です。@Jpf.Catchtypeの例外をcatchした際に、methodで指定したメソッド名のメソッドを実行するよう指定できます。例外処理メソッドを表すのは、次の部分です。

サンプル6 「Controller.java」のソースの一部
//Login Failed Handling
@Jpf.ExceptionHandler(
        forwards={
            @Jpf.Forward(name="login.failed", path="login.jsp")
        }
    )
public Forward handleLoginFailedException(LoginFailedException e,
    String actionName,String message,Object form){
    return new Forward("login.failed");
}

……

 メソッドには、@Jpf.ExceptionHandlerorg.apache.beehive.netui.pageflow.annotations.Jpf.ExceptionHandler)アノテーションをつけ、プロパティとして、アクションメソッドと同様に@Jpf.Forwardを含んだfowardsプロパティを持ちます。サンプルアプリケーションでは、LoginFailedExceptionを受け取ると、handleLoginFailedExceptionメソッドが実行され、「login.jsp」に遷移します。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Apache Beehiveの開発を体験する

著者プロフィール

  • WINGSプロジェクト 佐藤 真介(サトウ シンスケ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5