電脳羊(Android Dream)

アクセスカウンタ

zoom RSS UbuntuでSpring Bootの開発 アプリケーション

<<   作成日時 : 2016/04/29 17:07   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

STSでJavaを使ってWebアプリを作ってみます。

STSを起動後

1、プロジェクト作成
New→Spring Starter Projectを選択
以下以外はデフォルトで良いでしょう。
Name: MyBootApp
Group: com.example.springboot
Artifact: MyBootApp
Description: Sample project for Spring Boot
Package: com.example.springboot
Nextを押下します。

2、Dependenciesの指定
Dependencies画面でWebを展開してWebをチェックします。
Nextを押下します。

3、アクセスするアドレスの確認
STSがアクセスしてプロジェクトを作成するURLの確認
そのままFinishを押下します。

必要な物をダウンロードしてプロジェクトが作成されるので少し待ちます。

4、プロジェクトの実行
プロジェクトを右クリックしてからRun As→Spring Boot Appで実行
Console画面に起動メッセージが表示されます。
ブラウザから以下のアドレスにアクセスします。
http://localhost:8080/
以下のエラーメッセージが表示されますが、まだページがないからなので問題なし。
Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Apr 26 17:38:36 JST 2016
There was an unexpected error (type=Not Found, status=404).
No message available

前回はSpring Legacyプロジェクト作成してからPivotaltc Server Developer Editionに追加しましたが、今回はそのまま実行できました。
通常はWebコンテナ(アプリケーションサーバ)にデプロイしないとWebアプリケーションとして動作しません。

Spring BootはEmbedded版のTomcatを内蔵しています。そのためそのまま実行出来るようです。
TomcatにはWebサーバの機能もあるからですね。
ただしJarにする必要があります。
組み込みのTomcatバージョンはコンソールに表示があります。8.0.32が組み込まれていますね。
TomcatEmbeddedServletContainer
Apache Tomcat/8.0.32
Tomcat started on port(s): 8080 (http)

WARを作って外部で動作しているTomcatにデプロイするには以下に記述があります。
http://qiita.com/ARS_2000/items/3f191aeb6f161101d5f6

5、ソースコードのチェック
自動生成されるソースは以下の通りで非常にシンプル
package com.example.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyBootAppApplication {

public static void main(String[] args) {
SpringApplication.run(MyBootAppApplication.class, args);
}
}

特になんらかのクラスを継承しなくても良いんですね。
アノテーション:@SpringBootApplicationを記述すれば後はよろしくやってくれるそうです。
後はSpringApplication.run(MyBootAppApplication.class, args);
を実行するだけ。

6、MVCアーキテクチャ
いわゆるMVCアーキテクチャで実装します。
起動時にエラーになったのではC(Controller)がなかったから。
追加していきます。
新しいクラスを生成(File→New→Class)
Name: HelloController以外はデフォルトでOK
package com.example.springboot;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@RequestMapping("/")
public String index(){
return "Hello Spring-Boot World!!";
}

}
@RequestMapping("/")でWebアプリの/にアクセスしたときにメソッドindexが実行されます。
http://localhost:8080/ にアクセスすると
Hello Spring-Boot World!!
と表示されました。
メソッド名を変えても問題なく実行されました。
あくまで@RequestMappingに結びついてるメソッドが実行されるということで問題ないようです。

@RequestMappingは複数記述できます。
URLに応じて処理を書けば良いわけですね。

@RestControllerを指定することでHelloControllerクラスがRESTのためのControllerとして動作します。
特に何らかのクラスを継承する必要はありません。

7、パラメータを渡す
@RequestMapping("/{num}")
として
public String index(@PathVariable int num)
パラメータで@PathVariableで参照することができます。

8、オブジェクトをJSONで出力する
Stringの値をindexメソッドからリターンしていました。
リターン値をオブジェクトのJSONとします。

DataObjectのインスタンスを返すとSpring BootでJSONへの変換をしてくれます。
DataObjectとしてはJavaBeansとして作成しておけば構いません
Privateのフィールド変数があり、フィールド変数へアクセスするメソッド(Setter, Getter)があるということです。

9、Controllerを使う
今まではControllerにリターン値を固定で指定していました。
MVCになっていませんね。
@RestControllerを@Controllerに変更
Spring BootではViewにJSPではなく、Thymeleafというテンプレートエンジンを使います。

Thymeleafを使うためにpom.xmlに追記します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Controllerは以下のように習性、ずいぶんシンプルになりますね。
@RequestMapping("/")
public String index() {
return "index";
}

テンプレートファイルをresources/templatesの下に作成します。
ファイル名は、index.html
テンプレートファイルと言ってもただのHTML形式ファイルなんですね。
Controllerでは
return "index";
と記述します。.htmlは書かないんですな、逆にわかり辛い気がしますが


10、テンプレートに値を表示する
index.html固定のHTMLファイルでした。


pタグの属性にth:textと言う名前で変数を記入します。

Controllerは計算結果をテンプレートに渡すようにします。
@RequestMapping("/{num}")
public String index(@PathVariable int num, Model model) {
int res = 0;
for(int i = 0; i <= num; i++){
res += i;
}

//計算結果をテンプレートに渡す
model.addAttribute("msg", "total: " + res);

//テンプレート:index.htmlを使用する
return "index";
}
Controllerからテンプレート(View)に渡したい値はModelクラスの変数に渡せば良いようです。
その辺の橋渡しはSpring Bootがやってくれるのでしょう。
気をつけるのは、ControllerとViewで使う変数、この場合はmsgを共通にしておくことですね。

ModelクラスとModelAndViewクラス
違いはViewを含むかどうかの違い
●Modelクラス
Viewに渡すデータ(Model)のみを含んでいる、Controllerのリターン値には使えない
サンプル
model.addAttribute("msg", "total: " + res);
return "index";

●ModelAndViewクラス
Viewに渡すデータ(Model)とViewを含んでいる、Controllerリターン値に使える
サンプル
mav.addObject("msg", "Model and View total: " + res);
mav.setViewName("index");
return(mav);

ModelAndViewの方がわかりやすいですね。

11、フォームを利用する
今まではURLにパラメータとして値を渡してましたが通常は画面で入力した値を渡してPostしますね。
ということでFormタグを使って画面で入力して、その値を使って処理をするようにします。

受け取り側はこんな感じで@RequestParamアノテーションを使えばPOSTした値を受け取れます
public ModelAndView send(@RequestParam("text1")String str,ModelAndView mav)




テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
UbuntuでSpring Bootの開発 アプリケーション 電脳羊(Android Dream)/BIGLOBEウェブリブログ
文字サイズ:       閉じる