SOAフレームワークBeehiveに挑戦(3) 2/4

PollinateでNetUI Page Flowプログラミング

www.netpotlet.com
原田洋子
2005/7/1

シンプルなプログラム

 まずはシンプルなプログラムから始めましょう。最初にトライするのはログインフォームで図4に示すように動きます。最近ログインのための認証をしたかどうかのチェックから始めますが、認証された状態になっていなければフォームを表示します。フォームのページはJSPで作ります。認証された状態になっていればログインフォームを表示せずに日記ページへ遷移します。

 ログインページのフォームに入力されたパラメータをポストする先には、コントローラの注釈とメソッドの組になっているアクションを指定します。メソッドを実行した結果、認証できたと判断されれば日記ページへ、認証されなかった場合は再びログインページへ戻ります。また、後に詳細を説明しますが、ログインページには登録ページへのリンクもあります。

 図4 ログインの処理

コントローラのプログラミング

 Beehiveのプログラミングはコントローラから始めます。コントローラというのはControllerクラスで、Pollinateを使わずにApache Beehiveを利用する場合は、拡張子を.jpfにしてController.jpfファイルを作ります。しかし、前回の記事で説明したようにPollinateプラグインを利用する場合、拡張子を.javaにしないと問題が起きるので、ここではController.javaファイルを作ります。ただし、Eclipse上の操作は通常のJavaのクラスを作るのと同じですから拡張子の指定は行いません。

 コントローラはJSPファイルがあるディレクトリに1つが基本です。通常のクラスのようにWEB-INF/src以下にパッケージを作って、クラスを作ってといったことはせず、JSPファイルを置くWebContentディレクトリ以下に作ります。ディレクトリ階層がパッケージと同等の扱いになります。

 ログインページのJSPはeaves Webアプリケーションのトップディレクトリに置きますので、eaves/WebContentフォルダにControllerクラスを次のようにして作ります。

 Project Explorer eavesプロジェクト(図2)のWebContent選択
  → 右クリック → 新規 → クラス

 (クラス作成ウィンドウ、図5)名前(M)にControllerと入力
  →(スーパークラス(S)の右にあるボタン)参照
  →(サブウィンドウ、図6)PageFlowControllerと入力 → OK
  →(クラス作成ウィンドウ)終了

図5 クラス作成ウィンドウ(画像をクリックすると拡大します)

図6 スーパークラスの指定

 クラスが作られると自動的にデフォルトパッケージが作られ、その下にControllerクラスが置かれます。

 Controllerのプログラミングで最初に行っておくのは

  1. @Jpf.Controller注釈をクラス定義に追加する
  2. Forward型を返すbegin()メソッドを定義するか、@Jpf.SimpleAction注釈でbeginアクションに対応するページを指定する

の2点です。1つ目はControllerクラスが、Beehiveのコントローラとして振る舞うという意味があります。2つ目は動作のきっかけとなるbeginアクションに対応する振る舞いを指定する意味があります。最初のページが表示される前に何かを実行したい場合はbegin()メソッドに、何も実行しないで最初のページを表示する場合は@Jpf.SimpleAction注釈にします。

 さらに、Controllerクラスでは次の定義を行います。

  1. フォームの各パラメータをプロパティに持つJavaBeansを定義する
  2. フォームのポスト先となるメソッドを定義する

 1〜4の定義を行うと、図4に示したログイン制御のControllerはリスト3のようになります。このときリスト3のフローは図7のようになりました。図7にあるように、すべてはbeginという名前のアクションで始まり、ここでauthorizedと判断されると日記ページmydiary/index.jsp 注2 を表示し、not_authorizedと判断されるとlogin.jspを表示します。次にlogin.jspのフォームはprocessLoginという名前のアクションにポストしますが、ここでlogin_successと判断されれば日記ページmydiary/index.jspを表示し、login_failureと判断されれば再び、login.jspを表示します。

