アノテーションをまとめてみる

spring bootの勉強でアノテーションがたくさん出てくるので、登場したアノテーションをまとめます。
メモとして書いているので、ちゃんとまとまっていませんｍｍ

#@RestController
Webアプリのリクエストを受け付けることを指定する。アクセスした側にテキストを返す。
RESTコントローラーとしたいクラスに付与する
REST（Representational State Transfer）とは、分散システムのアーキテクチャーで、要するに「外部からアクセスして必要情報などを取り出すシステム」を構築するのに用いられる仕組み。アクセスしたら必要な情報などをJSONやXMLなどの型式で送り返すようなイメージ。

```SampleComtroller.java
@RestController
class SampleController{
  @RequestMapping("/")
  public String index() {
    return "index";
  }
}
```


#@Controller
Spring Bootの一般的なコントローラーとしてクラスを利用できるようにする。
テンプレートを利用してHTMLページをレンダリングして表示する。Thymeleafを利用する場合は＠RestControllerでなくこっちを利用する。

```SampleComtroller.java
@Controller
class SampleController{
  @RequestMapping("/")
  public String index(Model model) {
   String name = "Tanaka";
   model.addAttribute("name",name); 
   return "index";
  }
}
```


#@RequestMapping("パス")
指定したパスにアクセスがあったときに、付与したメソッドを実行する
例では、URLに「http://localhost:8080/」が指定されたら、「index.html」を表示してくれる

```SampleComtroller.java
@RestController
class SampleController{
  @RequestMapping("/")
  public String index() {
    return "index";
  }
}
```

#@ResponseBody
@ResponseBodyを付けたメソッドは戻り値がそのままレスポンスのコンテンツになります。
しかし、どんなオブジェクトを返してもいいというわけではなく、SpringBootで用意されているオブジェクトを使用します。
####ModelAndView
データを管理する「Model」と画面表示に関する「View」の情報をまとめて管理するクラスです。
setViewNameでhtmlファイルを返します

```GroovyComtroller.java
@Controller
class SampleController{
  @RequestMapping("/")
  @ResponseBody
  def home(ModelAndView mav) {
   mav.setViewName("home"); 
   mav
  }
}
```

また、@RestControllerを付けた Controller のメソッドは@ResponseBodyを付けなくても、戻り値をコンテンツにすることができます。これは、JSON や XML などを返す場合に使用されることが多いです。
詳しくは↓
https://qiita.com/YAKINIKU/items/abaa54ba531a30850d10


#@PathVariable
パス変数で渡された値を取得することができる
`@ReaquestMapping("/{num}")`とリクエストマッピングをしていしたとき、`{num}`がパス変数で、URL`http://localhost:8080/100`の「/」以降のパスの値をnumという変数で受け取ることを示します。
パス変数の値を取り出すには、メソッドの引数に`@PathVariableを`使用して取り出します。
以下の例だと、引数をint型で指定しているため「/100」だと大丈夫ですが、「/abcd」だとエラーとなってしまいます。

```SampleComtroller.java
@Controller
class SampleController{
  @RequestMapping("/{num}")
  public String index(@PathVariable int num) {
   int res = 0;
   for(int i = 1,i <= num,i++)
     res += i;
   return "total:" + res;
}
```

#@Entity
エンティティクラスのこと。データベースのレコードをJavaオブジェクトとして保管したもの。

JPAを利用する場合、データベースのデータとなる部分は__エンティティクラス__として定義されます。データベースは通常、データベース内にテーブルを定義し、そこにレコードとしてデータを保管していきますが、エンティティはこの１つ１つのレコードをJavaオブジェクトとして保管したものと思えば良いでしょう。
テーブルから必要なレコードを取り出したりすると、JPAではエンティティクラスのインスタンスの形になっているというわけです。

#@Table(name="テーブル名")
このエンティティクラスに割り当てられるテーブルを指定します。nameでテーブル名を指定します。
これは省略してもよく、その場合はクラス名がそのままテーブル名として使われます。

