Spring 02スプリングWeb開発基盤


Webの開発には大きく3つの方法があります.
🔲 静的コンテンツ
🔲 MVCとテンプレートエンジン
🔲 API
1.静的コンテンツ
静的コンテンツとは、前のWelcome Pageのように、サーバ上で何も実行することなく、ファイルをWebブラウザに直接配置することを意味します.
Spring Bootは、デフォルトでは「/static」フォルダで静的コンテンツを検索して提供します.このフォルダに「hello-static」というhtml、localhost:8080/hello-staticを作成します.htmlを入力するとアクセスできます.
✔静的内容動作原理
1)Webブラウザでlocalhost:8080/hello-static.htmlを入力します.
2)内蔵Tomcatサーバはこの要求を受け入れSpringに渡す.
3)スプリングは、まずコントローラでhello-staticを検索します.
(コントローラ優先)
4)hello-staticのコントローラにマッピングされていない場合、springブートは内部リソースにあるstatic/hello-staticです.htmlを検索します.
5) hello-static.htmlがあれば返してください.
2.MVCとテンプレートエンジン
HTMLに直接渡すのではなく、サーバ上でHTMLをプログラミングして動的に置き換えます.動的に動作させるために、モデル、テンプレートエンジン画面、コントローラの3つをMVCと呼ぶ.最近はMVCモードで開発されています.
✔静的コンテンツとの相違
静的コンテンツWeb開発とは,ファイルをそのままWebブラウザに渡すことである.
MVCとテンプレートエンジンは、サーバ上でHTMLを少し修正することでHTMLを低減します.
ビューはすべての力をスクリーンに集中させます.コントローラまたはモデルは、ビジネスロジックに関連する問題または内部の問題の処理に集中する必要があります.このため、モデル、ビュー、コントローラを分離します.
Controller
@Controller
public class HelloController {
 @GetMapping("hello-mvc")
 public String helloMvc(@RequestParam("name") String name, Model model) {
 model.addAttribute("name", name);
 return "hello-template";
 }
}
View
resources/template/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
上記のように、hello-mvcコントローラとhello-template.htmlを作成してhttp://localhost:8080/hello-mvcにアクセスすると、「Method Parameter type Stringに要求パラメータnameが存在しない」というエラーが発生します.requestParamのrequiredのデフォルトはtrueなので、値を渡す必要があります.
したがって、http://localhost:8080/hello-mvc?name=springを超えると、コントローラはnameをspringに変換し、モデルに挿入し、テンプレートに移行するとnameにspringが追加されます.
✔MVCモード動作原理
1)Webブラウザにhttp://localhost:8080/hello-mvcと入力
2)SpringBoot内蔵TomcatサーバはSpring hello-mvcに伝えます.
3)Springは呼び出しhelloControllerからhello-mvcにマッピングする方法.
4)メソッドを返すときにhello-templateを返し、キーがname、値がspringのモデルをspringに渡します.
5)SpringはviewResolverからtemplates/hello-templateを提供する.htmlを検索し、Thymeleafテンプレートエンジンに渡して処理します.
6)テンプレートエンジンでレンダリングを行い、変換したHTMLをWebブラウザに戻す.
(静的時は変換せずにスキップ)
3. API
3.1 Spring Web開発におけるAPIの応用
静的コンテンツ方式に加えて、MVC方式でViewを検索し、テンプレートエンジンで画面をレンダリングし、HTMLをWebブラウザに渡す方法と、APIを使用する方法があります.
HTMLでデータをダウンロードするかAPIで直接ダウンロードするか
APIがAndroidやiPhoneクライアントの開発を必要とする場合は、サーバの観点からHTML形式ではなくjsonデータ形式であるべきです.

  • コメントやビューを書くときは、APIを使用して画面にデータを下げるだけで、クライアントが自分で表示したり整理したりすることができます.

  • サーバ間で通信する場合、HTMLを発行することなく、どのデータが往復移動するかが重要です.
  • このときAPI方式を用いる.
    3.2 @ResponseBody
    1)戻り文字
    APIを使用した戻り文字コントローラ
    @Controller
    public class HelloController {
     @GetMapping("hello-string")
     @ResponseBody
     public String helloString(@RequestParam("name") String name) {
     return "hello " + name;
     }
    }
    上記のコントローラで注意すべきコードは次のとおりです.
    @ResponseBody
    はい.ResponseBodyとはHTMLのbody takeではなく、「HTTPの応答主体部分にこのデータを直接入れる」というものです.@ResponseBodyはテンプレートエンジンとは異なり、Viewなどがなく、返される文字がそのまま下がります.(HTMLタグなし)
    このようなAPI方式は主にデータの保持を要求するために用いられる.
    2)Jsonタイプとオブジェクトを返す
    APIを使用したオブジェクト返却コントローラ
    @Controller
    public class HelloController {
    	@GetMapping("hello-api")
        @ResponseBody
        public Hello helloApi(@RequestParam("name") String name) {
        	Hello hello = new Hello();
            hello.setName(name);
            return hello;
        }
        
        static class Hello {
        	private String name;
            public String getName() {
            	return name;
            }
     
     		public void setName(String name) {
            	this.name = name;
            }
        }
    }
    上記のコードを適用してlocalhost:8080/hello-apiを使用しますか?name=springに入ると、
    {"name":"\"spring!!!!!\""}
    出力します.それはJsonの形式で、key:valueの形式で実現します.
    HTTPのようなXML方式は重く、2回開くか閉じる必要がありますが、Json方式key:valueはすぐに出てきて、簡単で、最近はほぼJson方式に統一されています.
    したがって、スプリングもオブジェクトを返し、@ResponseBodyと名前を付けた場合、Json形式で返すのが基本です.
    3.3 API挙動(@ResponseBody)原理
    1)Webブラウザにlocalhost:8080/hello-apiと入力します.
    2)SpringBoot内蔵TomcatサーバはSpring hello-apiに伝えます.
    3)springは,hello-apiがマッピングされた場所に@ResponseBodyのヒントがあれば,このデータをそのままHTTP応答に渡すべきであることを示している.
    4)伝達するデータが文字である場合、文字値をそのままHTTP応答に入れ、文字(オブジェクトなど)でない場合、springはJson方式でデータを作成してHTTP応答に返すのが基本である.
    5)@ResponseBodyは、ViewResolverの代わりにHttpMessageConverterによって操作されます.データが単純文字の場合、StringHttpMessageConverterは操作し、オブジェクトがMappingJacksonHttpMessageConverterの場合は操作します.
    6)JsonConverterデータ(オブジェクト)をJsonスタイルに変換します.
    7)変更されたJsonスタイルのデータを要求されたWebブラウザに送信する.
    ちなみに、HTTPリクエストには、「このフォーマットで受け取りたい」というヘッダがあります.そこにJsonを求める人がいたらJsonで受け取り、何も送らなければSpringは自分で送ります.「必ずxxxで受信します」とすると、そのMessageConverterが起動します.
    したがって、HTTP受信ヘッダとサーバ上のコントローラ返却タイプ情報とを組み合わせて、HTTP MessageConverterを選択することができる.