• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
クラウド上のサービス開発の新しい動向 --- JavaEE7とPlay2.0 ---
 

クラウド上のサービス開発の新しい動向 --- JavaEE7とPlay2.0 ---

on

  • 3,036 views

 

Statistics

Views

Total Views
3,036
Views on SlideShare
3,026
Embed Views
10

Actions

Likes
4
Downloads
29
Comments
0

3 Embeds 10

https://si0.twimg.com 6
https://twimg0-a.akamaihd.net 3
http://us-w1.rockmelt.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    クラウド上のサービス開発の新しい動向 --- JavaEE7とPlay2.0 --- クラウド上のサービス開発の新しい動向 --- JavaEE7とPlay2.0 --- Presentation Transcript

    • クラウド上のサービス開発の新しい動向 --- JavaEE7とPlay2.0 --- @maruyama097 丸山不二夫
    • Agenda 21世紀の最初の10年に起きたこと 今後の展望とエンタープライズ・クラウドの課題 JavaEE 7 Play 2.0 資料 A) GlassfishのService Deploy B) GlassfishのAmazon EC2へのdeploy C) Play 2.0 Template Overview D) Play 2.0 routesファイル サンプル
    • 21世紀の最初の10年に起きたこと 21世紀の最初の10年が終わった。 この10年の、特に、この数年のITの世界の変 化は目覚ましいものがある。
    • 2001/9/11
    • 2011/3/11
    • 21世紀、最初の10年携帯電話の爆発的普及90 21世紀の最初の10年で、 世界人口の80%が携帯 78.5980 電話を持ち、30%がイン 68.7770 60.3660 ターネットを利用するよう 50.99 携帯電話50 になった。 42.1540 34.21 30.48 27.63 26.8130 22.47 23.55 20.79 18.60 17.6720 15.87 15.00 8 10.62 12.32 14.15 インターネット10 0 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010
    • 21世紀、最初の10年 インターネットの発展とクラウドの登場90 21世紀初頭、Googleの登場を画期に、80 コンシューマ向けのインターネット・ 78.5970 クラウドが成立し、その技術は、 68.77 Amazon,MSにより、エンター 携帯電話 60.3660 50.9950 プライズ向けのクラウド 42.1540 として発展した。 34.21 30.48 27.63 26.8130 22.47 23.55 20.79 18.60 インターネット 17.6720 15.00 15.87 14.15 12.32 10.6210 8 2006年 Amazon EC2/S3 0 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2004年 Google上場 2008年 Microsoft Azure
    • 2005年から2010年までの 世界のトランジスター数の変化IDF2011 Keynoteより 2011/9/13
    • 2007年-2011年クラウド・デバイスの登場90 21世紀の最初の10年の 後半で、スマートフォンが 78.5980 登場し、アメリカでは携帯 68.7770 60.3660 電話全体の30%を占める 携帯電話 50.9950 ようになった。 42.1540 34.21 27.6330 22.4720 15.00 18.60 スマートフォン10 0 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2007年 iPhone, 2008年 Android
    • 2007年-2011年クラウド・デバイスの躍進 21世紀の最初の10年の 後半で、Android、iPhone iPad等のクラウド・デバイス の拡大は急速で、PCを上回 る勢いである。
    • 2011年に起きたこと 昨年2011年に起きたことを振り返る。 2011年は、大きな転換点であったと思う。
    • 新しいネットワーク・メディアのインパクト 2011年1月 チュニジア 中近東・北アフリカでの一連の 2011年2月 エジプト 変化でも、新しいネットワーク・ 2011年3月 リビア メディアは、大きな役割を果た したと言われている。 2011年4月 シリア 2010/02/10 エジプト 2010/04/22 シリア
    • Apple iCloudWWDC 2011 6/6-6/10
    • Facebookユーザー8億人を突破2011年9月22日 f8 1日当たりの利用者数、5億人に達する
    • Amazon Kindle Fire2011年11月14日
    • Google CheckoutのGoogleウォレットへの統合 11月18日 Google ウォレットは、客の支払い情報を安全に 保存する仮想の財布(ウォレット)で、実店舗でも オンラインでも、すばやく支払いを行うことができ る。従来のGoogle Checkout は Google ウォ レットに統合された。 2014年までに50% のスマートフォンが NFCを内蔵するよう になるだろう。 コマース担当副社長 Stephanie Tilenius
    • クラウドとクラウド・デバイス 一年前(2010年)の状況 クラウド・ クラウド マーケット デバイス iTune/Apple × ○ AppStoreGoogle ○ ○ Android MarketMicrosoft ○ ×Amazon ○ ×Facebook × ×
    • クラウド+クラウド・デバイスの 新しいプレーヤの形成 2011年 クラウド・ クラウド マーケット デバイス iTune/Apple ○ ○ AppStoreGoogle ○ ○ Android MarketMicrosoft ○ ○ MarketplaceAmazon ○ ○ AmazonFacebook △ △ ?
    • iPhoneで、AT&Tのトラフィック3年で50倍に ブロードバンドの帯域も、個人によって またたく間に、消費される。 http://bit.ly/1I8Wbd
    • この間、日本では ネットワーク障害があいついだhttp://www.nttdocomo.co.jp/binary/pdf/info/notice/page/120127_00.pdf
    • この間、日本ではネットワーク障害があいついだ
    • 今後の展望とエンタープライズ・クラウドの課題 これから起きるだろうことを考える。 新しいネットワーク・メディアの躍進と新しいネ ットワーク・マーケットの台頭の二つを軸に変 化は進んでゆくだろう。こうした視点から、エン タープライズ・クラウドの課題を考える。
    • 2010年から2015年までの 世界のトランジスター数の予想IDF2011 Keynoteより 2011/9/13
    • ネットワークへの個人の登場にともなって、ネットワーク上の情報は、爆発的に増大を続ける。
    • 新しいネットワーク・メディアと新しいネットワーク・マーケット 巨大なクラウドと膨大な数のクラウド・デバイ スによって、新しいスタイルのコミュニケーショ ンと情報の共有、自由時間の享受を可能とす るネットワーク・メディアが成立しつつある。こう して、旧メディアの没落が始まる。 いままた、無数の個人のネットワーク利用を背 景として、クラウドとクラウド・デバイスの連携 の拡大は、新しいネットワーク上のマーケット、 新しい経済システムを準備しつつある。
    • 数百万コアが集積した巨大なクラウド 無数のクラウド・デバイス
    • コマース市場の拡大新しいネットワーク・マーケットの成立 日常の消費行動を含め、全ての経済行動が、 ネットワーク上で行われるようになる。 これを担うシステムは、これまでのエンタープ ライズ・システムの規模を大きく超えるものに なる。システムの規模拡大は必須である。 全ての処理がリアルタイムで行われる必要は ないのだが、コンシューマ向けのクラウド・サ ービスとは異なって、そのトランザクション処理 には、いくつかの厳しい要請が課せられること になる。
    • コマース市場に対応するエンタープライズ・クラウドの課題 巨大なスケールと厳密なトランザクションが、 コマース市場をターゲットとしたクラウド・サー ビスの新しい課題になる。 コンシューマ向けのクラウドに厳密なトランザ クションを持ち込むか、エンタープライズ・シス テムをスケールさせるか? おそらく可能な対応は後者である。
    • コマース市場に対応するエンタープライズ・クラウドの課題 基本的には、コマース向けのクラウドへのニー ズの高まりは、現在の基幹系システムのクラ ウド化・スケールアウト化の一層の推進によっ て応えられることになるだろう。 コマース市場の拡大に伴って、エンタープライ ズ・クラウドの本当の姿が明らかになる。
    • クラウド受容の現段階 エンタープライズにおけるクラウドの受容は、 意識的には、Hypeを超え、大きく進んだ。 客観的には、かつてのRelational DBや LinuxやJavaの受容と同様に、それは、エン タープライズの周辺部から進行している。 現時点では、エンタープライズ・システムの中 核においては、システムやリソースの統合、管 理コストの削減という観点からのPrivateクラ ウドの構築が関心の焦点である。 次の段階を展望する必要がある。
    • 無数のクラウド技術の並存 その一例 jcloudが対応するクラウド・サービス Amazon Web  Go Grid Services  HP Cloud Services Elastic Block  IBM Developer Store Models Cloud Azure Storage  OpenStack Service  Rackspace BlueLock vCloud  RimuHosting Cloud Sigma  Terremark eCloud Eucalyptus  Terremark vCloud File System Express
    • もっともっと、沢山のクラウド・ベンダーが存在する
    • クラウド技術のオープン化・標準化 クラウド技術が、産業界に広く受け入れられて 行くうえで、他のIT技術と同じように、オープン な業界標準を持つことが必要だという声が、説 得力を持つ段階に近づいている。 クラウド上のデータとアプリケーション・システ ムの双方が、標準的なPortabilityのインター フェースを持つようになるのが望ましい。 クラウド・プレーヤたちは、Interoperability の標準をサポートする必要がある。
    • 企業の生産性向上とクラウド 企業にとってクラウド利用の主要な目的は、ク ラウド上で顧客にサービスを提供すること。 いかに速く、いかに簡単に、堅牢なエンタープ ライズのサービスを開発し、クラウド上に展開 できるかは、エンタープライズのクラウド利用 にとって中心的な課題。 企業の生産性向上の鍵を、開発プラットフォー ムのクラウド化が握っている。  ただし、問題もある。日本のユーザー企業は、自 社でソフトを開発しているか?
    • もう一つの別の視点個人の可能性の拡大とクラウド この間のIT技術の変化を大きくドライブしてきた のは、クラウド・デバイスの普及でも、SNSの拡大 でも、IT技術のコンシューマ化の流れである。 それは、とりもなおさず、無数の個人がIT技術の 利用者になったということである。 開発の側でも、開発者個人のPCの所有と自由な ネットワーク・アクセスは、客観的には、ソフトウェ アの開発環境を大きく変えてきた。オープンソー スの広がりは、こうした変化を背景としている。 少なくとも、個人としての開発者にとって、クラウド 利用は、さらに大きな変化の突破口になりうる。
    • 一人で、出来ること
    • 一人で、出来ること
    • これが、僕のクラウドのイメージ
    • Java EE 7
    • JavaEEのクラウド化の意味 JavaEE7は、現在エンタープライズの基幹系 で広く利用されているJavaEEのPaaSクラウド 化を目指したもの。 アプリケーション開発者が、クラウドのインフラ をあれこれを意識しなくても、よく知られた JavaEE技術で開発したアプリケーションを、 そのままクラウドにdeployし、すぐにクラウド サービスを開始できるという、多くのJava技術 者にとっては、魅力的な枠組み。
    • JavaEEのクラウド化の意味 JavaEEのクラウド化は、エンタープライズ Javaの事実上の標準技術が、クラウド化され ることを意味する。 JavaEE7の構想が 多数のベンダーの 賛成によって始まっ たことは、クラウド の標準化にとって も、大きな意味を 持っている。
    • JavaEE7の今後の展開 今年の終わりまでには、JavaEE7の仕様が 固まるだろう。(長期戦である) 来年には、WebLogic(Oracle), WebSphere(IBM),Jboss(Redhat)等のア プリケーション・サーバーのJavaEE7対応版 が、市場に投入されるだろう。 PaaSエンタープライズ・クラウドの本命の一つ と、筆者は考えている。
    • Play 2.0 Play 2.0は、ある意味で、かつてのSpringと 同様に、JavaEEのアンチ・テーゼである。開 発の容易さにフォーカスしながら、取り入れて いる技術は新しく、強力である。 残念ながら、今回は、Playの中核の一つであ るAkkaについては、説明を割愛した。
    • Devoxx2011でPlay2.0を発表する、SadekとGuillaume2011/11/16 Sadek Drobi Guillaume Bort
    • Play 2.0とTypesafe社 Playは、仏Zenexity社のGuillaume Bort 氏を中心に開発された、オープンソースの Webアプリケーションフレームワークである。 2011年11月16日、米Typesafe社は、 Guillaume Bort氏を顧問に迎え入れ、Play をTypesafe stack 2.0と統合することを発 表。あわせてPlay2.0 betaをリリースした。 米Typesafe社は、Scalaの創始者Martin Oderskyが会長を務め、James Gosling、 Doug Leaが顧問に名を連ねている。
    • Play 2.0の特徴 Java/Scalaベースの、Type Safeな、Web アプリ開発の為の軽量フレームワーク。 アジャイルな開発手法にフォーカス。 RESTfulアーキテクチャーを志向。 SQL/NonSQL 多様なDataStoreに対応。 Multi-Coreに対応した、Actorベースの非同 期並列プログラミング(Akka)。 クラウドを意識したプラットホーム。
    • アジャイルな開発スタイル Playでは、compile-package-deployの面 倒なサイクルを繰り返す必要はなく、ソースを 修正したら、ブラウザのReloadボタンを押す だけでいい。 Playは、Buildシステムを自前で持ち、Java のソースコードを直接コンパイルし、JVMに、 hot-reloadする。 コンパイルエラーは、ブラウザーに表示される
    • RESTful アーキテクチャー Webアプリケーションは、HTTPのRequestを 受けて、Responseを返すものである。 ServletやStrutsは、HTTPのJavaレベルで のある抽象的な見方を与えているのだが、 Webアプリケーションのフレームワークは、 HTTPとそのコンセプトへの、完全でより直接 のアクセスを可能にすべきである。 Template Engineを使えば、Servletは、必 要ではない。
    • “Share-Nothing”Stateless アーキテクチャー JavaのWebフレームワークの一部は、状態を 持っている。 こうしたアプローチは、ページの状態を自動的 に記憶するには役に立つ。同時に、「バックボ タン」の処理等で面倒な問題も抱え込む。 Playは、PHP,Ruby on Railsと同様に、状態 を持たない“Share-Nothing”アーキテクチャ ーを採用する。
    • HTTP Routing conf/routesconf/routesファイルは、HTTP RequestのMethod、URIに、それによって引き起こされるActionを対応させる。Actionは、HTTP Responseを返す。HTTP Method # Home page GET / controllers.Application.index # Hello action GET /hello controllers.Application.sayHell URI Action
    • Controller Actionの記述app/controllers/Application.java app/controllers/以下のJava/Scalaファイ ルは、routesファイルで、HTTP Requestに 対応づけられたActionを定義する。 package controllers; import play.*; import play.mvc.*; import views.html.*; public class Application extends Controller { public static Result index() { return ok(index.render("Hello World!")); } }
    • Template HTTP Responseの雛形 app/views/index.scala.html  app/views/ 以下のscala.htmlファイルは、 Scala functionにコンパイルされ、Action記 述から呼び出される。@(name: String, repeat: Int, color: String)@main("Here is the result:") { <ul style="color: @if(color != null) { @color } else { "inherited" }"> @for(i <- 1 to repeat) { <li>Hello @name!</li> } </ul> <p class="buttons"> <a href="@routes.Application.index">Back to the form</a> </p>}
    • conf/routes ファイルGET / controllers.Application.indexapp/controllers/Application.java ファイルpublic static Result index() { return ok( index.render(“Hello World!”) ); } Controllerapp/views/index.scala.html ファイル@(message: String) <h1>@message</h1> Template
    • JPAのサポートとMVC Playは、ORMとして、Java標準のJPAをサポー トしている。 Play2.0では、Stateless JPAと呼ばれる、新し い実装である、Ebeanが提供されている。 これらの定義ファイルは、app/models ディレ クトリーに置かれている。 こうして、appディレクトリー下には、 app/models, app/views, app/controllers の3つのディレクトリーが置かれることになる。
    • Modelの定義 app/models/Computer.java@Entitypublic class Computer extends Model { @Id public Long id; @Constraints.Required public String name; @Formats.DateTime(pattern="yyyy-MM-dd") public Date introduced; @Formats.DateTime(pattern="yyyy-MM-dd") public Date discontinued; @ManyToOne public Company company;
    • # Home page GET / controllers.Application.index # Hello action GET /hello controllers.Application. sayHello public class Router Application extends Controller {@(message: String) Controller public static<h1>@message</h1> Result index() { …… @Entity Views Model public class Company extends Model { @Id public Long id; Play 2.0のMVC @Constraints. Required public String name;
    • public static Result sayHello() { Form<Hello> form = form(Hello.class).bindFromRequest(); if(form.hasErrors()) { return badRequest(index.render(form)); } else { Hello data = form.get(); return ok( hello.render(data.name, data.repeat, data.color) ); } } app/controllers/Application.java JavaとScaladef sayHello = Action { implicit request => helloForm.bindFromRequest.fold( formWithErrors => BadRequest(html.index(formWithErrors)), {case (name, repeat, color) => Ok(html.hello(name, repeat.toInt, color))} ) } app/controllers/Application.scala
    • 「エンタープライズ・クラウドの現在」 資料 A) GlassfishのService Deploy B) GlassfishのAmazon EC2へのdeploy C) Play 2.0 Template Overview D) Play 2.0 routesファイル サンプル
    • GlassfishのService Deploy Devoxx 2011での、JavaEE7のアーキテク トJerome Dochezのスライドから。
    • 1.Application Introspection Application Virtual ClusterIntrospection Creation まず、アプリケーションの提供する サービスを分析します。 次に、その分析結果に基づいて、 Virtual Clusterの生成に取り掛かり ます。 サービスのdeployまでの流れ
    • 2. Virtual Cluster Creation Application Virtual ClusterIntrospection Creation Virtual Nodeを作成し、 すべてのノード上に、 JavaEE7をインストール します。 Virtual Machines With JavaEE サービスのdeployまでの流れ
    • 2. Virtual Cluster Creation Application Virtual Cluster AssociationIntrospection Creation Virtual Nodeを作成し、 Load Balancerを置き Virtual Virtual ます。 Machines Machines 必要に応じてDatabase with Load with やMQ等の外部リソー Balancer Database スを置きます。 Service これで、次の段階の Virtual Machines Associationの準備が With 出来ました。 JavaEE サービスのdeployまでの流れ
    • 3. Association Application Virtual Cluster Association DeploymentIntrospection Creation Load Balancer, JavaEEサーバー Virtual Virtual Databaseを関連 Machines Machines with 付けます。 with Load Balancer Database これで、アプリケ Service ーションのdeploy Virtual の準備が出来ま Machines した。 With JavaEE サービスのdeployまでの流れ
    • 4. Deployment Application Virtual Cluster Association DeploymentIntrospection Creation JavaEEサーバー に、アプリケーシ Virtual Virtual ョンをdeployします。 Machines Machines with Load with Balancer Database Service Virtual Machines With JavaEE サービスのdeployまでの流れ
    • クラウド・サービス開始 Application Virtual Cluster Association DeploymentIntrospection Creation Virtual Virtual Machines Machines with Load with Balancer Database Service Virtual Machines With JavaEE
    • GlassfishのAmazon EC2へのdeploy https://wikis.oracle.com/download/at tachments/20876159/GlassFish+Paa S+Overview.odp?version=7&modifica tionDate=1301350954000 の中の一枚のスライドから
    • Create Domain/Deploy Domain Manager 1. DAS Creation 3. Deployment IaaS Management Service 4. VM Creation AWS Plugin DAS 2. DAS Creation ElasiticityOrchestrator Amazon Web Services Manager 5. VM Creation GF Instance GF Instance 6. Add Node 7. Deployment
    • Create Domain/Deploy Domain ManagerPaaSの管理者は、まず、Domainをdeployします。具体的には、Domain Managerを立ち上げます。
    • Create Domain/Deploy Domain Manager 1. DAS CreationDomain Managerの最初の仕事は、DAS(Domain Administration Service) IaaS Management Serviceを立ち上げることです。 AWS PluginDomain Managerは、IaaSManagement Service(IMS)を立ち上げて、IMSはAWS Plug-inを通じて、Amazon Web Serviceに働き掛け、 Amazon Web ServicesDASのインスタンスを生成しようとします。
    • Create Domain/Deploy Domain Manager 1. DAS Creation IaaS Management Service AWS Plugin 2. DAS Creation DAS Amazon Web ServicesDASが出来ました。Domain Managerの次の仕事は、生成されたDASのインスタンス上に、OrchestratorとElasicity Managerという二つのサービスをdeployし、それらを走らせることです。
    • Create Domain/Deploy Domain Manager 3. Deployment IaaS Management Service AWS Plugin DAS ElasiticityOrchestrator Amazon Web Services Manager OrchestrtorとElasiticity Managerがdeployされました。 こうして動き始めたDAS(Domain Administration Service)の次の仕事は、 Glassfishが走るインスタンスを生成することです。
    • Domain Manager IaaS Management Service 4. VM Creation AWS Plugin DAS ElasiticityOrchestrator Amazon Web Services ManagerDASは、IMS(IaaS Management Service)に、Virtual Machineの生成を命じます。
    • Domain Manager IaaS Management Service 4. VM Creation AWS Plugin DAS ElasiticityOrchestrator Amazon Web Services Manager 5. VM CreationIMSは、先ほどと同じく、AWS Plug-inを通じて、Amazon Web Serviceに働き掛け、クラウド上にノードを割り当て、それぞれのノードにVirtual Machineを生成します。 GF Instance GF Instance
    • Domain Manager IaaS Management Service AWS Plugin DAS ElasiticityOrchestrator Amazon Web Services Manager 各ノードは、ノードが割り当てられると OrchestratorにAdd Nodeの報告をします・ GF Instance GF Instance 6. Add Node
    • Domain Manager IaaS Management Service AWS Plugin DAS ElasiticityOrchestrator Amazon Web Services Manager Orchestratorは、それを受けると、 各ノード上のVMに、GlassFishの インスタンスをdeployします。 GF Instance GF Instance 7. Deployment
    • Domain Manager IaaS Management Service AWS Plugin DAS ElasiticityOrchestrator Amazon Web Services Manager GF Instance GF Instance
    • Create Domain/Deploy Domain Manager 1. DAS Creation 3. Deployment IaaS Management Service 4. VM Creation AWS Plugin DAS 2. DAS Creation ElasiticityOrchestrator Amazon Web Services Manager 5. VM Creation GF Instance GF Instance 6. Add Node 7. Deployment
    • Play 2.0Template Overview https://github.com/playframework/Pl ay20/wiki/JavaTemplates Play 1.xでは、Templateの記述にGroovy が用いられていたが、Play 2.0からは、 Scalaに変わった。
    • TemplateファイルとScala function Templateファイルは、次のような命名規則で Scala functionにコンパイルされる。 views/Application/index.scala.html generates views.html.Application.index
    • Templateファイルから生成された ScalaコードのJavaからの呼び出し  次のTemplateファイルindex.scala.html から生成されたScala function indexを @(customer: Customer, orders: Seq[Order]) <h1>Welcome @customer.name!</h1> <ul> @for(order <- orders) { <li>@order.title</li> } </ul>  次のように、Javaから呼び出すことが出来る。Html html = views.html.Application.index.render(customer, orders);
    • Template SyntaxSpecial character ‘@’ ‘@’は、Scala文の始まりを示す。文の終わり は指定する必要はなく、コードからPlayが、自 動的に推測する。青字部分が、Scalaコードと して解釈される。Hello @customer.name!Hello @(customer.firstName + customer.lastName)!Hello @{val name = customer.firstName + customer.lastName; name}! ‘@’のエスケープには、’@@’を使う。My email is bob@@example.com
    • Template Parameters  Templateは、結局は、Scalaのfunctionな ので、引数が必要である。  Templateの引数は、必ず、ファイルの第一 行で宣言されねばならない。@(customer: models.Customer, orders: Seq[models.Order])@(title: String = "Home")@(title:String)(body: => Html)@(title: String)(body: => Html)(implicit request: play.api.mvc.Request)
    • Looping / If-Blocks Templateの中で、for-comprehensionを 利用できる。この時、コンパイラーは、ブロック の前にyieldキーワードを挿入することに注意 <ul> @for(p <- products) { <li>@p.name ($@p.price)</li> } </ul> @if(items.isEmpty) { <h1>Nothing to display</h1> } else { <h1>@items.size items!</h1> }
    • Declaring reusable blocks Template中に、再利用可能なTemplateブ ロックを定義できる。 @display(product: models.Product) = { @product.name ($@product.price) } <ul> @products.map { p => @display(product = p) } </ul> @title(text: String) = @{ text.split( ).map(_.capitalize).mkString(" ") } <h1>@title("hello world")</h1>
    • Misc.  Declaring reusable values@defining(user.firstName + " " + user.lastName) { fullName => <div>Hello @fullName</div>}  Import statements@(customer: models.Customer, orders: Seq[models.Order])@import utils.  Comments@********************** This is a comment **********************@
    • Layout views/main.scala.htmlがあれば、それが メインのレイアウト・ファイルになる。 @(title: String)(content: Html) <!DOCTYPE html> <html> <head> <title>@title</title> </head> <body> <section class="content">@content</section> </body> </html> @main(title = "Home") { <h1>Home page</h1> views/Application/index.scala.html }
    • @(title: String)(sidebar: Html)(content: Html) <!DOCTYPE html> <html> <head> <title>@title</title> </head> <body> <section class="sidebar">@sidebar</section> <section class="content">@content</section> </body> </html>@main("Home") { @sidebar = { <h1>Sidebar</h1> <h1>Sidebar</h1>}{ } <h1>Home page</h1> @main("Home")(sidebar) {} <h1>Home page</h1> }
    • Tags views/tags/notice.scala.html@(level: String = "error")(body: (String) => Html)@if(level == "success") { <p class="success"> @body("green") </p>}@if(level == "warning") { <p class="warning"> @body("orange") </p>}@if(level == "error") { @import tags._ <p class="error"> @body("red") @notice("error") { color => </p> Oops, something is} <span style="color:@color">wrong</span> }
    • Play 2.0routesファイル サンプル Playのrouteファイルは、Playのコンセプトを よく表している。 Play 2.0と一緒に配布されている、プログラ ム・サンプルから、routesファイルを抜き出し てみた。参考までサンプルの実行のスクリー ン・ショットを添付した。
    • conf/routes# Routes# This file defines all application routes (Higher priority routesfirst)# ~~~~# Home pageGET / controllers.Application.index# Hello actionGET /hello controllers.Application.sayHello# Map static resources from the /public folder to the /assets URLpathGET /assets/*file controllers.Assets.at(path="/public", file)
    • # Routes# This file defines all application routes (Higher priority routes first)# ~~~~# Default path will just redirect to the computer listGET / controllers.Application.index# Computers list (look at the default values for pagination parameters)GET /computers controllers.Application.list(p:Int ?= 0, s:Int ?= 2,f ?= "")# Add computerGET /computers/new controllers.Application.createPOST /computers controllers.Application.save# Edit existing computerGET /computers/:id controllers.Application.edit(id:Long)POST /computers/:id controllers.Application.update(id:Long)# Delete a computerPOST /computers/:id/delete controllers.Application.delete(id:Long)# Map static resources from the /public folder to the /assets URL pathGET /assets/*file controllers.Assets.at(path="/public", file)
    • # Routes# This file defines all application routes (Higher priority routes first)# ~~~~# The home pageGET / controllers.Projects.index# AuthenticationGET /login controllers.Application.loginPOST /login controllers.Application.authenticateGET /logout controllers.Application.logout# ProjectsPOST /projects controllers.Projects.addPOST /projects/groups controllers.Projects.addGroup()DELETE /projects/groups controllers.Projects.deleteGroup(group: String)PUT /projects/groups controllers.Projects.renameGroup(group: String)DELETE /projects/:project controllers.Projects.delete(project: Long)PUT /projects/:project controllers.Projects.rename(project: Long)
    • POST /projects/:project/team controllers.Projects.addUser(project: Long)DELETE /projects/:project/team controllers.Projects.removeUser(project: Long)# TasksGET /projects/:project/tasks controllers.Tasks.index(project: Long)POST /projects/:project/tasks controllers.Tasks.add(project: Long, folder: String)PUT /tasks/:task controllers.Tasks.update(task: Long)DELETE /tasks/:task controllers.Tasks.delete(task: Long)POST /tasks/folder controllers.Tasks.addFolderDELETE /projects/:project/tasks/folder controllers.Tasks.deleteFolder(project: Long, folder: String)PUT /project/:project/tasks/folder controllers.Tasks.renameFolder(project: Long, folder: String)# Javascript routingGET /assets/javascripts/routes controllers.Application.javascriptRoutes# Map static resources from the /public folder to the /public pathGET /assets/*file controllers.Assets.at(path="/public", file)