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