Cubby 100% Pure JSP Web Application Framework 2006/8/19@Nulab Jaian Recital Toshitaka Agata(agata@nulab.co.jp)‏
Cubby って何? 100% Pure JSP Web Application Framework Zero Configuration ベリーシンプル&スモール クラス数約 50 個 REST っぽい URI をサポート 直感的な名前のタグライブラリ Cubby =  整理棚
なぜに JSP ? 最近嫌われ者のJSP・・・ スクリプトレットだし、 エラーがわかりにくいし、 Pure HTML テンプレートじゃないし、 流行りではないし、 etc...
なぜに JSP ? 学習容易性 新しい知識はいりません。 最近の JSP2.0 はいい感じです。 EL 式 (Expression Language)‏ JSTL(JSP Standard Tag Library)‏ Functions タグファイル フラグメント Dynamic Attributes エラー出力の改善
Cubby の概要 Struts,WebWork,Ruby on Rails の 良いところを参考に。 ブラウザ Dispatcher Filter 2.Binding 3.Validation 4.Action Execute JSP View 5. Forward 1. Request 7.Response Custom Tag (Tag File)‏ & Functions 6. Rendering Struts とだいたい同じ範囲をカバーします。 やり方はだいぶ異なります Action Filter Stack Controller + FormObject +ActionMethod1 +ActionMethod2
View ( JSP ) 基本は HTML のタグ。 Cubby に必要な属性を追記します。 <%@ taglib tagdir=&quot;/WEB-INF/cubby/tags&quot; prefix=&quot;t&quot; %> < t: input name=”userId”/> < t: select name=”typeId” items=”${todoTypes}” valueProperty=”id” labelProperty=”name” > <option value=”1”> 仕事 </option> <option value=”2”> 個人 </option> <option value=”3”> その他 </option> </t:select> Pure JSP <input name=”userId” value=””/> <select name=”typeId”> <option value=”1”> 仕事 </option> <option value=”2”> 個人 </option> <option value=”3”> その他 </option> </select> Pure HTML
View ( JSP ) 全てのカスタムタグはタグファイルでできています! (WEB-INF/tags/*.tag) Dynamic Attributes で、定義していない属性も出力可能です! <%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %> <%@ taglib uri=&quot;http://www.nulabco.jp/cubby&quot; prefix=&quot;f&quot; %> <%@ tag dynamic-attributes=&quot;dyn&quot; %> <%@ attribute name=&quot;type&quot; type=&quot;java.lang.String&quot; rtexprvalue=&quot;true&quot; required=&quot;true&quot; %> <%@ attribute name=&quot;checkedValue&quot; type=&quot;java.lang.Object&quot; rtexprvalue=&quot;true&quot; required=&quot;false&quot; %> <input type=&quot;${type}&quot;  ${f:toAttr(dyn)}  ${f:checked(dyn['value'],checkedValue)}/> input.tag
Controller&Action 1つの Contorller に複数 Action メソッドを定義 return “show.jsp” show.jsp にフォワード return “@list” list にリダイレクト return “/common/error.jsp” /common/error.jsp に フォワード return “@/login/logout” /login/logout にリダイレクト @Action public class TodoController extends Controller { ... public String show() { ... return &quot;show.jsp&quot;; } public String edit() { ... return &quot;edit.jsp&quot;; } public String confirm() { ... return &quot;confirm.jsp&quot;; } public String save() { ... return &quot;@list&quot;; } } Controller
Controller&Action メタ情報はアノテーションで(ちょっとだけ) @Action public メソッドをアクションメソッドとみなす (メソッド単位でも設定可能) @Form( プロパティ名 )‏ パラメータの自動バインディング対象を指定 (メソッド単位でも設定可能) @Validation(errorPage=&quot; エラー時の遷移先 &quot;)‏ アクションの実行前にバリデーションを実行 @Session セッションスコープの変数として、 自動バインディング (その他 public なフィールドはリクエストスコープ) @Action @Form(&quot;loginDto&quot;)‏ public class LoginController extends Controller { public static TodoLogic todoLogic = new MockTodoLogic(); @Session public User user; public LoginDto loginDto = new LoginDto(); public String login() { return &quot;login.jsp&quot;; } @Validation(errorPage=&quot;login.jsp&quot;)‏ public String login_process() { if(todoLogic.login(loginDto)) { user = new User(1, &quot;agata&quot;); return &quot;@/todo/list&quot;; } else { errors.add(&quot; ユーザ ID かパスワードが違います。 &quot;); return &quot;login.jsp&quot;; } } public String logout() { user = null; return &quot;@login&quot;; } } Controller
Validation コードで入力検証を記述 public class Todo implements  Validatable  { public static Validators VALIDATORS = new Validators(); static { VALIDATORS.add(&quot;text&quot;, new Required(), new MaxLength(10)); VALIDATORS.add(&quot;memo&quot;, new Required(), new MaxLength(100)); VALIDATORS.add(&quot;typeId&quot;, new Required()); VALIDATORS.add(&quot;limitDate&quot;, new DateFormat()); } public Validators getValidators() { return VALIDATORS; } ... } Model
その他の機能 URI 自動マッピング (Plugin 化 )‏ Rails 風 /todo/list->TodoController#list /todo/confirm->TodoController#confirm /agata/todo/1->TodoController#show?id=1 HTML プレビュー JSP でもブラウザによるプレビューが(ある程度)できます! @ ActionFilter WebWork2 & Rails 風
ロードマップ 2006年 11 月  Ver0.9 2006年 12 月  Ver1.0-RC リファクタリング ドキュメントの整備 2007年 1 月  Ver1.0 サンプルの整備 JavaDoc コメント 一緒に開発してくれる方、 募集中です !! 仕様に対するご意見も、 お待ちしております。

Cubby 2006-08-23

  • 1.
    Cubby 100% PureJSP Web Application Framework 2006/8/19@Nulab Jaian Recital Toshitaka Agata(agata@nulab.co.jp)‏
  • 2.
    Cubby って何? 100%Pure JSP Web Application Framework Zero Configuration ベリーシンプル&スモール クラス数約 50 個 REST っぽい URI をサポート 直感的な名前のタグライブラリ Cubby = 整理棚
  • 3.
    なぜに JSP ?最近嫌われ者のJSP・・・ スクリプトレットだし、 エラーがわかりにくいし、 Pure HTML テンプレートじゃないし、 流行りではないし、 etc...
  • 4.
    なぜに JSP ?学習容易性 新しい知識はいりません。 最近の JSP2.0 はいい感じです。 EL 式 (Expression Language)‏ JSTL(JSP Standard Tag Library)‏ Functions タグファイル フラグメント Dynamic Attributes エラー出力の改善
  • 5.
    Cubby の概要 Struts,WebWork,Rubyon Rails の 良いところを参考に。 ブラウザ Dispatcher Filter 2.Binding 3.Validation 4.Action Execute JSP View 5. Forward 1. Request 7.Response Custom Tag (Tag File)‏ & Functions 6. Rendering Struts とだいたい同じ範囲をカバーします。 やり方はだいぶ異なります Action Filter Stack Controller + FormObject +ActionMethod1 +ActionMethod2
  • 6.
    View ( JSP) 基本は HTML のタグ。 Cubby に必要な属性を追記します。 <%@ taglib tagdir=&quot;/WEB-INF/cubby/tags&quot; prefix=&quot;t&quot; %> < t: input name=”userId”/> < t: select name=”typeId” items=”${todoTypes}” valueProperty=”id” labelProperty=”name” > <option value=”1”> 仕事 </option> <option value=”2”> 個人 </option> <option value=”3”> その他 </option> </t:select> Pure JSP <input name=”userId” value=””/> <select name=”typeId”> <option value=”1”> 仕事 </option> <option value=”2”> 個人 </option> <option value=”3”> その他 </option> </select> Pure HTML
  • 7.
    View ( JSP) 全てのカスタムタグはタグファイルでできています! (WEB-INF/tags/*.tag) Dynamic Attributes で、定義していない属性も出力可能です! <%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %> <%@ taglib uri=&quot;http://www.nulabco.jp/cubby&quot; prefix=&quot;f&quot; %> <%@ tag dynamic-attributes=&quot;dyn&quot; %> <%@ attribute name=&quot;type&quot; type=&quot;java.lang.String&quot; rtexprvalue=&quot;true&quot; required=&quot;true&quot; %> <%@ attribute name=&quot;checkedValue&quot; type=&quot;java.lang.Object&quot; rtexprvalue=&quot;true&quot; required=&quot;false&quot; %> <input type=&quot;${type}&quot; ${f:toAttr(dyn)} ${f:checked(dyn['value'],checkedValue)}/> input.tag
  • 8.
    Controller&Action 1つの Contorllerに複数 Action メソッドを定義 return “show.jsp” show.jsp にフォワード return “@list” list にリダイレクト return “/common/error.jsp” /common/error.jsp に フォワード return “@/login/logout” /login/logout にリダイレクト @Action public class TodoController extends Controller { ... public String show() { ... return &quot;show.jsp&quot;; } public String edit() { ... return &quot;edit.jsp&quot;; } public String confirm() { ... return &quot;confirm.jsp&quot;; } public String save() { ... return &quot;@list&quot;; } } Controller
  • 9.
    Controller&Action メタ情報はアノテーションで(ちょっとだけ) @Actionpublic メソッドをアクションメソッドとみなす (メソッド単位でも設定可能) @Form( プロパティ名 )‏ パラメータの自動バインディング対象を指定 (メソッド単位でも設定可能) @Validation(errorPage=&quot; エラー時の遷移先 &quot;)‏ アクションの実行前にバリデーションを実行 @Session セッションスコープの変数として、 自動バインディング (その他 public なフィールドはリクエストスコープ) @Action @Form(&quot;loginDto&quot;)‏ public class LoginController extends Controller { public static TodoLogic todoLogic = new MockTodoLogic(); @Session public User user; public LoginDto loginDto = new LoginDto(); public String login() { return &quot;login.jsp&quot;; } @Validation(errorPage=&quot;login.jsp&quot;)‏ public String login_process() { if(todoLogic.login(loginDto)) { user = new User(1, &quot;agata&quot;); return &quot;@/todo/list&quot;; } else { errors.add(&quot; ユーザ ID かパスワードが違います。 &quot;); return &quot;login.jsp&quot;; } } public String logout() { user = null; return &quot;@login&quot;; } } Controller
  • 10.
    Validation コードで入力検証を記述 publicclass Todo implements Validatable { public static Validators VALIDATORS = new Validators(); static { VALIDATORS.add(&quot;text&quot;, new Required(), new MaxLength(10)); VALIDATORS.add(&quot;memo&quot;, new Required(), new MaxLength(100)); VALIDATORS.add(&quot;typeId&quot;, new Required()); VALIDATORS.add(&quot;limitDate&quot;, new DateFormat()); } public Validators getValidators() { return VALIDATORS; } ... } Model
  • 11.
    その他の機能 URI 自動マッピング(Plugin 化 )‏ Rails 風 /todo/list->TodoController#list /todo/confirm->TodoController#confirm /agata/todo/1->TodoController#show?id=1 HTML プレビュー JSP でもブラウザによるプレビューが(ある程度)できます! @ ActionFilter WebWork2 & Rails 風
  • 12.
    ロードマップ 2006年 11月 Ver0.9 2006年 12 月 Ver1.0-RC リファクタリング ドキュメントの整備 2007年 1 月 Ver1.0 サンプルの整備 JavaDoc コメント 一緒に開発してくれる方、 募集中です !! 仕様に対するご意見も、 お待ちしております。