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

#コントローラから値を受け取る方法
下の写真でいうところの、controllersフォルダのクラス→viewフォルダのクラスに値を渡す方法。

<img width="622" alt="スクリーンショット 2018-03-18 19.33.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/e4f53e72-04e1-e2af-b836-b98ed3ec7d5e.png">

##viewフォルダ側の処理
・こんな風に引数を受け取れる変数を用意する。
・複数ある場合は、複数用意する。
・型は必ずラッパークラス型に設定する。

```java
@(one: String ,two :String, three:String)
```

##controllersの記載方法
こんな風に受け渡したい値を``index.render``の中に記述する。

```java
  public static Result index() {
        return ok(index.render(
        "サンプル1",
        "サンプル2",
        "サンプル3"
        )
  }
```

#フォームヘルパーを使って、フォームを作成する方法


##index.scala.htmlの記載方法
```html
@main("サンプル") {

    <h1>Hello!</h1>
    <p>@one</p>
    <p>@two</p>
    <p>@three</p>
    <p>これはサンプル</p>

    @helper.form(action=routes.Application.send){<!--①-->
    @(helper.inputText(<!--②-->
      field = form1("message")
    ))
    <input type="submit"><!--③-->
    }
}

```
action属性：フォームの送信ボタンを押して送信されるデータの送信先を指定する。
（参考）https://qiita.com/mikuhonda/items/f3126380d3340f3d8a2b
input要素：type属性にどのような値を指定するかによって、 一行テキストボックス・チェックボックス・ラジオボタン・送信ボタン・リセットボタン等、 フォーム部品の種類を指定し分けることができます
(参考)http://www.htmq.com/html5/input.shtml


①helperにあるformオブジェクトを呼び出し。actionは通常、送信先のアドレスを指定するがここでは、送信するメソッドを決める。
②テキストボックスを作成し、値をmessageに格納する。
③送信ボタンを作成する

##controllersの記載方法
こんな風に書き換える

```java
package controllers;

import play.*;
import play data.*;//フォームヘルパーを利用するためのPKG
import static plya.data.Form.*;//フォームヘルパーを利用するためのPKG
import play.mvc.*;

import views.html.*;

public class Application extends Controller {


    //Form用の内部クラス
    public static class SampleForm{//内部クラス、送信されたフォームの値を管理するためのクラス
      public String message;//import type="text"タグの値を保管するための変数

    //ルートにアクセスした際のAction
    public static Result index(){
      return ok(index.render("何か書いて。",new Form(SampleForm.class)));
      //引数にSampleFormクラスを指定して、Formインスタンスを生成する
    }

    //sendにアクセスした際のAction
    public static Result send(){
      Form<SampleForm> f = form(SampleForm.class).bindFormRequest();
      if(!f.hasErrors()){
      }
      SampleForm date = f.get();
      String msg = "you typed:" + date.message;
      return ok(index.render(msg,f));
      }else {
      return badRequest(index.render)("ERROR",form(SampleForm.class)));
      }
    }
}
```
###sendメソッドの処理

```java
    public static Result send(){
      Form<SampleForm> f = form(SampleForm.class).bindFormRequest();//①
      if(!f.hasErrors()){//②
      SampleForm date = f.get();//③
      String msg = "you typed:" + date.message;//④
      return ok(index.render(msg,f));
      }else {//エラーが発生した事をクライアントに伝える
      return badRequest(index.render)("ERROR",form(SampleForm.class)));
      }
    }
```

バインドとは：割り当てられるとかのイメージ
（参考）http://wa3.i-3-i.info/word12448.html

①SampleFormはジェネリクスで型を限定している。bindFormRequest()で、クライアントから送信されたフォームの値を、バインドしたFormインスタンスで返す。
送信ボタンを押したら→ルートファイルのsendに行って→Apricationのsendが呼び出される。
②最初にエラーチェックが入る
③Formのgetを呼び出すと、フォーム情報を管理するクラス(SampleFormクラス)のインスタンスが取得出来る。
④

##ルートの記載方法
```java
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET     /                           controllers.Application.index()

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)

POST    /send                       controllers.Application.send()
```
POSTとGETの違いについて
→POSTはサーバに情報を登録する際に使用する。GETはサーバから情報を取得して来る際に使用する。
（参考）https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf