Play Framework 2.0で最初のプロジェクトを書いています

3月13日、scala / javaフレームワークPlayの2番目のバージョンがリリースされました。 Habraには、すでにPlay 2.0の新機能の概要がありました 。 同じ記事で、この興味深いフレームワークのマニュアルがロシア語にない場合のギャップを、カテゴリとそれらに関連する空席のリストで構成される単純なJavaアプリケーションを作成する例を使用して埋めたいと思います。



この記事は、Playにまったく精通しておらず、多くの時間を費やすことなくPlayを「感じ」たい人を対象としています。



Play 2.0を使用するには、 JDK 6以上が必要です。 私のubuntu 11.10では、 JDK 7をインストールしました。



プロジェクトを作成する



1. Play 2.0ダウンロードして、書き込みと読み取りの権限がある場所に展開します/var/www/play20



です。



2.サイトを保持しているディレクトリに移動して、スクリプトを実行します。



 /var/www/play20/play new jobs
      
      







デフォルトでは、最初の質問に対する答えを残し、2番目の質問には「2-単純なJavaアプリケーションを作成する」を選択します。 Windowsの場合、すべてが似ています。シェルスクリプトは実行せず、.batのみを実行します。



3.作成されたプロジェクトに移動し、プレイコンソールに入り、プロジェクトを起動します。



 cd jobs /var/www/play20/play run
      
      







4.成功したことを確認します: http:// localhost:9000 別のポートでプロジェクトを開始するには、 「run port_number」を使用します (引用符が必要です)。



5.ここで、Play 2.0で開発を開始するには、IDEを構成する必要があります。 サーバーを停止し、CTRL + Dコマンドでコンソールに戻り、開発環境に応じてeclipsifyまたはideaを実行します。 NetBeansの場合、プロジェクトの自動作成はまだありません。



並べ替え(開いている宣言ソースを調べると便利です)とjavadocを接続するには、 「eclipsify with-source = true」を実行します (引用符を忘れないでください)。



6.プロジェクトを開き、 Eclipseを使用します[ファイル]> [インポート]> [一般]> [既存のプロジェクトをワークスペースへ]



カテゴリーリスト



アプリ/モデル/ Category.javaカテゴリモデルを作成します。



 package models; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import play.data.validation.*; import play.db.ebean.Model; @Entity public class Category extends Model { @Id public Long id; @Constraints.Required public String title; public static Finder<Long,Category> find = new Finder ( Long.class, Category.class ); public static List<Category> all() { return find.all(); } }
      
      







メインページビュー/ index.scala.htmlのテンプレートでは、すべてのカテゴリを表示します。



 @(categories: List[Category]) @main("Jobs") { <ul> @for(category <- categories) { <li>@category.title</li> } </ul> }
      
      







play 2.0のテンプレートはhtml + '@'文字で始まるScalaコードのブロックです。 また、テンプレートは関数に似ており、ファイルの冒頭に記載されているパラメーターを持っていることにも注意してください。



新しく作成されたテンプレートのEclipseでオートコンプリートを機能させるには、プロジェクトをチルダで実行する必要があります。 「〜実行」Windows設定-[設定]-[全般]アクセス時。」



カテゴリのリストを、アプリケーションコントローラapp / controllers / Application.javaから、上記で編集したテンプレートに転送します。



 import models.Category; ... public class Application extends Controller { public static Result index() { return ok(index.render( Category.all())); } }
      
      







簡単にするために、スターターのデータをメモリに保存します。このため、 conf / application.confの行のコメントを外します



 db.default.driver=org.h2.Driver db.default.url="jdbc:h2:mem:play" ... ebean.default="models.*"
      
      







ブラウザでF5キーを押すと、SQLクエリを実行するように求められます。 [このスクリプトを今すぐ適用]をクリックします。空のulリストが表示されます。カテゴリはまだありません。



カテゴリを追加する



カテゴリ追加フォームをapp / views / index.scala.htmlテンプレートに追加します。



 @(categories: List[Category], categoryForm: Form[Category]) @import helper._ @main("Jobs") { <ul> @for(category <- categories) { <li>@category.title</li> } </ul> @form(routes.Application.add()) { @inputText(categoryForm("title")) <input type="submit" value=""> } }
      
      







テンプレートでは、 helper._の関数を使用します。 フォーム関数は、アクションフィールドとメソッドフィールドが入力されたHTMLフォームを作成し、 inputText関数はテキスト入力を生成します。



conf / routesでルートを書きます



 POST /add controllers.Application.add()
      
      







