Controllers

Play 1.2.7

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 id)
public static void show(Set id)

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 ハッシュを生成します。