åçŽãªéçºè
ããã¢ãŒããã¯ãã«è³ããŸã§ãããŸããŸãªãµã€ãºãšè€éãã®ã¢ããªã±ãŒã·ã§ã³ã«åãçµãå¿
èŠããããŸããã éå»æ°å¹ŽéãåŠæ ¡ç®¡çã·ã¹ãã ãšè¬ç©ç®¡çã·ã¹ãã ã«åãçµãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ããã²ãŒã·ã§ã³ã«é¢é£ããããŸããŸãªçš®é¡ã®åé¡ã解決ããå¿
èŠããããŸããã ãããã䜿çšãããŠãããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠã¯ã䟿å©ãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããããšãåžžã«å¯èœãšã¯éããŸããã§ããã äœããæ¬ ããŠããããã«åžžã«èŠããŸããã
ç»é¢ã®è€éãã®ããžãã¯ãææ¡ããŠç解ããããšããŠãããã¥ã¡ã³ãã®å±±ãã·ã£ãã«ã§åãå¿
èŠãéåžžã«é »ç¹ã«ãããŸããã ã¢ããªã±ãŒã·ã§ã³ããã²ãŒã·ã§ã³ã¯ãå€ãã®å Žåãã©ã®ããŒã«ããã©ã®ã·ãŒã±ã³ã¹ã§ãã©ã®è©³çŽ°ãé©çšããããç¥ãå¿
èŠããã巚倧ãªããŒã«ã»ããã§æ§æãããŠããŸããã äžè¬ã«ãã¢ããªã±ãŒã·ã§ã³ã®ããã²ãŒã·ã§ã³ããžãã¯å
šäœãé ã®äžã§ä¿æããå¿
èŠããããŸããã
ãã ããã·ã¹ãã ããããšãã°ã€ã³ã¿ãŒããããã©ãŠã¶ãŒãšåãããã䜿ãããããã®ã«ãããã£ãã®ã§ãã 1åãŸãã¯2åã®ã¯ãªãã¯ã§ç®çã®ããŒãžã«ç§»åããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãåç
§ããŠãã ããã ã¢ããªã±ãŒã·ã§ã³å
šäœã«ã·ã³ãã«ã§æ確ãªã¡ã«ããºã ããã£ãããšã
ãã®èšäºã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãä»ããŠããã²ãŒã·ã§ã³ãå®è£
ããããã®ãªãã·ã§ã³ã®1ã€ã段éçã«æ€èšãã解決ããå¿
èŠã®ããã¿ã¹ã¯ãšãããããããçµæã説æããŸãã
ã¯ããã«
åãšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã·ã¹ãã ã®ãšã³ãã£ãã£éã®é¢ä¿ãå®çŸ©ããç¬èªã®ãã¡ã€ã³ã¢ãã«ããããŸãã ãšã³ãã£ãã£ã¯ã1察1ã1察å€ãå€å¯Ÿå€ã®ç°ãªãé¢ä¿ã§æ¥ç¶ã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ãã¡ã€ã³ã¢ãã«ããããšããŸãããã

åãšã³ãã£ãã£ã¯ãCRUDãã¬ããŒããã°ã©ããããŒãã«å
ã®ãªã¹ããªã©ãããŸããŸãªãã¥ãŒã«é¢é£ä»ããããšãã§ããŸãã ãŸãããã¥ãŒã¯äžåºŠã«è€æ°ã®ãšã³ãã£ãã£ã衚瀺ã§ããŸããããšãã°ã次ã®å³ã«ç€ºãããã«ãBãã¥ãŒã¯ã¯ã©ã¹BãDãããã³Eã®ãšã³ãã£ãã£ã§æ©èœããŸãã

ãã¡ã€ã³ã¢ãã«ã¬ãã«ã®é¢ä¿ã«åŸã£ãŠããŠãŒã¶ãŒã¯å¯Ÿå¿ãããã¥ãŒéã移åã§ããŸããããšãã°ãäžå³ã«ç€ºãããã«ããã¥ãŒBãããã¥ãŒCãFãFã®é ã«ç§»åã§ããŸãã

ãŸãããŠãŒã¶ãŒã¯ãã¥ãŒAã§äœæ¥ãéå§ãããã§ãŒã³ãäžã£ãŠãã¥ãŒEã«é²ãããšãã§ããŸãã

ãŸãã¯ããã¬ãŒã³ããŒã·ã§ã³Eããäœæ¥ãéå§ãããã¬ãŒã³ããŒã·ã§ã³Aã«ç§»è¡ããå¥ã®ãªãã·ã§ã³ã

