Actions, Controllers and Results in Scala
Actions trong Scala?
Hầu hết các request của Play application được xử lý bởi một Action
Ví dụ play.api.mvc.Action
về cơ bản là một play.api.mvc.Request => play.api.mvc.Result
Chức năng xử lý một yêu cầu và tạo ra một kết quả sẽ được gửi cho khách hàng
val echo = Action { request => Ok("Got request [" + request + "]") }
Building an Action
Các đối tượng play.api.mvc.Action cung cấp một số phương pháp để xây dựng một giá trị hành động
Có nhiều cách để tạo ra 1 action, đơn giản nhất là trả về một giá trị như sau:
Action { Ok("Hello world") }
Nhưng thường thì cần tới 1 HTTP request gọi Action này, có cách khác để tạo 1 action là sử dụng hàm: Request => Result (nhận request và trả về result)
Action { request => Ok("Got request [" + request + "]") }
hoặc
Action { implicit request => Ok("Got request [" + request + "]") }
hoặc
Action(parse.json) { implicit request => Ok("Got request [" + request + "]") }
Controllers are action generators
Một Controller là một đối tượng sinh ra Action
Ví dụ:
package controllers import play.api.mvc._ object Application extends Controller { def index = Action { Ok("It works!") } }
Action có thể thêm parameters như sau:
def hello(name: String) = Action { Ok("Hello " + name) }
Simple results
Những kết quả này được xác định bởi play.api.mvc.Result
:
def index = Action { Result( header = ResponseHeader(200, Map(CONTENT_TYPE -> "text/plain")), body = Enumerator("Hello world!".getBytes()) ) }
Dưới đây là một số ví dụ để tạo ra kết quả khác nhau:
val ok = Ok("Hello world!") val notFound = NotFound val pageNotFound = NotFound(<h1>Page not found</h1>) val badRequest = BadRequest(views.html.form(formWithErrors)) val oops = InternalServerError("Oops") val anyStatus = Status(488)("Strange response type")
Tất cả giá trị trả về trên đều có trong play.api.mvc.Results
Redirects are simple results too
Chuyển hướng dữ liệu sang browser URL như sau:
def index = Action { Redirect("/user/home") }
Bạn có thể thiết lập thêm các tham số cho URL như sau:
def index = Action { Redirect("/user/home", MOVED_PERMANENTLY) }
“TODO” dummy page
Bạn có thể sử dụng 1 Action cho một trạng thái mà bạn chưa hoàn thành.
def index(name:String) = TODO