app / controllers / Application.javaにアクションを追加します。このアクションは、フォームから受信したデータを使用して新しいカテゴリを作成し、2番目のパラメーター(フォーム)を追加してindexアクションのテンプレートレンダリング呼び出しを更新します。



 import play.data.Form; ... public static Result index() { return ok(index.render(Category.all(), form(Category.class))); } public static Result add() { Form<Category> filledForm = form(Category.class).bindFromRequest(); if (filledForm.hasErrors()) { return badRequest(index.render(Category.find.all(), filledForm)); } Category category = filledForm.get(); category.save(); return redirect(routes.Application.index()); }
      
      







http:// localhost:9000を更新し、カテゴリを追加しようとします。



この時点で、私のプロジェクトは崩壊しました。 すべてを再構築するには、コンソールを終了し、 / var / www / play20 / play clean-allを呼び出して再起動します。



仕事



ジョブモデルアプリ/モデル/Job.java、関連する一対多のカテゴリ:



 package models; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; import play.data.validation.*; import play.db.ebean.Model; import play.db.ebean.Model.Finder; @Entity public class Job extends Model { @Id public Long id; @Constraints.Required public String title; @ManyToOne public Category category; public static Finder<Long,Job> find = new Finder(Long.class, Job.class); }
      
      







app / models / Category.javaカテゴリモデルにフィードバックを追加します。



 import javax.persistence.OneToMany; ... @OneToMany(mappedBy="category") public List<Job> jobs;
      
      







F5をクリックして、新しいSQLを適用します。



これで、すべての空席を含むviews / show.scala.htmlカテゴリの出力テンプレートを作成できます。



 @(category: Category, jobForm: Form[Job]) @import helper._ @main("Jobs") { <h1>@category.title</h1> <h2>:</h2> <ul> @for(job <- category.jobs) { <li>@job.title</li> } </ul> <h2> </h2> @form(routes.Jobs.dd(category.id)) { @inputText(jobForm("title")) <input type="submit" value=""> } }
      
      







ジョブコントローラーアプリ/ controllers / Jobs.javaを追加します。これにより、新しい空席を追加できます。空席の出力は後で使用できます。



 package controllers; import java.util.List; import play.*; import play.data.Form; import play.mvc.*; import views.html.*; import models.*; public class Jobs extends Controller { public static Result add(Long categoryId) { Form<Job> filledForm = form(Job.class).bindFromRequest(); if (filledForm.hasErrors()) { Category category = Category.find.byId(categoryId); return badRequest(show.render(category, filledForm)); } Job job = filledForm.get(); job.category = Category.find.ref(categoryId); job.save(); return redirect(routes.Categories.show(categoryId)); } public static Result show(Long id) { return TODO; } }
      
      







カテゴリのリファクタリング



カテゴリとそのすべての空席を表示するためのページを実装することは残っていますが、同時にアプリケーションコントローラからカテゴリの追加を削除します。



app / controllers / Categories.javaカテゴリ用に個別のコントローラーを作成します。



 package controllers; import java.util.List; import play.*; import play.data.Form; import play.mvc.*; import views.html.*; import models.*; public class Categories extends Controller { public static Result add() { Form<Category> filledForm = form(Category.class).bindFromRequest(); if (filledForm.hasErrors()) { return badRequest(index.render(Category.find.all(), filledForm)); } Category category = filledForm.get(); category.save(); return redirect(routes.Application.index()); } public static Result show(Long id) { Category category = Category.find.byId(id); return ok(show.render(category, form(Job.class))); } }
      
      







conf / routesに空室を追加し、カテゴリを出力し、新しいカテゴリを追加するためにルートを変更するためのルートを追加することを忘れないでください:



 GET /category/:id controllers.Categories.show(id: Long) POST /category/add controllers.Categories.add() POST /job/add controllers.Jobs.add(categoryId: Long)
      
      







メインページテンプレートビュー/ index.scala.htmlで、フォーム関数のパラメーターを変更し、カテゴリへのリンクを追加します。



 @(categories: List[Category], categoryForm: Form[Category]) @import helper._ @main("Jobs") { <ul> @for(category <- categories) { <li><a href="@routes.Categories.show(category.id)">@category.title</a></li> } </ul> @form(routes.Categories.add()) { @inputText(categoryForm("title")) <input type="submit" value=""> } }
      
      







このステップで、 play clean-allコマンドを使用してプロジェクトを再構築しました。



Play 2.0をさらに探索するためのリソース:




All Articles