ã¢ããªã±ãŒã·ã§ã³ã«éåžžã«å€ãã®ç°ãªãããã²ãŒã·ã§ã³ãªãã·ã§ã³ãå®è£
ããã«ã¯ãæåã«ãã¯ãããžã決å®ããããšããå§ãããŸãã
MVCãŸãã¯ã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯
次ã®ãããžã§ã¯ãã®Webãã¬ãŒã ã¯ãŒã¯ãéžæããŠãã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯ã«åºã¥ãããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãéçºããå©ç¹ãšãWebã¢ããªã±ãŒã·ã§ã³ãäœæããMVCãã¬ãŒã ã¯ãŒã¯ã®å©ç¹ãçµã¿åãããããšæããŸããã ã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯ãããããŸããŸãªãã©ãŒã ãããŒãã«ãã°ã©ããããã³ãã®ä»ã®ã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãç°¡åã«äœæããããããStrutsãŸãã¯Spring Web Flowã§å®è£
ãããåæ§ã®ååã«åŸã£ãŠãå€éšæ§æã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããã²ãŒã·ã§ã³ãå¶åŸ¡ããæ©èœãšçµã¿åãããŸãã
Vaadinã¯ã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯ãšããŠéžæãããŸããããSpring Web Flowã®ãããªããã²ãŒã·ã§ã³ã«é©ããå®è£
ã¯ãããŸããã§ããã VaadinãšSpring Web Flowèªäœãçµ±åããè©Šã¿ã¯ãèŠæ±/å¿çã¢ãã«ã®ã¡ã«ããºã ã«å€§ããªéãããããã倱æããŸããã ãã®ãããèŠæ±/å¿çã¢ãã«ã«äŸåããªãç¬èªã®ããŒãžã§ã³ã®Web Flowãå®è£
ããããšã決å®ãããŸããã
åºç€ã¯
UML Statechartãæ¡çšããLexaden Web Flowãå®è£
ããŸããã Statechartãã³ã³ããŒãã³ãã¢ãã«ã«ãªã³ã¯ããã¡ã«ããºã ãäœæããããããç¶æ
ã«å¿ããŠã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®é åã§èŠèŠçãªã³ã³ããŒãã³ããåãæ¿ããããšãã§ããŸããã
次ã®å³ã¯ãLexaden Web Flowã®äž»èŠã³ã³ããŒãã³ãã瀺ããŠããŸãã

ã€ãã³ãããã»ããµ
ã€ãã³ãããã»ããµã¯ãã·ã¹ãã å
ã®ãã¹ãŠã®ã³ã³ããŒãã³ããããããéä¿¡ããããã«äœ¿çšããã€ãã³ãããã»ããµã§ãã ãŸããã€ãã³ãããã»ããµã䜿çšããŠã¡ã¿æ
å ±ã«ã¢ã¯ã»ã¹ããçŸåšå©çšå¯èœãªã€ãã³ããšããã²ãŒã·ã§ã³ããã»ã¹ã®ç¶æ
ãå€æããŸãã
Lexaden WebãããŒãšã³ãžã³
ãšã³ãžã³ã¯ãã€ãã³ãããã»ããµããåä¿¡ããã€ãã³ãã«å¿çãã以åã«åä¿¡ããæ§æã«åŸã£ãŠç¶æ
éã®é·ç§»ããã»ã¹ãå®è£
ããŸãã
ç¶æ
ã³ã³ãããŒã©ãŒ
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ç¶æ
ã³ã³ãããŒã©ãŒã¯ãLexaden Web Flowãšã³ãžã³ããã®ã€ãã³ãã«å¿çããã³ã³ãããŒã©ãŒããåä¿¡ãããã¥ãŒãã¢ããªã±ãŒã·ã§ã³ã¬ã€ã¢ãŠãã«åã蟌ã¿ãŸãã ãŸããããããã²ãŒã·ã§ã³ç¶æ
ããå¥ã®ããã²ãŒã·ã§ã³ç¶æ
ãžã®ç§»è¡ã«é¢ããã€ãã³ããã³ã³ãããŒã©ãŒã«æž¡ãããšãæ
åœããŠããŸãã
éå§ãã
Lexaden Web FlowãåããŠäœ¿çšããã«ã¯ã2ã€ã®ç¶æ
ãåããã€ãã³ãéã§ã¢ããªã±ãŒã·ã§ã³ããã«ãåãæ¿ããããšãã§ããŸãã

