Scalaのcontrollerクラスに触れる
今回はScalaのcontrollerクラスに触れていきます。例によって、scala-play-seedでsbt new
するとできるHomeController.scalaを解読していきます。
HomeController.scala
package controllers
import javax.inject._
import play.api._
import play.api.mvc._
/**
* This controller creates an `Action` to handle HTTP requests to the
* application's home page.
*/
@Singleton
class HomeController @Inject()(val controllerComponents: ControllerComponents) extends BaseController {
/**
* Create an Action to render an HTML page.
*
* The configuration in the `routes` file means that this method
* will be called when the application receives a `GET` request with
* a path of `/`.
*/
def index() = Action { implicit request: Request[AnyContent] =>
Ok(views.html.index())
}
}
冒頭packageとimportの数々
package
冒頭のpackage ~
の記述は、パッケージと言って、通常、格納しているフォルダ名を記述します。
HomeController.scalaのファイルには、package cotrollers
と記述があります。こうすることで、同階層のメンバー(クラス、トレイト、関数など)にアクセスすることができます。他パッケージ(ライブラリや他のフォルダ、パッケージのメンバーへのアクセスには下記importを使います)
import
packageのした部分に記述してあるimport文は、他パッケージ(ライブラリや他のフォルダ、パッケージのメンバーへのアクセスするときに使用します
パッケージとインポートの公式の解説は以下を参考
javax.inject._
ファイル文中で扱うアノテーション@~
を使うためにインポートします。_
には、それ以下全てインポートという意味があります。Javaをやって最初に使ったアノテーションは、オーバーライドアノテーションです@Override
:継承したクラスにあるメソッドを再定義する際に、関数の前に記述します。
このファイルのアノテーションの役割は以下です
アノテーション | 役割 |
---|---|
@Singleton | DI(Dependency Injection)登録※1のためのアノテーション。シングルトン※2で生成される |
@Inject | DI登録したクラスのインスタンスを、文字通り「注入する」ためのアノテーション |
※1 依存性の注入。コンポーネント間の依存関係をプログラムのソースコードから排除するために、外部の設定ファイルなどでオブジェクトを注入できるようにするソフトウェアパターン。よくDIと呼ばれる
※2 あるクラスのインスタンスを1つしか作成しないデザインパターンのこと。 再度インスタンスを呼ぶメソッドを実行した場合、最初に作成したインスタンスが返る。 作成する際に、コンストラクタのアクセス修飾子をprivateにして外部からnewできないようにする。
@Inject()(val controllerComponents: ControllerComponents)
Play frameworkでデフォルトでDI登録されているControllerComponentsを注入している。
def index() = Action {}
Actionnは、play.api.mvc
の中に入っています。Play frameworkは基本的にきたリクエストは、このActionが処理する
Ok(views.html.index())
ContentType text/plain のレスポンスボディを含む、 ステータス 200 OK のレスポンスを生成。
この際のレスポンスボディは、viewsパッケージにあるindexのhtml
詳しくは以下公式を参考
Discussion