PlayïŒã®éçºã«é¢ãããã¥ãŒã¹ã奚å±ããåŸ 2.1ãããšãã°LinkedInã§ã¯ã1ã€ã®æ°ãããããžã§ã¯ãã§è©ŠããŠã¿ãããšã«ããŸããã ããã°ãããžãã¹ã§ããããã¹ãããããšã§ãã äœããæ¥ãã®ïŒ ç§ãšPlayã®éã®å°ããªæŠäºã ã£ããšæããŸãïŒ 2.1ã ãªãã§ïŒ ã«ããã®äžã®è©³çްãããã£ãã¡ãªäººã®ããã«ïŒ
ç°¡åãªçµè«
æ»æã®ããã«ãã³ãŒãããŒã ScalaãšåŒã°ããç§å¯ã®æŠåšãåãå¿ èŠããããŸããã Playã«çŽé¢ããå ŽåïŒ ãã¬ãŒã ã¯ãŒã¯2.1ãšãããªãã¯Scalaãã¬ãŒã ã¯ãŒã¯ã§ãïŒããšå€§å£°ã§å«ãã§ãã ãããããããã°ã圌ã¯ãã®ãããªçŽæ¥æ§ãæãã倧ããªãã£ã³ã¹ã®äžçãžã®æãããããã«éããŸãã
ãScalaãç¥ããªãïŒã-ãPlay 1.2ã䜿çšããã
ãScalaã«ç²ŸéããŠããŸããïŒã-ãPlay 2.1ã詊ããŠã¿ãŠãã ããã ãããããŸã ææ ¢ããŠãã ããã
èæ¯
å£ãšçŸãåãã
çŽ9ãæéãç§ã¯Play 1.2.xã䜿çšããŠ1ã€ã®ãããžã§ã¯ãã«åãçµã¿ãŸããã Spring Framework 3ã®åŸã§ããããã¯å·šå€§ãªJava EE 5 + JSFã¯èšããŸã§ããªããéçºã®ã¹ããŒããšå®¹æãã®é ç¹ã®ããã«èŠããŸããã
ãã®åŸãçãäŒæ©ããããGrails 2.xã3ãæééäžçã«äœ¿çšããŠãJavaãGroovyã«æ¯ã¹ãŠå©äŸ¿æ§ãšæ§ææ©èœã®ç¹ã§ã©ã®çšåºŠé ããŠããããçè§£ããŸããã ãããŠããã®Grailsã¯ãçŽç²ãªSpring Framework 3 + Javaãããéçºãããç°¡åã§é«éã§ãã
ããããæ°ãããããžã§ã¯ãã®ãã¬ãŒã ã¯ãŒã¯ãéžæããæãæ¥ãŸããããã®éžæã¯Play 2.1ã«èœã¡ãŸããã ããã¯æ£ããæ±ºæã§ãããïŒ ç¢ºãã«è峿·±ãããæ£ãããã®-ããã¯ãŸã æéã衚瀺ããŸãã
ãããŸã§ã®éãPlay 2.1ã§ã®äœæ¥ã®å°è±¡ãå ±æããããšæããŸãã Play 1.2.xãšã®å€ãã®æ¯èŒããããJavaãšææ ã«ã€ããŠããããŸãã ã³ãŒãã¯ã»ãšãã©ãªããäžè¬ã«åãå ¥ããããŠããçšèªãæŠå¿µã¯ãã·ã¢èªã«ç¿»èš³ãããŸããã ããšãã°ã ã¹ããŒãã¬ã¹ãã¬ãŒã ã¯ãŒã¯ ã
å°è±¡
ããã¥ã¡ã³ãã®æ¬ åŠ
ãã¬ã€ããŒã«IIã®æ¯é è ã«ãã£ãŠæäŸããããããã¯ãå®å šã«ã¯ã»ã©é ããã®ã§ããã äž»èŠéè·¯ã¯éåžžã«æ£ç¢ºã«ç€ºãããŠããŸããããããã®éè·¯ã®åšãã¯éããŸããã è¿·ããªãããã«ããããã«ãç§ã¯å°å ã®äººã ãã€ãã¿ã圌ãã«å€ãã®è³ªåãããªããã°ãªããŸããã§ããã ãšããã§ã圌ãã¯ãšãŠãåãã§çããŸããã
å ¬åŒææžã¯ããªããã¡ã§ãã Play 2 with JavaãšPlay 2 with Scalaã® 2åã®æ¬ããããŸãã æåã®Javaã«ã€ããŠã¯ãåå¿è åãã®ã³ã¡ã³ãä»ãã®å ¬åŒããã¥ã¡ã³ããã»ãŒç¹°ãè¿ããŠããŸãã 2çªç®ã®Scalaã«ã€ããŠã¯ãããå°ã䟿å©ã§ãããšãã°ã第8ç« JSONã䜿çšããåäžããŒãžã®JavaScriptã¢ããªã±ãŒã·ã§ã³ã®äœæãªã©ãå¿ èŠãªãããã¯ãã«ããŒããŠããŸãã
ãã¡ãããå€§èŠæš¡ã§æŽ»çºãªã³ãã¥ããã£ããããŸã ãGoogleã°ã«ãŒããšStackoverflowã®äž¡æ¹ã§å©ããæ±ãããã質åããããã§ããŸã ã ããããäžèŠåçŽãªè³ªåã«å¯Ÿããçããåžžã«æ¢ãå¿ èŠãããå Žåãéçºã®åã³ã¯ãããã倱ãããŸãã
ããã¥ã¡ã³ãã®æ¹åã«ãåå ããŸããïŒ ãã¡ã ïŒããããã«è©³ãã説æãããå ŽæããŸã ãããããããŸãã
Play 1.2.xã§ã¯ãããã¥ã¡ã³ãã¯ããå®å šã§äŸ¿å©ã«ãªããŸããã StackoverflowãšGoogleã°ã«ãŒãã§ã®æ€çŽ¢ã«ã¯ãæ¬åœã«çããããšãããããŸããã§ããã
ã³ã³ãã€ã«é床
ããã®éè·¯ã¯çæ³ããããé¢ããŠããŸãã æã ç§ã¯äœæéãèµ°ããæ³¥ã«andãããããããã«éãèµ°ãããã«éŠ¬ã«æé¡ããŸããã 倧è»ã®ç§»ç±ã«ã¯éåžžã«é·ãæéãããããŸãã ã©ãã§ããã§ãã¯ãã€ã³ããšãã§ãã¯ã®éè·¯ã
å€ãã®äººã«ãšã£ãŠãããã¯ãã¥ãŒã¹ã§ã¯ãããŸããããããã§ã®ã³ã³ãã€ã«ã¯é ãã§ãã Play 1.2.xãããã¯ããã«é ãã ããã§ã¯ãåçŽãªJavaã¯ã©ã¹ããScalaãã³ãã¬ãŒããã³ãŒããŒã¹ã¯ãªãããŸã§ãã»ãšãã©ãã¹ãŠãã³ã³ãã€ã«ãããããšãçè§£ããŠããŸãã ããããããã¯é·ãæéã§ãã æ£æ°ã®ãšã©ãŒã¡ãã»ãŒãžãçºè¡ãããŸãããããã¯é·ãæéã§ãã è¶ é«éã®çæ³çãªããããªãã¬ãã·ã¥ã¯ãŒã¯ãããŒã¯å€±éããè¿·æã§ãã
ããŒã¿ããŒã¹ãæäœãã
æåãªå± äœè ã¯ãèŠå¡ãç¬ç«ããŠæ§ç¯ããæ¹æ³ãç¥ããŸããã 圌ãã¯èšãããšã¯ã§ããŸããïŒãå¥ã®å¡ã建ãŠãŸãããããã«ïŒãã ãã 圌ãã«ã¯è©³çްãªèšç»ãå¿ èŠã§ãã
çµã¿èŸŒã¿ã®ããŒã¿ããŒã¹é²åãšã³ãžã³ããããŸãã ãã ãããããã®ã¹ã¯ãªããã®çæã«ã¯åé¡ããããŸãã Ebeanã¯å®å šãªã¹ã¯ãªãããäœæã§ããŸãããã€ã³ã¯ãªã¡ã³ã¿ã«ã¹ã¯ãªããã«ã¯ãã§ã«åé¡ããããŸãã æ®å¿µãªãããEbeanã®ã¢ããã°
jpa.ddl=update
ã¯èŠã€ãããŸããã§ããã 誰ããç§ã«èšã£ãããç§ã¯éåžžã«å¹žãã«ãªããŸãã LiquiBaseã®Diffã®ã¢ããã°ãŸãã¯é©å¿ãéåžžã«åœ¹ç«ã¡ãŸãã
éãããæ¡é€è ã¯èŠç¥ãã¬ç·ã§ããããšã倿ããã ããŸãããããã«èŠããŸãããäŸçµŠã®äžæãåžžã«åŸ ã£ãŠããŸãã
æŠå¿µãšããŠã®Ebeanã¯éåžžã«åªããŠããŸãã äž»ãªå©ç¹ïŒ
- ã»ãã·ã§ã³ã®æ¬ åŠïŒSessionãEntityManagerãªã©ïŒãããã¯ã¹ããŒãã¬ã¹ãã¬ãŒã ã¯ãŒã¯ã«é©ããŠããŸãã ãã ãããã®ãããããŒã·ã¹ãã³ãã³ã³ããã¹ãããããŸãã
- ããå¹ççãªã¯ãšãªãäœæããããã®éšåãªããžã§ã¯ãã®ãµããŒãã
ç©è°ãéžãåé¡ïŒ
- éšåç㪠JPAãµããŒãã ãã®ãµããŒããçµäºããå Žæãæ£ç¢ºã«ç¥ããçè§£ããå¿ èŠããããŸãã
- ããã¥ã¡ã³ãã®äžè¶³ãšäœ¿çšäŸã
- Hibernateã»ã©æŽ»çºãªéçºã§ã¯ãªããã³ãã¥ããã£ã®èŠæš¡ã倧ãããããŸããã
ããã«ããã©ã³ã¶ã¯ã·ã§ã³ããããŸãã ã³ã³ãããŒã©ã¡ãœããã
@Transactional
ãšããŠããŒã¯ããããšãã§ã
@Transactional
ã ãã ããã³ã³ãããŒã©ãŒã¡ãœãããŸãã¯ã³ã³ãããŒã©ãŒèªäœã®ã¿ã§ãã ãµãŒãããŒãã£ã®ã¯ã©ã¹ã®å Žåã¯ããããèªåã§åŠçããå¿ èŠããããŸãã
äžè¬çã«ãEbeanã¯éåžžã«è峿·±ãã©ã€ãã©ãªã§ãããHibernateãŸãã¯JPAãããåçŽã§çè§£ããããå ŽåããããŸãããæé·äžã®ãããžã§ã¯ãã®ãã¹ãŠã®ããŒãºãæºããååãªå¯èœæ§ãããããšãçãããšã¯ãããŸããã
ãã¡ãããæšæºã®JPAã䜿çšã§ããŸãããPlay 1.2.xã®
Model.find("byName", name)
ãŸãã¯Spring Data JPA 1ãšã®çµ±åã¯ãããŸããã æ°å¹Žåã«æ»ã£ãŠãããããªæ°ãããŸãã
ãšããã§ãEbeanã«ã¯ããã€ãã®éå€§ãªæ¬ ç¹ããããŸããEbeanORMã®äœ¿çšããŒãžã®èŠåã»ã¯ã·ã§ã³ã§ãããã«ã€ããŠè©³ããèªãããšãã§ããŸãã ãŸããã¯ã©ã¹ã«ãã®ãããªææžãã¡ãœãããå°ãªããšã1ã€ããå ŽåãPlay 2.1ã¯getter / setterã®çæã忢ããããã
get
ãŸãã¯
set
å§ãŸãã¡ãœããã®ååãé¿ããå¿ èŠããããŸãã getterã®å Žåã
get
ãšããåèªãçç¥ããŠã
byEmail
ãŸãã¯
byEmail
ãåŒã³åºã
byEmail
ã
ãããã PagingListã¯ã¹ããŒãã¬ã¹ãã¬ãŒã ã¯ãŒã¯ã«ã¯é©çšãããªããããEbeanã®ãã©ãŒæ©èœãšèšã£ãŠãéèšã§ã¯ãããŸããã ãããããã
NoSqlããŒã¿ããŒã¹ã®æäœã«é¢ããŠã¯ãElasticsearchãMongoDBïŒæ°åã§ãïŒãOrientDBã®ãã©ã°ã€ã³ãç°¡åã«èŠã€ããããšãã§ããŸãã ç§ã¯èªåã§äœ¿ã£ãããšããªãã®ã§ããããã®ãã©ã°ã€ã³ã®å質ã«ã€ããŠã¯äœãèšããŸããã
ãã¹ãäž
è»éã®ç¶æ ã確èªããããšã¯ãæµã®ã¹ãã€ã«ãã£ãŠåžžã«ã€ã©ã€ã©ããŸãã å°å ã®åç©ã¯éåã®çµç¹ã劚害ããŸãããµã«ã¯ã³ã³ããããæãããã¿ã¯è¶³ãçµã¿ãæã«ã¯ç¥é¢šã®ã¹ã«ã³ã¯ãèŠã€ãããŸãã
ã¢ãã«ã®åçŽãªåäœãã¹ãããã³ã³ãããŒã©ãŒã®ãã¹ããSeleniumã®äœ¿çšãŸã§ãå€ãã®å¯èœæ§ããããŸãã
ç§ã®ãã¹ãã§ã¯ãããã¥ã¡ã³ãã«èšèŒãããŠããããã«ã¡ã¢ãªå ããŒã¿ããŒã¹ã䜿çšããããšããŸããã
@Before public void setUp() throws Exception { start(fakeApplication(inMemoryDatabase(""))); }
ããããç§ã«ã¯ããã«2ã€ã®åé¡ããããŸããã倧å°ã§ãã
å°ïŒãã¹ãã§ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããæ¹æ³ SpringãGrailsã®
@Transactional
ãããªãã®ã¯èŠã€ãããŸããã§ããã ãã¹ãã§ãã©ã³ã¶ã¯ã·ã§ã³ãéããŠããŒã«ããã¯ããã ãã§ãã äžäŸ¿ã§æªçã
倧ããªåé¡ïŒã¡ã€ã³ããŒã¹ãMySqlã§ãããšããäºå®ãšãã€ã³ã¡ã¢ãªH2ãã¹ãã®ç«¶åã ãã®ãããH2ã¯MySqlã®é²åã¹ã¯ãªãããçè§£ããããšãæåŠããŸãããæ¬¡ã®ãããªããã©ã«ã以å€ã®ããŒã¿ããŒã¹æ§æã䜿çšããŸãã
start(fakeApplication(inMemoryDatabase("login-test")));
æ§æãæå®ããã«
save()
ã¡ãœããã䜿çšãããšãããŒã¿ã®ä¿åå ãäžç¢ºå®ã«ãªããŸãã
ç§ã¯ãã®åé¡ã®è§£æ±ºçã«ã€ããŠæŒ ç¶ãšãã説æãèŠãŠããŸããããããã«ã¯åçŽãã¯ãããŸããã
ãã¹ãã§ããŒã¿ããŒã¹ã®äœæ¥ãæŽçããæ¹æ³ã«é¢ããå ¬åŒææžã«ã¯äœãèšèŒãããŠããŸããã
è¯ãã®ã ãœãŒã¹ã³ãŒãã倿Žãããã³ã«æ©èœãã䟿å©ãªã³ãã³ã
~test
ãŸãã¯
~test-only
ããããŸãã ãã¹ãã®å®è¡ã«å¿ èŠãªæéãç¯çŽããŸãã
ã»ãã¥ãªãã£
ã¹ããŒããã©ãŒãžã«ã¯æãåçŽãªé§ãããããŸããã è·äººã¯ãã£ãšè¯ããã®ãäœããŸãã
æ¿èªããã³èªèšŒæ©èœã¯Play 1.2.xã®ãŸãŸã§ããã
@With
ã¢ãããŒã·ã§ã³ä»ãã®ã¢ã¯ã·ã§ã³ã³ã³ããžã·ã§ã³ãããã
Security.Authenticator
ãšãã®äœ¿ç𿹿³ã®è¯ãäŸããããŸãïŒ èªèšŒããŒãžã®è¿œå ãèªèšŒã·ã¹ãã ã®å®è£ ã»ã¯ã·ã§ã³ã
ãµãŒãããŒãã£ã®ãã©ã°ã€ã³ã¯ããå€ãã®æ©èœãæäŸããŸãã ããšãã°ã DeadboltãŸãã¯SecureSocialã§ãããå°ããªãããžã§ã¯ãã«ã¯ããŸãã«ããã€ãããããã«æããã®ã§ãææžãã®èªèšŒãå®å šã«ç®¡çããŸããã
ãšããã§ãããã¯é©ãã¹ãããšã§ãããPlay 2. 0㯠Authenticity Tokenãªã©ã®äŸ¿å©ãªæ©èœã倱ããŸãããã倱ãããèœåãè£ããµãŒãããŒãã£ã®ãã©ã°ã€ã³ããããŸãã ãã ããPlay 2.1ã§ã¯ãããŒãžã§ã³2.1ã®ãã¬ã¹ãªãªãŒã¹ã§èšåãããŠããããããã¥ã¡ã³ããã»ãšãã©ãªã
filters
ãããã€ã远å ãããŸããã
CSRFFilter
ã ãã«èšåããããã£ã«ã¿ãŒã®äžã§ã 圌ã«ã€ããŠèŠã€ãã£ãå¯äžã®ããšã¯ãScalaã§CSRFãã£ã«ã¿ãŒã䜿çšããæ¹æ³ã説æãããã®æçš¿ã§ãã Play 2.1 + Javaã«é©çšããæ¹æ³ãšé©çšãããã©ããã¯ããŸã ææ¡ããå¿ èŠããããŸãã
äžå®å®æ§
éäžã§æ°æ¥Œã«åºãããããšããããŸããã 圌ããè¿ã¥ããšã圌ãã¯å§¿ãæ¶ããã ãããã«ã¯å¥è·¡ã¯ãããŸããã§ããã
æ°åãå®å šã«æ©èœããã³ãŒããæ©èœããªããªããŸããïŒ ã©ããããã²ãã¿ãŒ/ã»ãã¿ãŒã®ã³ã³ãã€ã«ãšçæãåžžã«æ£ããåäœãããšã¯éããŸããã
play clean
ããããžã§ã¯ããåèµ·åããã®ã«åœ¹ç«ã¡ãŸããã
ç§ãééããæãå¥åŠãªããšã¯ã
JDK 7
æå¹ãªã³ãŒãã¿ã€ã
JDK 7
次ã®ãšãã
JDK 7
ã§ãã
catch (IndexOutOfBoundsException | ArrayStoreException e)
Play 2.1ãå®å šã«æ··ä¹±ãããŸããããšã©ãŒãã¡ãã»ãŒãžããããŸããããããã®è¡ã§ãµãŒããŒãããªãŒãºããã ãã§ããã以äžäœãèµ·ãããŸããã ããã§è³ªåããåçãåŸ ã£ãã
ãã¿ãŒã³
圌ãã¯åœŒãã®é ã§åžãããšãã§ãããããªæ²Œå°ããããŸãã ãããŠã圌ãã¯åžãããšã¯ã§ããŸããã
ççŽã«èšã£ãŠããã³ãã¬ãŒãã广çã«äœ¿çšããã«ã¯ãScalaãååã«çè§£ããããå°ãªããšãScalaã®å 容ãçè§£ããå¿ èŠããããŸãã ããã§ãªããã°ãããã¯ãã¹ãŠã³ãŒãã®çè§£ã§ããªãããªãã¯ã«ãªããŸãã ãããŠã次ã®ããã«æ©èœãããããéåžžã«æ³šæããå¿ èŠããããŸãã
@main(title = "Home") { <h1>Home page</h1> }
ãã®ãããæ°ããè¡ã«
{
ãåå ã§æ¢ã«ãšã©ãŒãçºçããŠããŸãã
@main(title = "Home") { <h1>Home page</h1> }
ãŸãã¯å¥ã®äŸïŒ
// @if(user == null) // , : @if (user == null)
Play 2.0ã§Scalaãã³ãã¬ãŒãã«ã€ããŠåããŠèªãã ãšãã.Netã®éåžžã«äŸ¿å©ãªRazorã®ããã«èŠããã®ã§ããšãŠãå¬ããã£ãã§ãã ç§ã®æèŠã§ã¯ãJavaã®äžçã®å€ãã®ãã³ãã¬ãŒããšã³ãžã³ãããæ¬åœã«äŸ¿å©ã§ãã ãã ãããã¹ãŠã®å ¥åãã©ã¡ãŒã¿ãŒãæåã®è¡ãšããŠå®£èšããå¿ èŠãããããšãå¿ããªãã§ãã ããã ãŸããã³ãŒãå ã§
fullName
倿°ã宣èšããã«ã¯ã次ã®ããã«ããŸãã
@defining(user.getFirstName() + " " + user.getLastName()) { fullName => <div>Hello @fullName</div> }
ãããŠãããã€ãã®ããšãã€ã³ããŒãããããã«å¿ èŠãªãã®ïŒ
@import helper._
ã ããã«å€ãã®ãifsããšãbutsããããããã®äžã§ããªãã¯ããŸãèªç±ã§ã¯ãªããšæããŸãã
äž»ãªå©ç¹ã¯ãScalaãã³ãã¬ãŒããã³ã³ãã€ã«æ®µéã§ã³ã³ãã€ã«ããã³ãã§ãã¯ãããããšã§ããããã«ãããæªæ¿è«Ÿã®ãšã©ãŒãæ»æçãªã¿ã€ããã¹ã®æ°ãæžããŸãã
äžè¬ã«ãPlay 2.1ã§Scalaãã³ãã¬ãŒããè¯ããæªããã¯éèŠã§ã¯ãããŸããããJavascript MVCãã¬ãŒã ã¯ãŒã¯ã人æ°ãéããŠãããæ¬¡ã®ããšãéèŠã«ãªããããèæ¯ã«é ããŠããŸãã
JSONã䜿çšãã
ããããåæ¢ãªæŠå£«ã¯äžè¬çã«åæºããå± é å±ã§é£²ã¿ã«è¡ããŸããã
ç§ã®æèŠã§ã¯ãPlay 2.1ã¯Play 1.2.xã«å°ãè² ããŠããŸãã äž»ãªçç±ã¯ãGsonã®ä»£ããã«ãJavaã§JSONãæäœããããã®ã¡ã€ã³ã©ã€ãã©ãªãšããŠJacksonã䜿çšãããŠããããšã§ãã Play 1.2.xã§GSONã䜿çšããã®ã奜ãã§ããã䟿å©ã§æè»ã§ããã ãžã£ã¯ãœã³ã¯ãŸã£ããç°ãªãæ¹æ³ã§åãå¿ èŠããããŸãã ã©ããããç§ã¯ãŸã åœŒãæ¥œããããã«ãžã£ã¯ãœã³ã®ãã®ã¬ãã«ã®çè§£ã«éããŠããŸããã ãããŠãJSONæååã®ãã£ãŒã«ãåãäºéåŒçšç¬Šã§ãšã¹ã±ãŒãããå¿ èŠããããšããäºå®ã¯ãããæ¯ãã€ãåå ã§ããã
return ok(Json.parse("{\"status\": \"success\"}"));
èªã¿ãããã¯ã»ãšãã©ãããŸããã ç¹ã«ãGrailsã§ã®JSONã®æ±ãããããšæ¯èŒãããšïŒ
render([result: 'fail'] as JSON)
ãã¡ããããã¹ãŠãããã»ã©æªãããã§ã¯ãããŸããããJavaã§ã§ããæåã®ããšã¯2ã®ãããªãã®ã§ãïŒ
ObjectNode result = Json.newObject(); ArrayNode arrayNode = result.putArray("photos"); for (Photo photo : photos) { ObjectNode photoAsJson = arrayNode.addObject(); photoAsJson.put("id", photo.id); photoAsJson.put("guid", photo.guid); } return ok(arrayNode);
ããªãèããããã
ãã ããScalaã®å ŽåãPlay 2.1ã®JSONãµããŒãã¯å€§å¹ ã«æ¹åãããŠããŸãã
Json.obj( "users" -> Json.arr( Json.obj( "name" -> "bob", "age" -> 31, "email" -> "bob@gmail.com" ), Json.obj( "name" -> "kiki", "age" -> 25, "email" -> JsNull ) ) )
ããããGroovyã§ã¯ãããçãã·ã³ãã«ã«èŠããŸãã ããã§ããScalaãXMLã®ããã«ãã€ãã£ãJSONãµããŒãã远å ããããšãæãŸããŸãã
ç§ã¯èªåã®äººçãåçŽåããããšã«æ±ºããéçã¡ãœãããåãã2ã€ã®è¿œå ã¯ã©ã¹ã远å ããŸããã1ã€ã¯
Tuple2
ã¢ããã°ã§ãã
Pair
ããã1ã€ã¯
Map
ã«
Pair
ã眮ãã¯ã©ã¹ã§ãã ãã®çµæãç§ã«ãšã£ãŠã¯ç°¡åã«ãªããŸããã
return ok(toJson(map( pair("status", "fb-logged-in"), pair("user", map( pair("id", fbUser.id), pair("facebookUserId", fbUser.facebookUser.userId), pair("fullName", fbUser.fullName()) )) )));
ã¿ãã«ã«ã€ããŠè©±ããŠããã®ã§ãPlay 2.1ã§ã¯Javaæ©èœã®ãµããŒããPlay 1.2.xã®ã©ã€ãã©ãª
play.libs.F
ããã³ããŒãããŸãã ãã ããããã«ã€ããŠã®å ¬åŒææžã«ã¯èšåãããŠããŸããã Play 1.2.xã®ããã¯ãç£èŠããå¿ èŠããããŸãã
ãã1ã€ïŒPlay 1.2.xããXMLãµããŒããç§»è¡ãããŸãããXMLã®æäœã«
play.libs.XPath
ã䜿çš
play.libs.XPath
ãšéåžžã«äŸ¿å©ã§ãã
ã¡ãŒã«ã§äœæ¥ãã
äŒæžé³©ãšã«ã©ã¹ã¯ãã¹ãŠããã«èŒžå ¥ãããŸãã ç°¡åã«å ¥æã§ããŸãã ãããŠããã¬ããŒã«IIã®æ¯é è ããã¹ãŠã®é³¥ãæã£ããšããåããããŸãã
Play 1.2.xã§ã¯ãªããPlay 1.2.xã§ã¡ãŒã«ãéä¿¡ããããã®çµã¿èŸŒã¿ãµããŒãããã£ããããã¡ãŒã«ã«ã€ããŠå°ãèšããããšæããŸãã ã¡ãŒã«çšã®å ¬åŒãã©ã°ã€ã³ããããŸã ã ããã§ã¯ãäœæè èªèº«ãã¡ãŒã«ãµããŒãã远å ããªãããšã«æ±ºãããšèšã£ãŠããŸãã äŒãããããšããã§ã¯ãããã¯èª°ããèªåã§ã§ããã»ã©ç°¡åã§ã·ã³ãã«ã§ãã Googleã°ã«ãŒãã®å€ãã®è³ªåãšinãããã®èгç¹ã«åè«ããŠããŸãã人ã ã¯Play 2.1ã«Play 1.2.xãããæ©èœãå£ããªãããšãæåŸ ããŠããŸãã
æ§æ
以åã®å¥çŽãå·»ç©ã«æžãããŠããå ŽåãçŸåšã¯å¥ã®èã«æžãããŠããŸãã
泚ç®ã«å€ããäž»ãªããšã¯ã圌ãã
framework ID
ãåé€ããããšã§ãã ããã§ã1ã€ã®å€§ããªæ§æãã¡ã€ã«ã®ä»£ããã«ãããã€ãã®åå¥ã®æ§æãã¡ã€ã«ãå¿ èŠã§ãã è°è«ã®äœå°ãããç¹ãšããŠãåã¢ãããŒãã«ã¯é·æãšçæããããŸãã 以åã«
production
ãéå§ããå ŽåïŒ
play run --%production
ããã¯æ¬¡ã®ããã«ãªããŸãã
play -Dconfig.resource=prod.conf start
ãŸãã
prod.conf
ã¯ããã¬ãã£ãã¯ã¹ãªãã®ãã¹ãŠã®èšå®ãªãŒããŒã©ã€ããå«ãŸããŠããŸãã
IDEçµ±å
ç§ã®æé«ã®éЬãå°å ã®éè·¯ã«è¶³ãæŒã蟌ã¿ãŸããïŒ
ãã¹ãŠã®IDEã®
ã³ãŒããæžãåã³ã ãã§ã¯ååã§ã¯ãããŸããã Play 2.xã¯ããã»ã©åã«ãªãªãŒã¹ãããŠããããIDEã®ãµããŒãã«å€§ããªãªãœãŒã¹ãè²»ããã»ã©äººæ°ãââãªããããããªãããšãçè§£ããŠããŸãã IDEããã®ãã«ããããŸãæåŸ ããªãã§ãã ããã
Play 1.2.xã§ã¯ãããã¯ã¯ããã«åªããŠããŸãã
ã·ã³ãã«ãããªããªã£ã
Playterre Iã®åœãå¥è·¡ã«æºã¡ãŠããŠãéæ³ã®æã®æ³¢ã§å€ãã®ããšãè¡ãããå ŽåãPlayterra IIã«ã¯éæ³ã¯ãªããã·ã£ãã«ãšãçŸãšå£ãããããŸããã
Play 1.2.xã¯éåžžã«ã·ã³ãã«ã§äŸ¿å©ã§ããã äœãšãããèªäœã§å€ãã®ããšãè¡ãããããŸããããŸããã ã¯ããPlay 1.2.xã§ããŸãã«ãå€ããçºçããçæãããããŠéåžžã®Javaã®äžçãšã¯ãŸã£ããç°ãªããšããæèŠãèããŸããããããã¯ç°¡åãç°¡åãè¿ éã«æ©èœããŸããã ãã¹ãŠã®è€éãã¯æ®éã®ãŠãŒã¶ãŒããé ãããŠããŠãæã现å¿ã®æ³šæãæã£ãããã°ã©ããŒã ããè€éãªãœãŒã¹ã³ãŒããæãäžããå¿ èŠããããŸããã
Play 2.1ã§ã¯ãã»ãšãã©ãã¹ãŠã®ãéæ³ãã¯Scalaã«å§ããããŠããŸãã ãããŠããã¯ãã¯ãéæ³ã§ã¯ãªããããã¯Scalaã®æç¢ºã«å®çŸ©ãããäœåã§ãã ããã°ã©ããŒã¯åžžã«ã€ãŸããå¿ èŠããããŸãã ãŸããScalaã®åºç€ããç¥ããªããšãçè§£ããã®ã¯éåžžã«å°é£ã§ãã
楜ãã¿ã®ããã«æ¯èŒããŠãã ããïŒ
public static void index() { render() }
ãããŠ
public static Result login() { return ok( login.render() ); }
æåã®ã³ãŒãã¯ããã·ã³ãã«ã§ãããããã€ãã®èŠåãç¥ã£ãŠåŸãå¿ èŠãããã2çªç®ã®ã³ãŒãã¯ããåé·ã§ãããäœããç¥ã£ãŠåŸãå¿ èŠããããŸãã 2çªç®ã®æ¹æ³ã¯ããæè»ã§ãããåçŽã§ã¯ãããŸããã ç§ã¯å人çã«æåã®ãã®ã奜ãã§ãã
ãšããã§ã
login
2çªç®ã®äŸã§
login
ã©ãæã
login
ãïŒ ããã¯ãscalaãã³ãã¬ãŒãããçæãããã¯ã©ã¹ã§ãã ããã¯ããã®éåžžã«scalaãã³ãã¬ãŒãã®ã³ã³ãã€ã«åŸã«ã®ã¿è¡šç€ºãããŸãã ã€ãŸã IDEã¯ããã®ãããªã¯ã©ã¹ãååšããªãããŸãã¯äœãã倿Žãããšã¡ãœããã·ã°ããã£ãäžèŽããªããšæå¥ãèšããŸãã ã³ã³ãã€ã«åŸãèŠæ ã¯æ¶ããŸãããIDEã®ãã³ãã䜿çšãããšåé¡ãçããŸãã
Playterre Oneã¯ã翌ã®ããåŠç²Ÿãšå æ°ã§ãã£ã±ãã§ããã Playterra IIã«ã¯ãåã®ã¢ãèŠãããšãã§ããã¡ã«ãã«ã«ãŽãŒã¬ã ãããããŸããã
çŽãããªãå©ç¹
å€ãã®å¥åŠãªããšã«ãé¢ããããæ¬ é¥ãšã¯èšããªããŸã§ããPlay 2.1ã«ã¯å€ãã®åŠå®ã§ããªãå©ç¹ããããŸãã
ãã©ãŒã ãšæ€èšŒã®æäœ
ãšãŠãå¿«é©ã§ãã JSR-303ïŒBean ValidationïŒã®å®å šãµããŒãã«å ããŠãç¹å®ã®ãã§ãã¯çšã«ç¬èªã®
validate
ã¡ãœããã远å ããæ©èœã å ¬åŒããã¥ã¡ã³ãã®äŸãæžãæããŸããã ããã§å®å šã«èŠãããšãã§ããŸã ã
ãã³ãã¬ãŒãã®å Žåã
input
ãã£ãŒã«ãã®çµã¿èŸŒã¿çæããããTwitter Bootstrapã®ããŒã¯ã¢ãããããã«çæã§ããŸãã å¯äžã®æ®å¿µã¯ãããŒãžã§ã³1.4ã®å Žåã§ãã ã«ã¹ã¿ã ãžã§ãã¬ãŒã¿ãŒãèšè¿°ããå¿ èŠããããŸãïŒç¬èªã®ãã£ãŒã«ãã³ã³ã¹ãã©ã¯ã¿ãŒã®èšè¿°ã»ã¯ã·ã§ã³ïŒã
Authenticity Tokenãåé€ãããŠããããTwitter Bootstrap 2.3ãã£ãŒã«ããçæãããŠããå Žåãã»ãŒçæ³çã§ãã
Akkaããã³ãã®ä»ã®éåæã®ãã®
å°å ã®å± é å±ãå± é å±ã¯éåžžã«é«éãªãµãŒãã¹ãæäŸããŠããŸãã ãããŠããã¥ãŒã¯ãããŸããã
éåææ§ãšãã«ãã¹ã¬ããã®ãµããŒãã«é¢ããŠã¯ã銬ã«ä¹ã£ãŠ2.1ããã¬ã€ããŸãã éåæHTTPèŠæ±ã®ãã€ãã£ããµããŒã ãšAkkaãšã®çµ±åããããŸãã 颿°ãæäœãããšãã«ãJavaã®åé·æ§ã®ã¿ãå ¬åŒããã¥ã¡ã³ãã«ãèšèŒãããŠããªãå Žå...
ãã æ¯èŒããŠãã ããã JavaïŒ
public static Result index() { Promise<Integer> promiseOfInt = play.libs.Akka.future( new Callable<Integer>() { public Integer call() { return intensiveComputation(); } } ); return async( promiseOfInt.map( new Function<Integer,Result>() { public Result apply(Integer i) { return ok("Got result: " + i); } } ) ); }
ScalaïŒ
def index = Action { val futureInt = scala.concurrent.Future { intensiveComputation() } Async { futureInt.map(i => Ok("Got result: " + i)) } }
Scalaã«åãæ¿ãããã1ã€ã®çç±ã ãŸãã¯äœãä»ã®ãã®ã§ãããJavaããããæ©èœçãã§ãã
ãã ããç«¶åä»ç€Ÿã¯ç ã£ãŠããŸãããGrails2.3ã§ã¯ãéåæã³ã³ãã¥ãŒãã£ã³ã°ã®ãµããŒããéåžžã«åªããŠããŸãïŒ å ¬åŒããã°ã«æçš¿ ïŒã ããã«ãéåæã³ã³ãã¥ãŒãã£ã³ã°ã¯JavaãããGroovyã®æ¹ã䟿å©ã§ããã¯ããŒãžã£ãŒã®ãµããŒãã圹å²ãæãããŸãã
ã¹ã±ãŒã©ããªãã£ãšã¯ã©ãŠã
ããã®åå°ã¯è¥æ²ã§ãã»ãšãã©ãã¹ãŠã®äººå£ãé€ãããšãã§ããŸãã ãããŠãããŸããŸãªåœ¢ã倧ããã®é²ãç©ºã«æµ®ããã§ããŸãã
éåæã§ã¹ããŒãã¬ã¹ãªæ§è³ªã®ãããPlay 2.1ã¯éåžžã«ããŸãã¹ã±ãŒãªã³ã°ãããšèšãããŠããŸãã ãããŸã§ã®ãšãããç§ã®ãããžã§ã¯ãã¯ãã®ãããªããŒãºã«æé·ããŠããªããããèªåã®çµéšããããã確èªããããšã¯ã§ããŸããã
ã¯ããPlay2.xã¯å€ãã®ã¯ã©ãŠããã¹ãã£ã³ã°ãµã€ãã§ãµããŒããããŠããŸãã ããã«ããã€ãã£ããµããŒããã€ãŸã WARãã¡ã€ã«ãäœæããŠTomcat / Jettyã®äžã«ãããã€ããå¿ èŠã¯ãããŸããã
ããã§ãwarãã¡ã€ã«ãåéããå¿ èŠãããå Žåã¯ã ãµãŒãããŒãã£ã®ãã©ã°ã€ã³ã䜿çšããŠã®ã¿ãããè¡ãããšãã§ããŸãã
CoffeeScriptãšå°ãªããµããŒã
å°ããªæªéãããã§é£Œããªããããä»ã§ã¯äººã ã«å¿ å®ã«ä»ããŠããŸãã
CoffeeScriptããã³Lessã®ãã€ãã£ããµããŒãã ããã§äœã远å ãŸãã¯èª¬æã§ãããããããããŸããã 䟿å©ã«ã ããã§ãã ãã¹ãŠãçž®å°ãããšããŠããã©ããåçŽã§ã¯ãããŸãã
.min.js
ã§ã¯ãªã
.min.js
ãããŒãããã ãã§ãã
ããã«ã¯ãŸã åé¡ã¯ãããŸããã
ã³ã³ãœãŒã«
Playterra IIã®å ¥ãå£ã®çšé¢ã¯ãæ°ããåŽåè ãéããŸããã èª°ãæ°ã«ããªããããšã«ãã圌ãã®äœåãèŠãããšã¯ãªãã 圌ããããŸãåãããã«ãããšã誰ã圌ãã«æ³šæãæãããšã¯ãããŸããã
ã³ã³ãœãŒã«ã¯ãPlay 1.2.xãããã¯ããã«äŸ¿å©ã§æ©èœçã«ãªããŸããã ããããããã¯Play 2.1èªäœãããSBTïŒScala Build ToolïŒã®å瞟ã§ãã
䟿å©ã«ãªã£ããã®ããã
~
ã§å§ãŸãã³ãã³ãã«ã€ããŠèšåããããšæããŸãããããã®ã³ãã³ãã¯ããœãŒã¹ã³ãŒãã倿Žããããã³ã«å®è¡ãããŸãã äžèšã®
~test
ã®äŸã
çµæã¯äœã§ããïŒ
Playterra IIã§äŒæããšãããšã¯è峿·±ãã§ãã ããã§ã®ç§»è¡ã«é¢ããåé¡ã¯ãŸã æªè§£æ±ºã®ãŸãŸã§ãã
ç§èªèº«ã®ããã«ãç§ã¯æ¬¡ã®çµè«ãåºããŸããã
- Play 2.1ãæå€§éã«äœ¿çšããã«ã¯ãScalaãååã«çè§£ããå¿ èŠããããŸãã
- Javaã§Webã¢ããªã±ãŒã·ã§ã³ããã°ããäœæããå¿ èŠããããŸããïŒ Play 1.2.xã䜿çšããŠãã ããã ãŸãã¯Grailsã Groovyã¯Scalaã»ã©çè§£ãã«ãããã®ã§ã¯ãããŸããã
- ScalaãåŠã¶å¿ èŠããããŸãã JavaãGroovyãšã®éããéåžžã«å€§ãããããå匷ããå¿ èŠããããŸãã
- Javaã¯ä»ã®ããã°ã©ãã³ã°èšèªã«ã»ãšãã©çµ¶æçã«é ããŠããŸãã 颿°åããã°ã©ãã³ã°ãå§ããåŸãJavaã®ã¿ã§ã³ãŒããæžãããšã«æ»ãããšã¯éåžžã«å°é£ã§ãã ãã¶ããJava 8ã¯ç¶æ³ãæãã§ãããã
[1]-æ£çŽãªãšãããSpringãPlay 2.1ã«çµ±åããããšã¯å¯èœã§ããã ããã»ã©é£ããã¯ãããŸãã ã ã€ãŸã Spring Data JPAããã³Spring Dataã®ä»ã®ãããžã§ã¯ãã¯çè«çã«ã¯è¿œå ã§ããŸããããã®ããŒãã«é¢ããå ·äœçãªäŸãèšäºã¯èŠã€ãããŸããã§ããã åœŒã®æãå±ããŸããã§ããã
[2]-èšäºã®æºåäžã«ã圌ã¯JSONåŠççšã®Java APIãJava EE 7ã«å®è£ ããå¿ èŠãããããšãçºèŠããŸããã Oracleããã°ã®ãã®æçš¿ãã倿ãããšããã®äŸããã䟿å©ã§åªããŠããŸãã Groovyã®JSONãµããŒãã«ååè¿ãã å°æ¥çã«ã¯ããã ãã