ãããXMLã§ã©ã®ããã«å®è£
ããããã®äŸïŒ
<flow initial="Panel1" ...> <controller id="Panel1"> <on event="panel2" to="Panel2"/> </controller> <controller id="Panel2"> <on event="panel1" to="Panel1"/> <on event="ok" to="OK"/> </controller> <final id="OK"/> </flow>
ãPanel1ãã³ã³ãããŒã©ããã®ã€ãã³ããçºçãããšãã¢ããªã±ãŒã·ã§ã³ã¯ãPanel2ããåãæ¿ããŠè¡šç€ºãããã®éãåæ§ã§ãã ãokãã€ãã³ããçºçãããšãããã°ã©ã ã®å®è¡ã¯çµäºããŸãã
次ã«ãããè€éãªäŸãèŠãŠã¿ãŸãããããã¡ã€ã³ãšã³ãã£ãã£ãpersonããååŸããCRUDæäœãå®è£
ããŠãåæäœãåå¥ã®ç¶æ
ã«å¯Ÿå¿ããã³ã³ãããŒã©ãŒã«ãã£ãŠå¶åŸ¡ãããããã«ããŸãã
<flow initial="list" ...> <module id="person"> <controller id="list"> <on event="create" to="create"/> <on event="read" to="read"/> <on event="update" to="update"/> <on event="delete" to="delete"/> </controller> <controller id="create"> ... </controller> <controller id="read"> ... </controller> <controller id="update"> <on event="updated" to="list"/> <on event="canceled" to="list"/> </controller> <controller id="delete"> ... </controller> </module> </flow>
ããããåé¡ããããŸãã ãäœæãããèªã¿åããããæŽæ°ãããåé€ãã®åã³ã³ãããŒã©ãŒããããªã¹ããã³ã³ãããŒã©ãŒã«æ»ãæ¹æ³ æãæãããªããšã¯ãåã³ã³ãããŒã©ãŒã®ãªã¹ãã³ã³ãããŒã©ãŒãžã®æ瀺çãªé·ç§»ãèšå®ããããšã§ãã
<on event="updated" to="list"/> <on event="canceled" to="list"/>
ãããããã®ãããªãªãã·ã§ã³ã¯ããäœæãããèªã¿åããããæŽæ°ããããã³ãåé€ãã³ã³ãããŒã©ãŒãããªã¹ããã³ã³ãããŒã©ãŒã«ãªã³ã¯ããŸããããã«ãããäŸãã°ãèªã¿åããã³ã³ãããŒã©ãŒãããæŽæ°ããŸãã¯ãåé€ãã³ã³ãããŒã©ãŒãåå©çšã§ããªããªããŸãã ãèªã¿åãããããæŽæ°ãã³ã³ãããŒã©ã«ããã«åãæ¿ããããšãã§ããå Žåããèªã¿åããã³ã³ãããŒã©ããããªã¹ããã«åãæ¿ããŠãæŽæ°ãã«åãæ¿ããçç±ã¯äœã§ããïŒ
解決çã¯ãåã³ã³ãããŒã©ãŒå
ã«ãæçµãç¶æ
ãè¿œå ããŠãã€ãã³ããå€éšã³ã³ãããŒã©ãŒã§ã¯ãªããããã«éãããããã«ããããšã§ãã
<controller id="create"> <on event="created" to="created"/> <on event="canceled" to="canceled"/> <final id="created"/> <final id="canceled"/> </controller> <controller id="update"> <on event="updated" to="updated"/> <on event="canceled" to="canceled"/> <final id="updated"/> <final id="canceled"/> </controller>
æçµç¶æ
ã«ç§»è¡ãããšãLexaden Web Flowã¯ãã³ã³ãããŒã©ãŒãåäœãåæ¢ããLWFãçŸåšã®ã³ã³ãããŒã©ãŒã®ååãšæçµç¶æ
ã®ååã§æ§æãããã¡ãã»ãŒãžã䜿çšããŠå¶åŸ¡ãåã®ã³ã³ãããŒã©ãŒã«è»¢éããããšãå ±åããŸãã ããšãã°ããupdate.updatedãããupdate.canceledãããŸãã¯ãcreate.createdãã¯ãåäœãçµäºããã³ã³ãããŒã©ãŒã®æäœã®çµæãšããŠäœ¿çšãããŸãã
ããŒã¹ã³ã³ãããŒã©ãŒ
ã³ã³ãããŒã©ãŒããã³ã³ãããŒã©ãŒã«ç§»åãããã³ã«ããã¥ãŒãåäœæããå¿
èŠããããŸãã ãã®ãããã³ã³ãããŒã©ãŒã«æ»ã£ããšãã«ãããŒãã«ããã©ãŒã ãå床äœæããå¿
èŠããªãã£ãããããã¹ãŠã®ã³ã³ãããŒã©ãŒãç¶æ¿ãããç¹å¥ãªããŒã¹ã³ã³ãããŒã©ãŒãäœæãããŸããã 圌ã®è²¬ä»»ã«ã¯ãã³ã³ãããŒã©ãŒã®åºæ¬ã©ã€ããµã€ã¯ã«ã®æ±ºå®ãå«ãŸããŸãã
åºæ¬çãªã³ã³ãããŒã©ãŒã¯ããã¢ã¯ã·ã§ã³ãç¶æ
ãšããã¥ãŒãç¶æ
ã§æ§æãããŸãã ã¢ã¯ã·ã§ã³ç¶æ
ã¯ããã¬ãŒã³ããŒã·ã§ã³ãåæåãããã¡ã€ã³ã¢ãã«ããããŒã¿ãååŸããŸãã ãã¥ãŒã¹ããŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã§ãã¥ãŒã衚瀺ããå¿
èŠãããææãå€æããããã«äœ¿çšãããŸãã
<controller id="controller" initial="initView"> <action id="initView" extends="action"> <on to="loadData"/> </action> <action id="loadData" extends="action"> <on to="displayView"/> </action> <view id="displayView" extends="view"> <on event="ok" to="ok"/> <on event="close" to="close"/> <on event="cancel" to="canceled"/> </view> <final id="close" extends="action"/> <final id="canceled" extends="action"/> <final id="ok" extends="action"/> </controller>
ã¢ã¯ã·ã§ã³-ãinitViewãã¯ãã³ã³ãããŒã©ãŒã®ãã¥ãŒãåæåããããã«äœ¿çšãããŸããã³ã³ãããŒã©ãŒããã¥ãŒãäœæããåŸããã¥ãŒã«ããŒã¿ãããŒãããããã«äœ¿çšãããã¢ã¯ã·ã§ã³ãloadDataãã«é²ã¿ãŸããã¢ããªã±ãŒã·ã§ã³ã
ãokãããcloseãããŸãã¯ãcancelãã®ã€ãã³ãã§ã¯ããdisplayViewãããã³ã³ãããŒã©ãŒã察å¿ããæçµç¶æ
ã«åãæ¿ãããŸãã ããã¯ãã³ã³ãããŒã©ãŒãäœæ¥ãå®äºããããšãæå³ããŸãã

