Play Framework勉強めも

（参考）勉強してる書籍
https://www.amazon.co.jp/Play-Framework-2%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Java%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%ABWeb%E9%96%8B%E7%99%BA-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798133922/ref=cm_cr_srp_d_product_top?ie=UTF8

#MVCアーキテクチャとは
アプリケーションを「Model」「View」「Controller」の組み合わせとして構築するもの。
「Controller」によって、「Model」「View」を制御する。
##Model
・データ管理を行う
・アプリケーションで使用する、データの処理を引き受ける

##View
・画面の表示に関する部分を引き受ける

##Controller
・アプリケーション全体を制御するもの

#Controllerクラスについて

（例）画面作成の処理

```java

package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {

    public static Result index() {
        return ok(index.render("Your new application is ready."));
/*
①indexインスタンスのrenderメソッドでHTMLクラスのインスタンスを取得。
②okメソッドで、Result型のインスタンスを返す。
*/
    }
}
```
・renderメソッド：`render(引数)`
引数を元にwebページのテンプレートをレンダリングするもの。返値はHTMLインスタンス。

##アクションとは
アクションとは画面作成するメソッドみたいなもの。
Play アプリケーションが受け取ったリクエストのほとんどは、Action によって処理される。
アクションは play.mvc.Result 型の値を返し、これはクライアントへ送信される HTTP レスポンスを表す。

#viewクラスについて
ページの外観を作るクラス。今回は大きく以下２つに分かれている。
・**main.scala.html**
　→ページ全体のレイアウト
・**index.scala.html**
　→`indexのAction`でコンテンツを表示する

イメージは、`indexのAction`が呼び出されると`main.scala.html`の中に`index.scala.html`のコンテンツがはめこまれた状態で、レンタリングされる。
ページ全体のレイアウトを`main.scala.html`、部分的なデザインを`index.scala.html`に分けることにより、共通するレイアウトの中で、コンテンツだけ出力出来る。

**main.scala.html**

```java

@(title: String)(content: Html)//変数の宣言

<!DOCTYPE html>

<html>
    <head>
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">//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>//javascriptの読み込み
    </head>
    <body>
        @content//headで読み込んだ内容をbodyで出力する様にしている
    </body>
</html>
```
・頭文字に@をつけることで、scalaのメソッドを記述出来る。
・Playアプリケーションでは、ファイルはそれぞれ独自に設定されたアドレスで公開される。
　`@routes.Assets.at`でそれらを読み取る。
（参考）
・linkダグとは：https://saruwakakun.com/html-css/basic/link-rel
・ファビコンとは：http://www.htmq.com/tutorial/28_9.shtml
・viewフォルダにcssファイルを作成すると、テンプレート時にscalaオブジェクトとして自動生成される。

・**index.scala.html**

```java

@(message: String)

@main("Welcome to Play") {//引数はmain.scala.htmlのtitleに入る

    @play20.welcome(message, style = "Java")//main.scala.htmlのbodyに入る

}
```
・@mainは、main.scala.htmlを呼び出すためのもの
・main("Welcome to Play")の"Welcome to Play"は、main.scala.htmlのtitleに入る。
・{}内は、(content: Html)に入る。
・@play20.welcomeはwelcomeページというページを生成するためのもの


#routeクラスについて
動作の処理順を記載したファイル。

```java 

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET     /                           controllers.Application.index()
//GETでルートが呼び出された場合は、indexアクションが呼び出される
# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)
//GETでpubliフォルダ内の、どれかのファイルが呼び出された場合は、Assets.atメソッドが呼び出される
```
・#で始まる文はコメント文

・[Get アドレス　呼び出すメソッド]で、メソッドを呼び出している。

・新しくActionやメソッドを追加した場合は、必ずここに記載する。

#処理の流れ
1.Webサーバに対して、getが呼ばれる
2.conf/routesファイルより、Getの"/"についてはAplication.javaのindex()を呼べば良いことがわかる  3.Aplication.javaのindex()が呼ばれる 
4.Aplication.javaのindex()で、index.renderが返却される 
5.つまり、views/index.scala.htmlが返却される
６.index.scala.htmlは必ずmain.scala.htmlが参照される