#@Id
プライマリーキーを指定します。
エンティティクラスを定義する際には、必ず用意しておくようにしましょう。

#@GeneratedValue(strategy = GenerationType.AUTO)
プライマリーキーのフィールドに対して値を自動生成します。strategyに生成方法を指定します。
GenerationTypeという列挙型の値を指定し、AUTOで自動的に値を割り振るようにしています。

#@Column
フィールドに割り当てられるカラム名を指定します。
省略可能で、その場合はフィールド名がそのままカラム名として使われます。

Columnには引数があります

| 引数 | 概要 |
|:-:|:-:|
| name  | カラム名を指定します  |
| length  | 最大の長さ（Stringでは文字数）を指定します  |
| nullable  | nullを許可するかを指定します  |

#@Repository


#ー　Thymeleaf　ー

Controllerで用意した値をhtmlで表示したい時は、Thymeleafを使用すると簡単に表示することができる。

###th:text="${変数}"
textを表示する

```index.html
<body>
 <h1>Hello Page</h1>
 <p th:text="${msg}"></p>
</body>
```
```SampleController.java
@Controller
class SampleController{
  @RequestMapping("/{num}")
  public String index(@PathVariable int num, Model model) {
   int res = 0;
   for(int i = 1,i <= num,i++)
     res += i;
   model.addAribute("msg","tatal:" + res);
   return "index";
  }
}
```

`Model`引数は、Webページで利用するデータを管理するためのクラスです。このModelにテンプレートで利用する値を設定しておくことで、データを渡すことができます。
`model.addAribute("msg","tatal:" + rees);`
このように`addAttribute`というメソッドで値を設定しています。第1引数には値の名前を、第2引数には保管する値をすろぞれ指定します。

Modelと似たクラスに「ModelAndView」があります。

|クラス　　　　 |説明　　　　　|
|:-----------|:------------|
| Model       | テンプレート川で利用するデータ類をまとめて管理します。データを管理するだけなので、ビュー関連（利用するテンプレート名など）の情報は持っていません。ですから、このModelを戻り値として使うことはできません。（テンプレートの情報を持たないため）        |
|ModelAndView      | テンプレートで利用するデータ類と、ビューに関連する情報（利用するテンプレート名など）をすべてまとめて管理します。ビュー関連の情報も持っているので、ModelAndViewを戻り値で返すことで、設定されたテンプレートを利用するようになります。       | 

どちらも引数として利用するのですが、Modelは戻り値にしないのに対し、ModelAndViewは戻り値として使用します。「ビュー関連の情報を含むかどうか」の違いにより、扱い方が変わってくるのです。

```SampleController.java
@Controller
class SampleController{
  @RequestMapping("/{num}")
  public String index(@PathVariable int num, ModelAndView mav) {
   int res = 0;
   for(int i = 1,i <= num,i++)
     res += i;
   mav.addAribute("msg","tatal:" + res);
   mav.setViewName("index");
   return mav;
  }
}
```


##formを送信する

###th:value="${変数}"
formで送信した値をControllerでvalue変数に保持し、値をtextに返す。
送信したtextが保持されるようにすることができる

###@RequestParam
リクエストで渡されたパラメーターの値を取得します。パラメータとは、formから送信された値のことです。

```index.html
<body>
 <h1>Hello</h1>
 <p th:text="${msg}">please wait....</p>
 <form method="post" action="/">
   <input type="text" name="text1" th:value="${value}" />
   <input type="submit" value="SET"/>
 </form>
</body>
```

```SampleController.java
@Controller
class SampleController{
  @RequestMapping(value="/", method=RequestMethod.GET)
  public ModelAndView index(ModelAndView mav) {
    mav.setViewName("index"); 
    mav.addObject("msg","please write your name");
    return mav;
  }

  @RequestMapping(value="/", method=RequestMethod.POST)
  public ModelAndView send(@RequeestParam("text1")String str,ModelAndView mav) { 
   mav.addObject("msg","Hello," + str + "!!");
   mav.addObject("value",str);
   mav.setViewName("index");
   return mav;
  }
}
```