ãã¢ã¯ã·ã§ã³ãç¶æ
ã察å¿ããJavaã³ã³ãããŒã©ã®ã¡ãœããã«ãã€ã³ãããã«ã¯ã泚éã䜿çšãããŸãã
@OnEnterState(EventConstants.INIT_VIEW) public void initView(StateEvent event) { ... }
ãã®å Žåãã³ã³ãããŒã©ãŒãåäœäžã«ãinitViewãç¶æ
ã«å
¥ããšãinitViewã¡ãœãããåŒã³åºãããOnEnterStateã¢ãããŒã·ã§ã³ã«ãã£ãŠç¶æ
ã®ååãããŒã¯ãããŸãã ãŸããå¥ã®ã³ã³ãããŒã©ãŒã«ãã£ãŠã¹ããŒãããã€ãã³ãã¯ããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸãã ã€ãã³ãã«ã¯ãããšãã°ãåã®ç»é¢ã§éžæãããªããžã§ã¯ãã®èå¥åãªã©ãä»»æã®ããŒã¿ãå«ããããšãã§ããŸãã ãããŠãèå¥åé¢é£ããŒã¿ãããŒãããããã«äœ¿çšãããŸãã
åæ§ã«ãã¢ããªã±ãŒã·ã§ã³ãã衚瀺ãç¶æ
ã«ãªã£ããšãã«ã€ãã³ãããµãã¹ã¯ã©ã€ãã§ããŸãã
@OnEnterState(EventConstants.DISPLAY_VIEW) public void refreshTable(StateEvent event) { ⊠}
ããã¯ããŠãŒã¶ãŒããdisplayViewãç¶æ
ã«æ»ããã³ã«ãããŒãã«ãŸãã¯ãã©ãŒã ã®ããŒã¿ãæŽæ°ããããã«äœ¿çšã§ããŸãã
ã¢ãžã¥ãŒã«
äŒæ¥ã¢ããªã±ãŒã·ã§ã³ã«ã¯å€ãã®ã³ã³ãããŒã©ãŒãååšããå¯èœæ§ããããããããããã¢ãžã¥ãŒã«ã«çµåããããšããå§ãããŸãã ã¢ãžã¥ãŒã«ãäºãã«ç¬ç«ãããã€ãã³ããéããŠã®ã¿æ
å ±ã亀æããŸãã ããšãã°ããordersãã¢ãžã¥ãŒã«ããããgo_addressesãã€ãã³ãã«ãã£ãŠãaddressesãã¢ãžã¥ãŒã«ã«ç§»åã§ããŸãã

ãã®ãããããšãã°ãCRUDæäœçšã®äžé£ã®ã³ã³ãããŒã©ãŒãçµã¿åãããŠã¢ãžã¥ãŒã«ã«ããããšãã§ããŸããããšãã°ïŒ
<module id="addresses" initial="list"> ... <controller id="list" ⊠> <on event="go_create" to="create"/> <on event="go_read" to="read"/> <on event="go_update" to="update"/> <on event="go_delete" to="delete"/> </controller> <controller id="create" ⊠> ⊠</controller> <controller id="read" ⊠> ⊠</controller> <controller id="update" ⊠> ⊠</controller> <controller id="delete" ⊠> ⊠</controller> ... </module>
ãã¢ãã¬ã¹ãã¢ãžã¥ãŒã«ã«å
¥ããšãã¢ããªã±ãŒã·ã§ã³ã¯ããªã¹ããã³ã³ãããŒã©ãŒã«ç§»åããŸãã 察å¿ããJavaã³ã³ãããŒã©ãŒã¯ãããšãã°æ¬¡ã®ã³ãŒãã䜿çšããŠãLexaden Web Flowã®ã³ã³ãããŒã©ãŒã«ãã€ã³ããããŸãã
flowControllerContext.bindController("addresses/list", âcontentâ, new AddressesListController ()); flowControllerContext.bindController("addresses/create", âcontentâ, new AddressesCreateController ()); flowControllerContext.bindController("addresses/read", âcontentâ, new AddressesReadController ()); flowControllerContext.bindController("addresses/update", âcontentâ, new AddressesUpdateController ()); flowControllerContext.bindController("addresses/delete", âcontentâ, new AddressesDeleteController ());
ç¹å®ã®ãã¥ãŒïŒAddressesListViewïŒã¯AddressesListControllerã«é¢é£ä»ããããŠãããã¢ããªã±ãŒã·ã§ã³ããã¢ãã¬ã¹/ãªã¹ããç¶æ
ã«ãªããšã¢ã¯ãã£ãã«ãªããŸãã åæ§ã«ãä»ã®ã³ã³ãããŒã©ãŒã®ãã¥ãŒã¯ããäœæãããèªã¿åããããæŽæ°ãããåé€ãç¶æ
ã«ãã€ã³ããããŠããŸãã ããªã¹ããç¶æ
ã«ã¢ã¿ãããããã³ã³ãããŒã©ãŒããã®ã€ãã³ãã«å¿ããŠãã¢ããªã±ãŒã·ã§ã³ã¯å¯Ÿå¿ãããäœæãããèªã¿åããããæŽæ°ããŸãã¯ãåé€ãç¶æ
ã«åãæ¿ããã察å¿ããè¡šçŸããŠãŒã¶ãŒã«è¡šç€ºããŸãã

