Play Frameworkに挑戦(Java編 その5) ~JSON/ jQuery/CoffeeScriptを使用する
前回の続き
前回ではモデルの登録処理を実装した。
今回は登録したエンティティを取得し画面に表示する処理である。イントロダクション動画では13:00~終わりまで。
Introduction to Play Framework for Java developers on Vimeo
JSONでデータを返す
最近ではAjaxなどのデータ転送に使われるデータフォーマットととして、XML形式に代わってJSON形式が使用されることが多いようだ。
データベースに保存した全エンティティを取得しJSON形式で取得するために次のようにコードを追加する。
conf/routes に下記追加
GET /bars controllers.Application.getBars()
controllers/Application.java に下記追加。
import java.util.List; import play.db.ebean.Model; import static play.libs.Json.toJson;
public static Result getBars() { List<Bar> bars = new Model.Finder(String.class, Bar.class).all(); return ok(toJson(bars)); }
ブラウザから localhost:9000/bars にアクセスしてみると、下記のようにJSON形式のデータが返されていることが分かる。
CoffeeScriptでjQueryを使う
いまさら言うまでもないことであるが、ブラウザで動作するプログラミング言語いわゆるクライアントサイドスクリプトとしての絶対的地位にあり、AjaxやHTML5により益々重要度の増しているのがJavaScript(ECMAScript)であり、最新のプログラミング言語ランキング*1では、Javaを抜いて1位だという調査結果もあるほどである。
しかし、重要ではあるが皆が皆JavaScriptという言語を気に入っているというわけではないようである。JavaScriptへの変換を前提とした言語が複数生み出されており、その一つがCoffeeScriptという言語だそうだ。
views/index.scala.html を下記のように変更。
@(message: String) @main("Welcome to Play") { <script src='@routes.Assets.at("javascripts/index.js")'></script> <ul id="bars"></ul> <form action="@routes.Application.addBar()" method="post"> <input name="name"> <input type="submit"> </form> }
<ul>タグの部分は、jQueryで操作することになるHTML要素だ。
javascripts/index.js は次のCoffeeScriptのソースファイルが変換されたJavaScriptファイルだ。
assets/javascripts/index.coffee
# -> $.get "/bars", (data) -> $.each data, (index, bar) -> $("#bars").append $("<li>").text bar.name
さて、今一度ブラウザから localhost:9000/ のページをリフレッシュすると
入力フォームの上部に、登録した名前の一覧が表示される。
念のためHTMLソースも確認。
記述したCoffeeScriptはこのようにJavaScriptへ変換されたようだ。
Play Frameworkに挑戦(Java編 その4) ~モデルの作成と登録処理~
前回の続き
前回ではPlay Frameworkでの自動テストを実行してみた。
今回は前々回ででてきたMVCモデルの残りのM(モデル)についての解説ということになる。イントロダクション動画では8:00~13:00のあたりまで。
Introduction to Play Framework for Java developers on Vimeo
モデルの作成
モデル (models/Bar.java)
モデルについてはPlay Frameworkでは初期プロジェクトになにも作成されていない状態なので、自分で一から作っていくようだ。
動画の8:00~9:00あたりでBarクラスというエンティティクラスを作成している。
動画ではIntelliJ IDEAが使われており、素晴らしい補完機能によりサクサクとコーディングされて行く様子がみられるが、Eclipseを使ってもほぼ同様に作成していくことができる。
models/Bar.java
package models; import javax.persistence.Entity; import javax.persistence.Id; import play.db.ebean.Model; @Entity public class Bar extends Model { @Id public String id; public String name; }
登録機能の追加
データベースの利用 (conf/application.conf)
インメモリデータベース*1を使用するために、下記の部分のコメントを外す。
db.default.driver=org.h2.Driver db.default.url="jdbc:h2:mem:play"
またEbean*2が対象とするクラスを指定するため?下記の部分もコメントを外す。
ebean.default="models.*"
登録処理の追加
conf/routesファイルに下記記述を追加
POST /bars controllers.Application.addBar()
controllers/Application.javaにメソッド追加
import models.Bar; import play.data.Form;
public static Result addBar() { Bar bar = Form.form(Bar.class).bindFromRequest().get(); bar.save(); return redirect(routes.Application.index()); }
上記コードを解釈してみると
- フォームで入力された値を受け取りBarエンティティを作成。
- エンティティをデータベースへ保存。
- アプリケーションのルートであるindexへリダイレクト
ということのようだ。
入力フォームの作成
views/index.scala.htmlを変更
@(message: String) @main("Welcome to Play") { <form action="@routes.Application.addBar()" method="post"> <input name="name"> <input type="submit"> </form> }
動作確認
ブラウザからページをリフレッシュしてみると、下記のようなページが表示される。
まだオブジェクトにマッピングされるテーブルが存在しないために、このようなページが表示される。わざわざテーブル作成のスクリプトを自動生成してくれるご親切。
こういうところを見ると『オブジェクトが主でリレーショナルが従。テーブルはあくまでオブジェクトの永続化の先の一つ』という思想を感じられる気がする。
「Apply this script now!」 というボタンを押すと、実際にテーブルを作成してくれ次のような画面が表示される。
「送信」ボタンを押すと内容が登録されるようだが、この時点ではまだ本当に登録できたのか確認できない。
今回はここまで。
*1:今流行りのインメモリデータベース。H2というJavaで記述されたデータベースのようだ。 H2 Database Engine
*2:EbeanとはここのORマッピングツールのことらしい。 Avaje Ebean ORM Peristence Layer (Java) - Compare to JPA
Play Frameworkに挑戦(Java編 その3) ~修正と自動テスト~
前回の続き
前回ではPlay Frameworkのソース構成について確認した。
さて今回はイントロダクション動画の3:30~8:00あたりまで、簡単なソースの修正と自動テストについて確認してみよう。
Introduction to Play Framework for Java developers on Vimeo
動画の3:30~6:00のように
ビューに渡すパラメータを変更したり、ビューの内容を変更しても
ソースを保存してブラウザからリフレッシュすれば、自動的にリコンパイルされ更新内容が反映される。
自動テスト
Play Frameworkで作成された初期プロジェクトには
test/ApplicationTest.java と
test/IntegrationTest.java というサンプルコードが作成されている。
>play test
と実行することで自動テストの結果を得ることができる。
すべてのテストが通れば次のような感じになる。
Play Frameworkでは
JUnit と Selenium - Web Browser Automation
を利用しいろいろなテストがサポートされるようで*1、
ユニットテスト程度の知識しかない私にとっては、踏み込んだ勉強が必要な部分だ。
今回はこの辺まで。
*1:Java開発によるテストについてはhttp://www.playframework-ja.org/documentation/2.1.5/JavaTestを参照のこと。
Play Frameworkに挑戦(Java編 その2) ~構造を理解する~
前回の続き
前回はPlay Frameworkで作成された初期ページの確認までをした。
さて今回はイントロダクション動画の2:00~6:00あたりのソースの構造について確認してみよう。
Introduction to Play Framework for Java developers on Vimeo
ルーティング設定 (conf/routes)
routesファイルにはクライアントからのHTTPリクエストとそれを処理するControllerのメソッドが記述されている。
GET / controllers.Application.index()
書式は
HTTPメソッド | URI | 呼び出されるメソッド
コントローラー (controllers/Application.java)
public static Result index() { return ok(index.render("Your new application is ready.")); }
MVCモデルのコントローラー(C)にあたる部分。
コードの okメソッドは、play.mvc.Controllerクラスのスーパークラスであるplay.mvc.Resultsクラスのメソッドで、HTTPステータス 200 OK を返すようだ。
ビュー (views/index.scala.html , main.scala.html)
MVCモデルのビュー(V)にあたる部分。
「scala.html」という拡張子のファイルはPlay Frameworkのテンプレートファイルだそうだ。
index.scala.html
@(message: String) @main("Welcome to Play") { @play20.welcome(message, style = "Java") }
よくはわからないが、mainという別のビューを呼び出しているらしい。
main.scala.html
@(title: String)(content: Html) <!DOCTYPE html> <html> <head> <title>@title</title> <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")"> <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")"> <script src="@routes.Assets.at("javascripts/jquery-1.9.0.min.js")" type="text/javascript"></script> </head> <body> @content </body> </html>
Play Frameworkに挑戦(Java編 その1) ~とりあえず動かしてみる~
Play FrameworkというScala/JavaのWebフレームワークを試してみたいと思う。
次のサイトから 現時点で最新の2.2.2をダウンロードした。
http://www.playframework.com/
とりあえずトップページにあるイントロダクション動画の通りにやってみたいと思う。
Introduction to Play Framework for Java developers on Vimeo
(しゃべっている英語はよくわからないけど、まあなんとかなるでしょう)
今回はこの動画の~2:00までをやってみる。
まずはプロジェクト作成
>play new foobar
途中JavaにするかScalaにするか尋ねられるが、今回は動画の通りしてみたいのでJavaを選択。
プロジェクト作成後、使用するIDE用のプロジェクトに変換。
動画ではIntelliJ IDEAを使っているが、今回はEclipseを使うことにする。
>cd foobar >play eclipse
貧弱なマシン環境のためメモリ不足が発生したり少し手間取ったが
なんとかEclipseプロジェクトが出来上がった。
サーバーを起動してみる。この日はなぜかデフォルトの9000番ポートで起動しないので
8080番を指定して起動。
>play "run 8080"
ブラウザから localhost:8080/ にアクセスしてみる。
今回はこの辺まで。
Scala に挑戦
ここ最近Scalaという言語が人気なようで*1、ちょいと触ってみたいと思う。
ではまずはScalaのインストール。
今回は次のサイトから 2.10.3をインストールした。
http://www.scala-lang.org/download
Scalaの特徴として、オブジェクト指向言語と関数型言語のハイブリッド言語であることが挙げられるそうな。
それぞれの特徴をみてみよう。
オブジェクト指向のサンプル
非常に簡単なクラスのサンプルコードを書いてみる。
// Person.scala class Person(name: String) { def greet() = println(s"My name is $name.") } var aPerson = new Person("Bob") aPerson.greet()
実行結果は
>scala Person.scala My name is Bob.
関数型のサンプル
非常に簡単なリスト操作を書いてみる。
面倒なので対話型インタープリタにて確認した。
scala> List(20, 14, 3, 15, 6, 18).filter(_ >= 10) res0: List[Int] = List(20, 14, 15, 18)
また比較として他の関数型言語であるHaskellとScheme(Gauche)のコードも書いてみる。
Prelude> filter (>=10) [20, 14, 3, 15, 6, 18] [20,14,15,18]
gosh> (filter (lambda(x) (>= x 10)) '(20 14 3 15 6 18)) (20 14 15 18)
本日のまとめ
静的型付け言語でありながらも
型推論と関数型のために非常にコードがシンプルでよい。
今回試していないがパターンマッチングも使えるようだ。
ただきちんと使いこなすには、まだまだ勉強が必要だ。