##そのほかのフォームコントロール
###チェックボックス、ラジオボタン、選択リスト

```index.html
<body>
 <h1>Hello</h1>
 <p th:text="${msg}">please wait....</p>
 <form method="post" action="/">
/*チェックボックス*/
   <div>
     <input type="checkbox" id="check1" name="check1" />
     <label for="check1">チェック<label>
   </div>
/*ラジオボタン*/
   <div>
     <input type="radio" id="radio1" name="radio1" />
     <label for="radioA">男性<label>
   </div>
   <div>
     <input type="radio" id="radio2" name="radio2" />
     <label for="radioB">女性<label>
   </div>
/*選択リスト*/
   <div>
     <select id="select1" name="select1" size="4">
       <option value="Windows">Windows<option>
       <option value="Mac">Mac<option>
       <option value="Linax">Linax<option>
     </select>
     <select id="select2" name="select2" size="4" multiple="multiple">
       <option value="Android">Android<option>
       <option value="iPhone">iPhone<option>
       <option value="pixcele">pixcele<option>
     </select>
   </div>
   <input type="submit" value="SET"/>
 </form>
</body>
```

```SampleController.java
@Controller
class SampleController{
  @RequestMapping(value="/", method=RequestMethod.GET)
  public ModelAndView index(ModelAndView mav) {
    mav.setViewName("index"); 
    mav.addObject("msg","フォームを入力してください");
    return mav;
  }

  @RequestMapping(value="/", method=RequestMethod.POST)
  public ModelAndView send(
    @RequeestParam(value="check1",required=false)boolean check1,
    @RequeestParam(value="radio1",required=false)String radio1,
    @RequeestParam(value="select1",required=false)String select1,
    @RequeestParam(value="select2",required=false)String[] select2,
    ModelAndView mav) {
 
    String res ="";
    try{
      res="check:" + check1 + "radio:" + radio1 + "select:" + select1 + "\nselect2:"
    }catch (NullPointException e){}
    try{
      res += select2[0]
      for(int i=0;i<select2.lengh;i++)
        res+= "," + select2[i];
    }cathch (NullPointexception e){
      res += "null";
    }  
    mav.addObject("msg",res);
    mav.setViewName("index");
    return mav;
  }
}
```
「value」と「 required」
`@RequeestParam(value="check1",required=false)boolean check1,`
`value`は受け取るパラメーターの名前です。
`required`はこの値が必須でない（値が渡されない場合もある）ことを指定するものです。
通常、`@RequestParam`を指定したパラメーターは必ず用意され、引数に渡されなければいけません。値が存在しないと内部エラーになってしまいます。`required=false`を指定することで、そのパラメーターがなくともエラーにならず処理が進められるようになります。

#フォワードとリダイレクト
あるアドレスにアクセスした時に、必要に応じて別のアドレスに移動させたい場合もあります。
こうした時にしようするのが「フォワード」と「リダイレクト」です。
　__フォワード__は、サーバー内部で別のページを読み込み表示するものです。アクセスするアドレスはそのままに、表示内容だけが別のページに差し替えられます。
　__リダイレクト__は、クライアント側に送られた後で別のページに移動させるものです。アクセスしているアドレスそのものも移動先のものに変更されます。

```index.html
<body>
 <h1>Hello Index</h1>
</body>
```

```SampleController.java
@Controller
class SampleController{
  @RequestMapping(value="/")
  public ModelAndView index(ModelAndView mav) {
    mav.setViewName("index"); 
    return mav;
  }
/*リダイレクト*/
  @RequestMapping(value="/other")
  public String other(){
    return "redirect:/"
  }
/*フォワード*/
  @RequestMapping(value="/home")
  public String home(){
    return "forward:/"
  }
/*ModelAndViewの場合*/
  @RequestMapping(value="/other")
  public ModelAndView etc() { 
   return new ModelAndView("redirect:/");
  }
}
```