CRUDïŒãã¡ã€ã³ãªããžã§ã¯ãã®åºæ¬æäœ
ã·ã¹ãã å
ã®ã»ãšãã©ã®ãã¡ã€ã³ãªããžã§ã¯ãã¯ãListãCreateãReadãUpdateãDeleteãªã©ã®åãæäœããµããŒãã§ãããããããã²ãŒã·ã§ã³ããžãã¯ãå¥ã®ã¢ãžã¥ãŒã«ïŒãcrudãïŒã§å®çŸ©ããŠããç¶æ¿ããã¢ãžã¥ãŒã«ãäœæãããšããã§ãããã CRUDæäœãèªåçã«ãµããŒãããããŸããŸãªãã¡ã€ã³ãªããžã§ã¯ãçšã
<module id="crud" initial="list" ...> <controller id="list" extends="controller"> <on event="create" to="create"/> <on event="read" to="read"/> <on event="update" to="update"/> <on event="delete" to="delete"/> </controller> <controller id="create" extends="controller"> ⊠</controller> <controller id="read" extends="controller"> ⊠</controller> <controller id="update" extends="controller"> ⊠</controller> <controller id="delete" extends="controller"> ⊠</controller> </module> <module id="orders" extends="crud" > <on event="go_account" to="account"/> <on event="go_addresses" to="addresses"/> </module> <module id="account" extends="crud"/> <module id="addresses" extends="crud"/>
ãordersãããaccountãããaddressesãã¢ãžã¥ãŒã«ã¯ãäžèšã§å®çŸ©ãããcrudãã¢ãžã¥ãŒã«ããç¶æ¿ãããCRUDç¶æ
éã®é·ç§»ããžãã¯ã®ã³ããŒãèªç±ã«ååŸã§ããŸãã ããã§ãæ°ããã¢ãžã¥ãŒã«ã®äœæãéåžžã«ç°¡æœã«ãªããã·ã¹ãã ã®éçºããã»ã¹ã§æ°ããã¢ãžã¥ãŒã«ãç°¡åã«è¿œå ã§ããŸãã
èªã¿åãå°çš+ CRUDïŒè¡šç€ºããã³ç·šéããæš©å©ã®å·®å¥å
ã¢ããªã±ãŒã·ã§ã³ã§ãã¡ã€ã³ãªããžã§ã¯ãã®ç¹å®ã®æäœãžã®ã¢ã¯ã»ã¹ãåºå¥ã§ããããã«ããããã«ãCRUDããèªã¿åãå°çšããšãcrudãã®2ã€ã®ã¢ãžã¥ãŒã«ã«åå²ã§ããŸãã ãã®å Žåããreadonlyãã¯èªã¿åãå°çšã«ããcrudãã¯ã¢ããªã±ãŒã·ã§ã³ãšã³ãã£ãã£ã®å®å
šãªç·šéã«äœ¿çšãããŸãã
<module id="readonly" initial="list" extends="module"> <controller id="list" extends="controller"> <on event="read" to="read"/> </controller> <controller id="read" extends="controller"/> </module> <module id="crud" initial="list" extends="readonly"> <controller id="list" extends="readonly/list"> <on event="create" to="create"/> <on event="update" to="update"/> <on event="delete" to="delete"/> ... </controller> <controller id="create" extends="controller"> ⊠</controller> <controller id="read" extends="controller"> ⊠</controller> <controller id="update" extends="controller"> ⊠</controller> <controller id="delete" extends="controller"> ⊠</controller> </module> <module id="orders" extends="readonly" > <on event="go_account" to="account"/> <on event="go_addresses" to="addresses"/> </module> <module id="account" extends="crud"/> <module id="addresses" extends="crud"/>
泚æã¢ãžã¥ãŒã«ã¯èªã¿åãå°çšã¢ãžã¥ãŒã«ããç¶æ¿ãããããããŠãŒã¶ãŒã¯æ³šæã®ãªã¹ãã衚瀺ããŠå泚æãåå¥ã«è¡šç€ºã§ããŸãããããããäœæãç·šéããŸãã¯åé€ããããšã¯ã§ããŸããã ãcrudãã¢ãžã¥ãŒã«ãç¶æ¿ãããaccountãããã³ãaddressesãã¢ãžã¥ãŒã«ã«ããããŠãŒã¶ãŒã¯ãšã³ãã£ãã£ã衚瀺ãäœæãæŽæ°ãåé€ã§ããŸãã
ããã«ãŒïŒã¢ãžã¥ãŒã«ãåå©çšããŠãªã¹ãããå€ãéžæãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãç¹å®ã®èšå®ã§å€ãã®ç°ãªãããŒãã«ã䜿çšã§ããŸãã ååãšããŠããããã¯CRUDã¢ãžã¥ãŒã«ã®ããªã¹ããç¶æ
ã«æ·»ä»ãããŸãã ãããããããã®æ§æã¯ãã€ãã³ãããèªã¿åãããããšãã«ã³ã³ãããŒã©ãŒã«ãèªã¿åããããããã«èšå®ãããŸãã ç¶æ¿ã䜿çšãããšãããŒãã«ãåå©çšããŠãªããžã§ã¯ãã®ãªã¹ãã衚瀺ã§ããã ãã§ãªããããŒãã«ããå€ãéžæããããšãã§ããŸãã ãããè¡ãã«ã¯ããcrud / listãã³ã³ãããŒã©ãŒããç¶æ¿ããããcrudãã¢ãžã¥ãŒã«ã«ãpickerãã³ã³ãããŒã©ãŒãè¿œå ããŸãã
<module id="crud" initial="list"...> ⊠<controller id="picker" extends="crud/list"> <on event="read" to="picked"/> <final id="picked" extends="action"/> </controller> </module>
ã³ã³ãããŒã©ãŒ-ãããã«ãŒãã¯ãcrud /ãªã¹ãããç¶æ¿ãããèªã¿åããã€ãã³ãããªãŒããŒã©ã€ãããŠãæçµç¶æ
ããªãã€ã¬ã¯ããã«ãªãã€ã¬ã¯ãããŸãã ããã«ãããããŒãã«å
ã®è¡ãã¯ãªãã¯ããŠåã®ç»é¢ã«æ»ããéžæãããªããžã§ã¯ãã®èå¥åãæã€picker.pickedã€ãã³ããååŸã§ããŸãã åã®ç»é¢ã®ã³ã³ãããŒã©ãŒã§ãã£ããããŠãããããããŠã³ãªã¹ããªã©ã®å
容ãæŽæ°ããŸãã

ããã«ããã®ã¡ã«ããºã ãå®éã«äœ¿çšããã«ã¯ããªã¹ãå
ã®å€ãéžæããã€ãã³ããã¢ãžã¥ãŒã«ã§æ±ºå®ããå¿
èŠããããŸãã
<module id="orders" extends="readonly" > <on event="go_account" to="account"/> <on event="go_addresses" to="addresses"/> <on event="select.account" to="account/picker"/> <on event="select.addresses" to="addresses/picker"/> </module> <module id="account" extends="crud"/> <module id="addresses" extends="crud"/>
ã¢ãžã¥ãŒã«ãordersãããã®ã€ãã³ããselect.accountããšãselect.addressesãã«ã¯ããaccount / pickerããšãaddresses / pickerããžã®é·ç§»ããããããŒãã«ããå¿
èŠãªãªããžã§ã¯ããéžæã§ããŸãã

