SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Apache Beehiveの開発を体験する

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

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

サンプルアプリケーションの実装詳細 - 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」に遷移します。

次のページ
サンプルアプリケーションの実装詳細 - 2

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Apache Beehiveの開発を体験する連載記事一覧
この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/411 2006/10/11 19:39

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング