-サンプル

IkushipeではページオブジェクトをJavaで書きますが、インターフェイスでもOKです。開発ではまずこの機能を実装しました。以下の例は、/index.htmlにアクセスすると設定より類推してロードされるページのJavaインターフェイスです。初回は何もせず、これまた設定条件より類推されるJSPに自動でフォワードします。

public interface IndexPage extends ActionPage {
  @Action(moveTo=LoginPage.class)
  void foo();
}

バインディングされる/index.jspは以下のとおり。この画面はAタグをひとつ出します。クリックすると、IndexPage#foo()を見に行って、設定されているLoginPageに遷移します。

<%@taglib prefix="ikushipe" uri="http://www.gluegent.com/ikushipe"%>
<html>
  <body>
    <ikushipe:link id="foo">GO LOGIN</ikushipe:link>
  </body>
</html>

遷移先である簡単なログイン画面のサンプルは以下の感じ。アクションメソッドの引数はモデルのクラス型ないし、Javaインターフェイス型、int型(1つまで)の範囲で自由に組み合わせることが可能です。ロジックでモデルがほしければ引数型におけばIkushipeが適切に用意して渡します。LoginServiceはインターフェイスで、これをキーにしてSeasar2からとってくるようになってます。

@Page(pageModel=LoginModel.class)
public class LoginPage implements ActionPage {
  @Action(handleResults={
    @HandleResult(result=SUCCESS, moveTo=SuccessPage.class),
    @HandleResult(result=FAIL, moveTo=FailPage.class)
  })
  public String bar(LoginModel model, LoginService service) {
    if(service.login(model.getUserName(), model.getPassword())) {
      return SUCCESS;
    }
    model.setErrorMessage("invalid username-password");
    return FAIL;
  }
}

以下の例はインターフェイスですが、ファーストバージョンではモデルについては実装クラスを用意しないとダメ。先のバージョンでは、aptを使ってコード自動生成するようにしようと思います。バリデーションで引っかかると、画面は遷移しません。同じ画面を表示します。その際、messageToにてバリデータのメッセージをモデルにぶち込んでおくと、画面に表示されます。

public interface LoginModel extends PageModel {
    @Property(validations={
      @Validation(validator=LengthValidator.class, 
        messageTo="errorMessage",
        variables={ @Variable(name="max", value="10") })
    })
    String getUserName();
    @Property
    String getPassword();
    @Property(sourceType=SourceType.NONE)
    void setErrorMessage(String errorMessage);
}

JSPの画面です。もちろんMayaaもそのまま使えますし、さらに効率のよい方法も考えていますが、普及を考えてJSPカスタムタグでクライアントを作ってます。ikushipe:writeタグではバリデーションのメッセージを表示します。エラーがなければ表示されません。

<%@taglib prefix="ikushipe" uri="http://www.gluegent.com/ikushipe"%>
<html>
  <body>
    <b><ikushipe:write id="errorMessage"/></b>
    <ikushipe:form>
      UserName:<ikushipe:inputText id="userName"/><br>
      Password:<ikushipe:inputText id="password"/><br>
      <ikushipe:inputSubmit id="bar" value="OK"/>
    </ikushipe:form>
  </body>
</html>

カスタムタグはほぼid付けをするだけです。MayaaではHTMLのid付けをみて自動で考えるものなども作ることが可能なようにすでにMayaaに機能を仕込んであるので、後々、もっと面白いことになると思います。