注2
PollinateプラグインのController Flow描画機能はディレクトリ階層に対応していません。本来はmydiary/index.jspとなるべきところですが、単にindex.jspとファイル名だけが表示されています。

 さて、図7のフロー図とリスト3の注釈を見比べてください。12〜17行目が18行目から定義されているbegin()メソッドの注釈です。フロー図には注釈とForward型を返すメソッドの組み合わせがアクションで表現されています。begin()メソッドの注釈ではauthorized、not_authorizedそれぞれの場合に表示するmydiary/index.jsp、login.jspを指定しています。begin()メソッドではセッションにusernameという名前に関連付けられた値があるかどうかをチェックして、認証済みかどうかの判断を行っています。

 フロー図のもう1つのアクションprocessLoginはリスト3のprocessLogin()メソッドとその注釈で、フォームのポスト先として使います。注釈ではlogin_successとlogin_failureそれぞれの場合に表示するJSPをmydiary.jsp、login.jspを指定しています。processLogin()メソッドではパスワードの長さが6文字以上、ユーザー名の最初の1文字で始まって最後の1文字で終わっている(例:ユーザー名:abcd、パスワード:abccccccd)場合にログインに成功したと判断するようにしました。意味のある認証ではありませんが、動作テストとしては十分でしょう。

 リスト3の70〜88行目のLoginFormクラスは、フォームの各パラメータをプロパティに持つJavaBeansの定義です。ポストされたときに自動的にプロパティに値がセットされます。

図7 リスト3のフロー図(画面をクリックすると拡大します)

 1 import java.io.Serializable;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpSession;
 5 
 6 import org.apache.beehive.netui.pageflow.Forward;
 7 import org.apache.beehive.netui.pageflow.PageFlowController;
 8 import org.apache.beehive.netui.pageflow.annotations.Jpf;
 9 
10 @Jpf.Controller
11 public class Controller extends PageFlowController {
12     @Jpf.Action(
13         forwards={
14            @Jpf.Forward(name="authorized",
                           path="/mydiary/index.jsp"),
15            @Jpf.Forward(name="not_authorized",
                           path="/login.jsp")
16         }
17     )
18     public Forward begin() {
19         HttpServletRequest request = getRequest();
20         HttpSession session = request.getSession();
21         String username =
               (String)session.getAttribute("username");
22         if (isAuthorized(username)) {
23             return new Forward("authorized");
24         } else {
25             return new Forward("not_authorized");
26         }
27     }
28 
29     @Jpf.Action(
30         forwards={
31             @Jpf.Forward(name="login_success",
                            path="/mydiary/index.jsp"),
32             @Jpf.Forward(name="login_failure",
                            path="/login.jsp")
33         }
34     )
35     public Forward processLogin(LoginForm loginForm) {
36         String username = loginForm.getUsername();
37         if ((username == null) || (username.length()==0)) {
38             return new Forward("login_failure");
39         }
40         String password = loginForm.getPassword();
41         if ((password == null) || (password.length()==0)) {
42             return new Forward("login_failure");
43         }
44         String prefix = username.substring(0, 1);
45         String suffix =
               username.substring(username.length()-1);
46         if (isMatched(password, prefix, suffix)) {
47             getRequest().getSession().setAttribute(
                   "username", username);
48             return new Forward("login_success");
49         } else {
50             return new Forward("login_failure");
51         }
52     }
53     
54     private boolean isAuthorized(String username) {
55         if ((username !=null) && (username.length()>0)) {
56             return true;
57         } else {
58             return false;
59         }
60     }
61     
62     private boolean isMatched(String str,
                                 String start,
                                 String end) {
63         if (str.startsWith(start) &&
               str.endsWith(end) &&
               (str.length()>=6)) {
64             return true;
65         } else {
66             return false;
67         }
68     }
69 
70     public static class LoginForm implements Serializable {
71         private String username;
72         private String password;
73         public String getPassword() {
74             return password;
75         }
76 
77         public void setPassword(String password) {
78             this.password = password;
79         }
80 
81         public String getUsername() {
82             return username;
83         }
84 
85         public void setUsername(String username) {
86             this.username = username;
87         }
88     }
89 }
リスト3 WebContentディレクトリのController.java

次ページへ続く)

2/4

 Index
SOAフレームワークBeehiveに挑戦(3)
PollinateでNetUI Page Flowプログラミング
  Page 1
・NetUI Page Flowの概要
・プログラミング環境
・プログラミングのためのドキュメント
Page 2
・シンプルなプログラム
 −コントローラのプログラミング
  Page 3
 −JSPページのプログラミング
 −サーバのセットアップと実行
  Page 4
・データ表示方法とバリデーション
・まとめ&サンプルコードのダウンロード


「SOAフレームワークBeehiveに挑戦」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間