ããã«ãŒã¡ã«ããºã ã䜿çšãããšãããŒãã«ãåå©çšããŠå€ãéžæã§ããã ãã§ãªããCRUDã¢ãžã¥ãŒã«ã®æ©èœã䜿çšããŠãå¿
èŠã«å¿ããŠãªã¹ãå
ã®ãšã³ãã£ãã£ãäœæãæŽæ°ããŸãã¯åé€ã§ããŸãã
ãããã¡ã€ã«-ã°ã«ãŒãã¢ãžã¥ãŒã«
äŒæ¥ã·ã¹ãã ã¯æ°åãŸãã¯æ°çŸã®ç°ãªããã¡ã€ã³ãªããžã§ã¯ãã§æ§æã§ãããããéåžžã«å€ãã®ããã²ãŒã·ã§ã³ã¢ãžã¥ãŒã«ãååšããå¯èœæ§ããããŸãã ã¢ãžã¥ãŒã«ã®ç°ãªãã»ãããç°ãªãããŒã«ïŒç®¡çè
ããããŒãžã£ãŒãããã³çµç¹ã®ä»ã®åŸæ¥å¡ïŒã䜿çšã§ãããããããšãã°æ¬¡ã®å³ã«ç€ºãããã«ããããã¡ã€ã«ã«çµåãããŸãã

ãããã¡ã€ã«ã¯ãã·ã¹ãã å
ã®ç¹å®ã®åœ¹å²ã«é¢é£ä»ããããã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ãã ããšãã°ã管çè
ãããã¡ã€ã«ã¯ã·ã¹ãã å
ã®ãã¹ãŠã®æ©èœã«ã¢ã¯ã»ã¹ã§ããŸããã顧客ãéãããæ©èœã®ã¿ã«ã¢ã¯ã»ã¹ã§ããå Žåãããšãã°æ³šæãè¡ãå Žåã泚æã®ã¹ããŒã¿ã¹ã確èªããŸãã

以äžã¯ããããã¡ã€ã«å
ã®ã¢ãžã¥ãŒã«ã®æ§æäŸã§ãã
<profile id="customer" ...> ⊠<module id="orders" ⊠> <on event="go_account" to="account"/> <on event="go_addresses" to="addresses"/> </module> <module id="account" ⊠> </module> <module id="addresses" ⊠> </module> ⊠</profile>
ã¢ãžã¥ãŒã«èªäœãäºãã«ç¬ç«ãããŸãŸã§ãä»ã®ãããã¡ã€ã«ã§åå©çšã§ããããã«ããããã¡ã€ã«ã¬ãã«ã§ã¢ãžã¥ãŒã«éã®ç§»è¡ãæå®ããããšãæãŸããã§ãã
åãã¢ãžã¥ãŒã«ãç°ãªããããã¡ã€ã«ã§åæã«äœ¿çšã§ããããã«ãLexaden Web Flowã¯ç¶æ¿ããµããŒãããŠããŸãã ããšãã°ãæäžäœã§ãt_addressesãã¢ãžã¥ãŒã«ãå®çŸ©ããããšã§ãããŸããŸãªãããã¡ã€ã«ã«å«ããããšãã§ããŸãã
<flow> ... <profile id="t_admin" ...> ⊠<module id="addresses" extends="t_addresses"> <controller id="list" extends="addresses/list"> <on event="go_export" to="export"/> </controller> <controller id="export" > ... </controller> </module> ⊠</profile> <profile id="t_customer" ...> ⊠<module id="addresses" extends="t_addresses"/> ⊠</profile> <module id="t_addresses" initial="list"> ... </module> ... </flow>
t_adminãããã¡ã€ã«ãšt_customerãããã¡ã€ã«ã¯ããããã¬ãã«ã§å®çŸ©ãããt_addressesã¢ãžã¥ãŒã«ã®ã³ããŒãåãåããŸãã
ãŸããt_adminãããã¡ã€ã«ã®ç¶æ¿ã®å©ããåããŠãã¢ãã¬ã¹ã¢ãžã¥ãŒã«ã¯go_exportã€ãã³ããè¿œå ããããšã§ã³ã³ãããŒã©ãŒã®ãªã¹ãæ©èœãæ¡åŒµããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã¯admin / addresses / exportç¶æ
ã«åãæ¿ãããŸãã ãšã¯ã¹ããŒãçšã®ãã¥ãŒãæã€å¯Ÿå¿ããã³ã³ãããŒã©ãŒã¯ããã¢ãã¬ã¹/ãšã¯ã¹ããŒããã«ãã€ã³ããããŸãã ããªã¢ãŒãã£ãºã ã«ããç¶æ
ã®ç¶æ¿ãå€æããŸããããã«ãããåºæ¬çãªãã³ãã¬ãŒããããŒã¹ãšããŠãã¢ãžã¥ãŒã«ã®åäœãšæ§é ãéžæçã«å€æŽã§ããŸãã
åãç¶æ¿ã䜿çšãããã®ä»ã®ãããã¡ã€ã«ã¯ããã¢ããªã±ãŒã·ã§ã³ãã«å«ãŸããŠããŸãã
<application id="application" ...> ⊠<profile id="admin" extends="t_admin"/> <profile id="manager" extends="t_manager" /> <profile id="team_leader" extends="t_manager" > <on event="go_team" to="team"/> <module id="team"âŠ> ⊠</module> </profile> <profile id="employee" extends="t_employee"/> <profile id="customer" extends="t_customer"/> ⊠</application> <profile id="t_admin" ...> ... </profile> <profile id="t_manager" ...>... </profile> <profile id="t_employee" ...>... </profile> <profile id="t_customer" ...>... </profile>
ã·ã¹ãã å
ã®ãã¹ãŠã®æ¡ä»¶ã¯ç¶æ¿ãšããªã¢ãŒãã£ãºã ããµããŒãããŠãããããããããéåžžã«ç°¡åã«åå©çšã§ããããããªèª¿æŽã®ã¿ãå¯èœã§ãã
ã¡ã€ã³ç¶æ
ã®ãã¢ããªã±ãŒã·ã§ã³ãã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®åºæ¬æ§é ãå®çŸ©ããã¢ããªã±ãŒã·ã§ã³ã¬ã€ã¢ãŠãããã€ã³ãããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
flowControllerContext.bindController("application", new ApplicationLayoutController());
flowControllerContextã®å€éšã³ã³ããã¹ãã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®æ§é ãå
éšã«å«ãApplicationLayoutControllerã¯ããã¢ããªã±ãŒã·ã§ã³ãç¶æ
ã«ãã€ã³ããããŸãã ãã®æ§é å
ã§ã¯ãããããããã¬ãŒã¹ãã«ããŒããå®çŸ©ãããŸãããã®ã¿ã¹ã¯ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã²ãŒã·ã§ã³äžã«ããŸããŸãªãã¥ãŒãæ¿å
¥ãããç¹å®ã®éšåã«ã¢ããªã±ãŒã·ã§ã³ã®ã¬ã€ã¢ãŠããã¬ã€ã¢ãŠãããããšã§ãã

