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

ファイル構成は次のとおりです。
| ファイル名 | 概要 |
| Controller.java | コントローラー |
| CreateFileLogic.java | ファイル出力ロジッククラス |
| LoginForm.java | ログインフォーム |
| MemoForm.java | メモフォーム |
| login.jsp | ログイン画面 |
| input.jsp | 入力画面 |
| confirm.jsp | 確認画面 |
基本的なコントローラークラスの作成
まず、ページフローとなるコントローラークラスを作成する必要があります。
@Jpf.Controller( …… ) public class Controller extends PageFlowController { …… }
コントローラークラスは、org.apache.beehive.netui.pageflow.PageFlowControllerを継承したクラスとして定義し、@Jpf.Controller(org.apache.beehive.netui.pageflow.annotations.Jpf.Controller)アノテーションを指定します。これが最低限のコントローラーの骨組みです。
シンプルアクション
シンプルアクションとは、特にビジネスロジックを行わずに別のView(JSPなど)に遷移させる制御のことです。例えば、サンプルアプリケーションでは、メモ入力完了画面からログイン画面に戻す制御などで使われます。実際のソースは次のようになります。
@Jpf.Controller(
simpleActions={
@Jpf.SimpleAction(name="begin", path="login.jsp")
}
)
public class Controller
extends PageFlowController
{
……
}
@Jpf.Controllerアノテーションの中にsimpleActionsというプロパティを含めています。この中に @Jpf.SimpleAction(org.apache.beehive.netui.pageflow.annotations.Jpf.SimpleAction)アノテーションをつけた1つのプロパティを設定しています。@Jpf.SimpleActionのnameはシンプルアクションの名称を表し、パスはリンク先のJSPページを指定します。これで、JSPのタグなどにアクション名を指定するだけで、JSPへ遷移させるコードを出力させることができます。例えば、beginの名前を指定して「login.jsp」に遷移させたいリンクをJSPで記述するには次のようになります。
<netui:anchor action="begin">link</netui:anchor>
また、シンプルアクションは@Jpf.Controllerアノテーションの中のSimpleActionsの中に、カンマ区切りで複数の設定を行うこともできます。
アクションメソッド
アクションメソッドとは、シンプルアクションのような単純な遷移だけでなく、ログイン処理やファイル出力といったビジネスロジックを含んだ遷移処理です。ここでは、ログイン処理と、メモ入力画面から完了画面へ遷移する際に使用されています。サンプルアプリケーションのソースは次のようになります。
//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.Action(org.apache.beehive.netui.pageflow.annotations.Jpf.Action)アノテーションを指定します。アクションメソッドは、アクションフォームを引数として持ち、org.apache.beehive.netui.pageflow.Forwardを返り値とするメソッドです。
Forwardは、インスタンスを生成する際に遷移先を表す文字列を引数として受け取り、アクションメソッドが終了した時点で、@Jpf.Actionのforwardsの中から該当する遷移先を判定します。上のソースではsuccessという文字列を持ったForwardを返すことにより、「complete.jsp」に遷移させるように実装しています。
このサンプルアプリケーションの例では常に遷移先が1つに固定となっていますが、複数の遷移先に動的に振り分けることもあると思います。例えば、ログイン処理で、アカウントが有効期限切れかどうかを判定し、期限切れであれば期限切れのページに飛ばし、期限が有効であれば入力画面に遷移といったような場合です。その場合は次のように、@Jpf.Actionのforwardsの中にカンマ区切りで、複数の@Jpf.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しているソースは次のようになります。
@Jpf.Controller(
catches={
@Jpf.Catch(type=LoginFailedException.class,
method="handleLoginFailedException")
},
……
)
public class Controller
サンプルアプリケーションでは、ログインを試みた際に不正なアカウントであればLoginFailedExceptionをthrowします。これをcatchして特定のメソッドを実行するように指定しているのが@Jpf.Controllerの中のcatchesプロパティに含まれる、@Jpf.Catch(org.apache.beehive.netui.pageflow.annotations.Jpf.Catch)です。@Jpf.Catchはtypeの例外をcatchした際に、methodで指定したメソッド名のメソッドを実行するよう指定できます。例外処理メソッドを表すのは、次の部分です。
//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.ExceptionHandler(org.apache.beehive.netui.pageflow.annotations.Jpf.ExceptionHandler)アノテーションをつけ、プロパティとして、アクションメソッドと同様に@Jpf.Forwardを含んだfowardsプロパティを持ちます。サンプルアプリケーションでは、LoginFailedExceptionを受け取ると、handleLoginFailedExceptionメソッドが実行され、「login.jsp」に遷移します。
