はじめに、自分自身について少し説明し、プレイします。 2008年から2010年まで、私はプレイ開発チームで働き、その後、プレイの共有化に熱心に取り組みました(バージョン1.0および1.1)。 この時点で、チームを変更しましたが、多くの場合、以前の同僚とよく会い、ほとんどのプロジェクトで遊びを使い続けています。 プレイ自体は、フランス最大の銀行の1つに実装した独自のプロジェクトから生まれました。 一般的に、誰かが興味を持っているなら、別の記事でプレイの歴史について書くことができます。
ScalaとJavaの役割
プレイ中の以前のscalaサポートがバージョン2以降の特別なモジュールに実装されていた場合、scalaはjavaと同等のフレームワークの完全なメンバーです。 より正確には、play 2の多くのブリックがscalaで作成され、javaで使用できると言えます。
プロジェクト構築システム
以前は、Python、bash、batchのスクリプト/クラスの形式で実装された独自のプロジェクト構築システムがplayにありました。 後に、最後に私のお気に入りのフレームワークを冒deし、別のモジュールの形でMavenをねじ込んだ人々がいました。 現在、プロジェクトを構築するためのシステム全体は、sbt +プラグインプレイsbtで構築されています(まあ、少しbash、それらがなければバッチ)。
プレイコンソール
新しいバージョンでは、playは実際のコンソールを備えています。 これで、コンソールからプロジェクト(など)を直接コンパイル、テスト、実行できます。 しかし、一般的に、プレイコンソールはsbtコンソールの単なるアドオンです。
コントローラーとアクション
これで、すべてのアクション(アクション)が特別なタイプ-結果(結果)を返すようになります。 scala部分には、このための特別なヘルパーがあります-アクション:
def index = Action {
Ok ( "Hello world!" )
}
これは、アクションを使用する簡単な例です。 私を信じて、あなたははるかに複雑な操作を実行する能力を持っています。
ルーティング(ルート)
2番目のバージョンでは、ルート化メカニズムは変更をエスケープしませんでした。 次に、routesファイルの各アクションにhttpパラメーターを明示的に指定する必要があります。
GET /コントローラー。 アプリケーション 。 インデックス
POST /:IDコントローラー。 アプリケーション 。 new1 ( id:Int )
アクションとコントローラーを作成する前にルートマップを設計している場合、存在しないアクションを指定したため、コンパイルエラーが発生する可能性があります。 この場合、事前定義アクション-呼び出しの場合に503を返すTODOを使用できます。
object Application extends Controller {
defインデックス= TODO
def new1 ( id: Long ) = TODO
}
表示する
プレイ2を見るとわかるように、Scalaにすべて同じでASP.NET Razorに似た種類の新しいスクリプトエンジンが実装されました。 このエンジンは非常に強力であると同時に、習得が容易です。
モデル
プレイ2では、モデルとして、 jdbcまたはAnormなどを使用する機会があります。たとえば、 ScalaQueryを使用する場合、またはjpaを使用する場合はお勧めしません。 興味があれば、別の記事でAnormの紹介をすることができます。
Akkaとの統合
プレイ2の非同期部分は認識されません。Akka2.0を使用してやり直されています。 構成ファイルでアクターシステムを直接構成できます。または、組み込みのアクターシステムが気に入らない場合は、他のシステムを使用できます。
あっか。 デフォルト -dispatcher。 コア -pool-size-max = 64
あっか。 デバッグ 受信 =オン
タスクを非同期で実行する機会がまだありますが、これは注釈によってではなく、いわばdslの精神でますます友人によって行われるようになりました。
あっか。 システム スケジューラー 。 スケジュール ( 0秒、 30分、testMe、 "me" )
非同期HTTP
playの内部アーキテクチャ全体がnetty上に構築されているため、これにより、WebSocketやHTTPプロトコルの非同期使用などの素晴らしい機能にアクセスできます。 コントローラーの1つでリソースを大量に消費する操作を実行する必要がある場合があり、非同期HTTPはそのような状況に役立ちます。 この場合に必要なことは、アクションの結果のタイプをSimpleResultからAsyncResultに変更することだけです。
def index = Action {
val promise = Akka。 未来 {計算( ) }
非同期{
約束。 map ( result = > Ok ( "Got result:" + result ) )
}
}
JSONを操作する
また、プレイ2では、jsonを操作するための自家製APIが追加されましたが、私の意見では最も便利ではありません。 jsonを読むことはまだ(簡単な場合には)進みませんでしたが、オブジェクトからjsonへの変換は私の意見では非常に不自由です。
読書:
( ( Json parse string ) "node1" "node2" ) 。 asOpt [ 文字列 ]
ビルド:
Json toJson Seq ( toJson ( 1 ) 、toJson ( "Bob" ) 、toJson ( 3 ) 、toJson ( 4 ) )
以前のバージョンのplayのように、外部ライブラリを使用する機会は常にあります。
グローバルオブジェクト
グローバルオブジェクトは、アプリケーションのブートストラップクラスとして機能します。 onStart 、 onStop 、 onError 、 onActionNotFoundなど、アプリケーションのイベントに割り込むことができます。 これは、 @ OnApplicationStartの一種の置換であり、非同期ジョブのfromは1を再生します。 そのようなオブジェクトの使用例を次に示します。
オブジェクトGlobal は GlobalSettingsを拡張します{
def onStart ( app:Application ) {
ロガー 。 info ( "アプリケーションが開始しました" )
}
def onStop ( app:Application )をオーバーライドします{
ロガー 。 info ( "アプリケーションのシャットダウン..." )
}
}
テスト
ここでは、scalaの部分についてのみ説明します。 最後に、テスト用にサードパーティのライブラリ、つまりmockitoをサポートするspecs2を使用できるようになりました。 さらに、テストは以前と同様に便利です。
おわりに
この記事は、play 2フレームワークの機能の表面的な概要にすぎません。興味がある場合は、次のようなトピックに関する詳細なレビューを提供できます。
- play2のAnormおよびその他のLight Orm
- MVC play2の詳細
- 実稼働中のPlay2
- Itd
ご清聴ありがとうございました。