ããšãã°ãLeft SideBarã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã¡ãã¥ãŒãããŽã®ããããŒãæ€çŽ¢ããŒããã°ã€ã³ãã¿ã³ãé
眮ã§ããŸãã Right SideBarã¯ãããŸããŸãªçš®é¡ã®è£å©ãŠã£ã³ããŠã®é
眮ã«åœ¹ç«ã¡ãŸãã ã³ã³ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³æ
å ±ã®åºç€ãšããŠæ©èœããŸãã
ã³ã³ãããŒã©ãŒãç¹å®ã®ç¶æ
ã«æ¥ç¶ãããŠããå Žåãããããã®ãã¬ãŒã¹ãã«ããŒã瀺ãããŸãã
flowControllerContext.bindController("addresses/list", âcontentâ, new AddressesListController ()); flowControllerContext.bindController("addresses/create", âcontentâ, new AddressesCreateController ()); flowControllerContext.bindController("addresses/read", âcontentâ, new AddressesReadController ()); flowControllerContext.bindController("addresses/update", âcontentâ, new AddressesUpdateController ()); flowControllerContext.bindController("addresses/delete", âcontentâ, new AddressesDeleteController ());
ãã¢ãã¬ã¹ãã¢ãžã¥ãŒã«ã«ãã€ã³ãããããã¹ãŠã®ã³ã³ãããŒã©ãŒã¯ããã³ã³ãã³ãããšãããã¬ãŒã¹ãã«ããŒã«ãã€ã³ããããŸãã ããã°ã©ã ã®äœæ¥äžããããã®ã³ã³ãããŒã©ãŒã®è¡šçŸã¯ãã¢ããªã±ãŒã·ã§ã³ã¬ã€ã¢ãŠãã®å¯Ÿå¿ããå Žæã«è¡šç€ºãããŸãã
ãããŒïŒå®è¡ããã»ã¹
ç°ãªããã¡ã€ã³ãªããžã§ã¯ãããéå§ããŠã·ã¹ãã ãããã²ãŒãã§ããããã«ããããã«ãLexaden Web Flowã¯ãããŒã¡ã«ããºã ã䜿çšããŸãã ãããŒãéå§ããã«ã¯ããããã¡ã€ã«ã¬ãã«ã®type =å±æ§ãflowãããonãã¿ã°ã§ç€ºãããŸãã ã¢ããªã±ãŒã·ã§ã³ãããããŒãã¿ã€ãã®ã€ãã³ããã¹ããŒãããšãLexaden Web Flowã¯æ°ããã¹ããªãŒã ãéå§ãããããã§ã«ã¢ã¯ãã£ããªã¹ããªãŒã ã«åãæ¿ããŸãã
<profile id="manager" ⊠/> <on type="flow" event="orders.flow" to="orders"/> <on type="flow" event="account.flow" to="account"/> <on type="flow" event="addresses.flow" to="addresses"/> <module id="orders" extends="readonly" > <on event="go_account" to="account"/> <on event="go_addresses" to="addresses"/> </module> <module id="account" extends="crud"/> <module id="addresses" extends="crud"/> </profile>
ã¢ããªã±ãŒã·ã§ã³ã¡ãã¥ãŒã¯ã次ã®å³ã«ç€ºãããã«ãã¿ãã§ã¹ããªãŒã ãéããããŒã¿ã€ãã§ã€ãã³ããéä¿¡ããããã«äœ¿çšãããŸãã

ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¹ã¬ããã¯éããŠããã¿ãã«ãã€ã³ããããã¢ã¯ãã£ããªãããŒå
ã®ããã²ãŒã·ã§ã³ãã¹ã¯Breadcrumbã³ã³ããŒãã³ãã䜿çšããŠè¡šç€ºãããŸãã

