Controller.action – Smart binding
Controller/link?i=32&n=patrick
public static void link(int i, String n)
public static void link(Integer i, String n)
public static void link(Long i, String n)
Controller/show?id[0]=1&id[1]=2&id[2]=3&id[3]=4
public static void show(Long[] id)
public static void show(List
public static void show(Set
Controller/get?date=02-18-1972
public static void get(@As("MM-dd-yyyy") Date date)
(@As(binder=MyCustomStringBinder.class))
Custom parameter binder
public static void create(String comment, File attachment)
multipart/form-data エンコードの POST リクエストとしてファイルを送信します。
[email protected]
public static void create(Client client)
JavaBean (POJO) binding
@NoBinding
バインドできないフィールドを示します。
Controller.action – Validation
@Required String lastname
@IsTrue String agree
@Max(7500) Integer wordCount
@Min(18) Long age
@MaxSize(2083) String value
@MinSize(42) String value
@Email String address
@Equals("passwordConfirmation") String password
@InFuture String dueDate
@InFuture("1979-12-31") String birthDate
@Match("[A-Z]{3}") String abbreviation
@Match("(directDebit|creditCard|onReceipt)")
@Past String actualDepartureDate
@Past("1980-01-01") String birthDate
@Range(min = 17500, max = 40000) String wordCount
@URL String address
@IPv4Address String ip
@IPv6Address String ip
@Phone String phone
Relaxed phone validation
電話番号の緩やかな検証
@Valid Person person
JavaBean (POJO) 検証 - Person クラスは検証のアノテーションが必要です。
Controller – Session Management
警告: Play のセッションは J2EE のセッションではありません
session と flash はクッキーを使います! 4KB と 20 個の上限があります。
session.getId();
(たいていの場合持っておかなければいけない) セッション ID を返します。
session.put(String key, String value);
session.get(“user_flag”);
値は 4KB を上限とする文字列に限られます。
flash.put(String key, String value);
flash.get(String key);
flash エントリは次のリクエストの終了まで廃棄されます。
Cache.set(“key_” + id, product, “30mn”);
30 分のキャッシュ値をセットします。
Cache.get(“key_” + id, Product.class);
キャッシュ値を取得します。キーに対応する値がなければ null を返します。
Cache.delete(“key_” + id);
ノンブロッキングのキャッシュ削除
Cache.safeDelete(“key_” + id);
ブロッキングのキャッシュ削除
Controller.action – Redirection
render(params...);
与えられたパラメータでテンプレートを text/html としてレンダリングします。
renderXML(params...);
パラメータを application/xml としてレンダリングします。
renderJson(params...);
パラメータを application/json としてレンダリングします。
renderText(params...);
パラメータを text/plain としてレンダリングします。
renderTemplate(“Clients/showClient.html”, id, client);
デフォルトのテンプレートをバイパスします。
redirect(“http://www.crionics.com”);
指定された URL に HTTP リダイレクトします。
From an action, calling another Controller.action()
透過的にリダイレクトを生成します。
Controller – Jobs
@OnApplicationStart
@On("0 0 12 ∗ ∗ ?")
毎日午後 12:01
@On("10 30 12 ? ∗ MON-FRI")
平日の午後 12:30:10
@Every("1h")
public class Bootstrap extends Job {public void doJob() {...} }
Controller – Interceptions
@Before ➟ action ➟ @After ➟ template ➟ @Finally
Interceptions evaluation order
インターセプト評価の順
@Before static void checkAuthentification()
@After static void log()
@Finally static void audit()
You get the idea
@With(Secure.class)
public class Admin extends Application
コントローラスコープでのカスタムインターセプタ
@Catch(value={RuntimeException.class})
public static void onException(RuntimeException e) {…}
コントローラ層での例外ハンドリング
Controller.action – Others
Logger.info("Action executed ...");
Logger.debug("A log message");
Logger.error(ex, "Oops");
ロギングの設定は application.conf にあります。
@CacheFor("1h") public static void index() { ... }
1時間アクションの実行結果をキャッシュします。
Play.configuration.getProperty("blog.title");
設定ファイルにアクセスします。
Query query = JPA.em().createQuery("query");
永続化マネージャにアクセスします。
Controller – Libraries
WS.url("http://s.com/posts").get().toJSON();
HTTP GET リクエストを JSON にします。
WS.withEncoding("iso-8859-1").url("http://s.com/posts").get().toJSON();
HTTP GET リクエストを iso-8859-1 エンコーディングで JSON にします。
WS.url("http://s.com/").post().toXML();
HTTP POST リクエストを XML にします。
DB.execute("raw sql");
そのままの SQL を評価します。
XML.getDocument(String);
文字列を XML にします。
XML.serialize(Document);
XML を文字列にします。
XPath.selectNodes(String xpath, Object node);
XPath 表記の評価
Files.copy(File,File);
ファイルコピー
Files.copyDir(File,File);
再帰的なディレクトリコピー
Files.delete(File);
Files.deleteDirectory(File);
ファイルやディレクトリの削除
IO.readLines(File);
IO.readContentAsString(File);
IO.readContent(File);
IO.write(byte[],File);
ファイルの内容の読み書き
Images.crop(File orig,File to, int x1, int y1, int x2, int y2);
Images.resize(File orig, File to, int w, int h);
Images.toBase64(File image);
便利なメソッド
Crypto.encryptAES(String);
Crypto.decryptAES(String);
アプリケーションの秘密鍵を使っての暗号化
Crypto.passwordHash(String);
MD5 パスワードハッシュを生成します。
Codec.UUID();
ユニークな ID を生成します。
Codec.byteToHexString(byte[] bytes);
バイト配列を 16進数表記の文字列で書き出します。
Codec.encodeBASE64(byte[] value);
Codec.decodeBASE64(String base64);
Encode/Decode a base64 value
base64 のエンコードまたはデコードをします。
Codec.hexSHA1(String);
文字列の 16進数表記の SHA1 ハッシュを生成します。