spring + gradle でhelloworldを表示してみる

[Javaの環境構築をしてhelloworldを出力する](https://qiita.com/kty000/items/5c6519d46a9a72b33dd2)ではまずは書いてみるということでhelloworldをコンソールに出力しました。
今回はもう少し先に進んでspringのプロジェクトでHTMLを表示させてみます。

springなんてまだいれてないよ～というかたは前回までの記事を参考にしていただければと思います。
[Eclipseにspring bootとgradleを追加する](https://qiita.com/kty000/items/f2f8cf3e48e01fcc3956)
[Eclipseにプラグインをインストールする](https://qiita.com/kty000/items/634f642a49fcb8ede40f)



#springのプロジェクトをつくってみる
まずはspringプロジェクトを作ってみましょう。
１．[file] => [new] => [Other] => [Spring Starter Project] を選択
２．プロジェクトやパッケージの名前を決めます。今回はhelloSpringとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/ab05e78f-5c73-a4be-50d2-1b3b3b957aff.png)

３．プロジェクト依存関係の選択。今回は４つ選びました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/abcab840-3c8f-c582-800c-e1a2f1d5e120.png)


４．finishを押下して完了。こんな感じでできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/12e1023e-5b1c-1489-5081-ad50f6b2705d.png)

####依存関係ってなに？
４で記述した依存関係についてです。正直よくわかってませんが、使いたいSpringフレームワークをここで選ぶということみたいです。Gradleさんにこれよろしく～と頼むものを選ぶイメージですかね。Gradleの設定ファイルをいじることで後から追加もできます。
（認識が違ったら教えていただけますと幸いです）

作成したプロジェクトの中を見てみます。
Gradleの設定ファイルは`build.gradle`になってますのでこれを開いてみます。

```buid.gradle
plugins {
	id 'org.springframework.boot' version '2.3.2.RELEASE'
	id 'io.spring.dependency-management' version '1.0.9.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
       /*追加されている↓*/
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-web-services'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
      /*追加されている↑*/

	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

```
依存関係の選択時に選んだ４つが追加されていますね。
このあたりは私もまだまだ知識が足りないのでいつかまとめたいと思います。


#helloworldを出力する
プロジェクトができたので出力してみましょう。ファイルを２つ追加します。追加後はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/dc4a088f-12ba-d861-2316-9f29f8e2f710.png)


####１．HTML追加
基本的に`src/main/resources`内の`templates`にHTMLファイルを置きます。
templates右クリック => [New] => [Other] よりHTMLファイル、helloを作成します。

```hello.html
<!DOCTYPE html>
	<head>
		<meta charset="UTF-8">
		<title>hello</title>
	</head>
	<body>
		 <h1>Hello World!!</h1>
	</body>
</html>
```

####２．Controller追加
`helloSpring.Controller`というパッケージを追加し、その中に`HelloController.java`を作成します。


```HelloController.java
package helloSpring.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String hello() {
        return "hello";
    }
}
```

ここで注意すべきなのはControllerを作る場所です。
プロジェクトのmainメソッドの`HelloSpringApplication.java`がある起動クラスと同一パッケージ、もしくはその配下に配置しないと正しくロードされず４０４エラーになります。

`helloSpring`パッケージ内に作成してもいいですし、今回紹介したようにController用のパッケージを追加する場合はパッケージ名に注意してください。



####Controllerってなにしてるの？
Webフレームワークで一般的に取り入れられているアプリケーション設定を整理するための概念の一つでMVCというものがあるのですがそのCの部分です。なんのこっちゃと思いますが細かいことは後日まとめますので今は簡単に説明します。

HTMLをただ作っただけでは画面に表示させられないので、表示してくれるところが必要です。Controllerは、このURLが来たらこの処理をしてほしいという内容を書くところです。

####コードの内容を見てみる
まず＠がついているものはアノテーションといいます。アノテーションとは注釈の意味です。

@Controllerと書くことでこのクラスはControllerだよ～と宣言しています。
@RequestMapping ではどういうリクエストが来たら～の処理を書きます。

importはこれらを使うために書いています。


今回のコードを上から（@Controllerから）言葉で説明すると、
これはControllerのHelloControllerクラスです。
"/"というURLのGETリクエストがきたらhelloという関数を実行します。
という意味です。hello関数ではhelloというファイルを返すという処理が書かれていますね。

#実行する
実行するとコンソールにこんな感じものが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/1b8f7345-a7f6-caac-42f5-7e684a571724.png)


ポート番号が8080になっているのでhttp://localhost:8080にアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/37f2b452-212b-7ae0-269a-025a1fea3b3a.png)

無事に出力できました。


次は出力する文字を動的に変えてみたいと思います。
次 => [thymeleafでHTMLのページを動的にする（spring + gradle）](https://qiita.com/kty000/items/390b155466f88b102434)