ã³ã³ãããŒã©ã¯éåæé¢æ°ãšããŠæ©èœããŸãã äœæ¥ãå®äºããã«ã¯ãfinalåã®ããã€ãã®å
éšæçµç¶æ
ã®ããããã«ç§»è¡ããå¿
èŠããããŸãã ãã®ç¶æ
ã«ç§»è¡ãããšãLexaden Web Flowã¯ãã³ã³ãããŒã©ãŒã®ååãšã³ã³ãããŒã©ãŒå
ã®æçµç¶æ
ã®ååã§æ§æãããæ°ããã€ãã³ããçæããŸãã ããšãã°ãå
éšæçµç¶æ
ããokãã®ãèªã¿åããã³ã³ãããŒã©ãŒã®å ŽåãLWFã¯ãread.okãã€ãã³ããçæãããã®ã€ãã³ããåã®ãããŒã³ã³ãããŒã©ãŒã«ã¹ããŒããŠãå®è¡çµæãåŠçã§ããããã«ããŸãã
<controller id="list" extends="controller"> <on event="read" to="read"/> <on event="read.ok".../> ... </controller> <controller id="read" extends="controller"> <on event="update" to="update"/> <on event="update.updated" to="updated"/> <action id="updated" extends="action"/> ⊠</controller> <controller id="update" extends="controller"> <on event="updated" to="updated"/> <final id="updated" extends="action"/> </controller>
ã¹ããªãŒã ã¯ãã³ã³ãããŒã©ãŒéããããã£ãŠè¡šçŸéã®é·ç§»ã®ã·ãŒã±ã³ã¹ãèšæ¶ããŸãã
ã¹ã¬ããã®æåŸã®æ®ãã®ã³ã³ãããŒã©ãŒãæçµç¶æ
ã®1ã€ã«å
¥ããšãå®è¡ã®ã¹ã¬ããã¯çµäºããŸãã åæã«ããendFlowãã¿ã€ãã®ã€ãã³ããã¹ããŒãããŸãã 次ã®ããã«åŠçãããŸãã
@OnEvent(type = EventConstants.END_FLOW) public void onCloseTab(StateEvent event) { ... }
ãŸããããšãã°ããããŒã«é¢é£ä»ããããã¿ããéããããã«äœ¿çšã§ããŸãã
Lexaden Web Flowã«åºã¥ããLexaden Administrationã¢ããªã±ãŒã·ã§ã³ã®çµæã¯ã2åç®ãããããªã§èŠãããšãã§ããŸãïŒ
ãã®ãã¯ãããžãŒã䜿çšããããšã®èããããå©ç¹ïŒ
- ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¹ã±ãŒã¹ãèšè¿°ããããã®åºç€ãšããŠäœ¿çšã§ããŸã
- ã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯ã®å Žåãã¡ã¢ãªã®åé¡ãéšåçã«è§£æ±ºãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ç»é¢ãäžæ°ã«ããŒãããã®ã§ã¯ãªãããªã³ããã³ãã§ããŒãžãäœæã§ããŸãã
- 倧èŠæš¡ãªåŠæ ¡ãç
é¢ãéè¡ã®ç®¡çã·ã¹ãã ã®ããã²ãŒã·ã§ã³ã®åé¡ã解決ã§ãã
- 顧客ã«ããã·ã¹ãã ã®ç解ãç°¡çŽ åããã¢ããªã±ãŒã·ã§ã³å
šäœã®ããã²ãŒã·ã§ã³ãçµ±åããŸããããã«ãããå°æ¥ã®ãµããŒãã³ã¹ããåæžã§ããŸãã
- åã
ã®ã¢ããªã±ãŒã·ã§ã³ç»é¢ã®åäœãã¹ããç°¡çŽ åããŸã
- ã·ã¹ãã éçºã¯ãããªã倧ããªéçºè
ããŒã ã䞊è¡ããŠå®è¡ã§ããŸãã
- ãã®ã·ã¹ãã ã¯ãããŸããŸãªé¡§å®¢ãããŸããŸãªåœã®ããŸããŸãªåžå Žã«ããç°¡åã«é©å¿ãããããšãã§ããŸãã
çæïŒ
- æ°ãããã¬ãŒã ã¯ãŒã¯ãåŠã¶å¿
èŠæ§
- å Žåã«ãã£ãŠã¯ãLexaden Web Flowã®ãœãŒã¹ã¬ãã«ã§ããã²ãŒã·ã§ã³ããããã°ããå¿
èŠããããŸã
- å°èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã«ã¯é©ããŠããŸããã
- ã¢ããªã±ãŒã·ã§ã³ãä»ããŠæ§æãå€æŽã§ããããžã¥ã¢ã«ãšãã£ã¿ãŒã¯ãããŸããã
- ããã°ã©ã ã®ã³ã³ãã€ã«ã®æ®µéã§ããã²ãŒã·ã§ã³ã®æ§æããã§ãã¯ã§ããã³ã³ãã€ã©ã¯ãããŸãã
- ãã¢ã¢ããªã±ãŒã·ã§ã³ã¯çŸåšãVaadinã³ã³ããŒãã³ãã¢ãŒããã¯ãã£ã§ã®ã¿äœ¿çšã§ããŸãããLexaden Web Flowã¯ç¹å®ã®ã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯ã«äŸåããŠããŸããã
誰ãããã®ãã¯ãããžãŒã«èå³ãããå Žåã¯ã
Lexaden Web Flowãš
Lexaden Administrationãåçšãããžã§ã¯ãã§èªç±ã«äœ¿çšã§ããŸãã
Apache 2.0ã©ã€ã»ã³ã¹ã®äžã§é
åžãããŸããèšäºã¯éåžžã«èšå€§ã§ããããšãå€æããŸããããããèªãã§éãããæéãããããšããã質åã«ãçãã§ããããšãå¬ããæããŸãã