Spring MVC-TIL (10)


[参考講座]金英漢のSpring MVC 1編-バックエンドWeb開発キーテクノロジー

💡 スプリングMVC-基本機能


HTTP応答-静的リソース、ビューテンプレート


サーバ上で応答データを作成する方法は大きく3つあります
  • 静的リソース
  • Yes)Webブラウザで静的HTML、css、jsを提供する場合の静的リソースの使用
  • ビューテンプレートの使用
  • Yes)Webブラウザで動的HTMLを提供する場合は、ビューテンプレート
  • を使用してください.
  • HTTPメッセージの使用
  • Yes)HTTP APIを提供している場合は、HTMLではなくHTTPメッセージ本体にデータを送信する必要があるため、JSON形式でHTTPメッセージ本体にデータを送信する
  • 静的リソース


    Springブートは、クラスパスの次のディレクトリの静的リソースを提供します.
    /static,/public,/resources,/META-INF/resources
    src/main/resourcesはリソースを保存する場所であり、クラスパスの開始パスでもあります.したがって、次のディレクトリにリソースを配置すると、springブートは静的リソースとしてサービスを提供します.

    静的リソースパス

    src/main/resources/staticファイルが次のパスに含まれている場合:src/main/resources/static/basic/hello-form.htmlWebブラウザで次の操作を行います.http://localhost:8080/basic/hello-form.html静的リソースは、ファイルを変更せずにそのままサービスを提供します.

    ビューテンプレート


    ビューテンプレートからHTMLを生成し、ビューはレスポンスを作成して渡します.
    Spring Bootは、デフォルトのビューテンプレートパスを提供します.
    ビューテンプレートパスsrc/main/resources/templatesビューテンプレートの作成
    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p th:text="${data}">empty</p>
    </body>
    </html>
    ビューテンプレートを呼び出すコントローラ
    @Controller
    public class ResponseViewController {
    
        @RequestMapping("/response-view-v1")
        public ModelAndView responseViewV1() {
            ModelAndView mav = new ModelAndView("response/hello")
                    .addObject("data", "hello!");
            return mav;
        }
    
        @RequestMapping("/response-view-v2")
        public String responseViewV2(Model model) {
            model.addAttribute("data","hello!");
            return "response/hello";
        }
    
        //권장 X
        @RequestMapping("/response/hello")
        public void responseViewV3(Model model) {
            model.addAttribute("data","hello!");
        }
    }

    String-ViewまたはHTTPメッセージが返された場合


    @ResponseBodyがない場合は、response/helloを使用してViewResolverを実行してビューを検索およびレンダリングします.
    @ResponseBodyがある場合は、ViewResolverを実行せずに、HTTPメッセージ本体にresponse/hello文字を直接入力します.
    ビューの論理名response.helloを返すと、次のパスのビューテンプレートがレンダリングされます.
  • 実行:templates/response/hello.html
  • HTTPメッセージ


    @ResponseBodyとHttpEntityを使用すると、ビューテンプレートではなくHTTPメッセージボディに応答データを直接出力できます.

    HTTPは-HSTP APIに応答し、メッセージ本体に直接入力する


    HTTP APIが提供されると、JSON形式でHTTPメッセージ本体にデータが送信される.

    ResponseBodyController

    @Slf4j
    @Controller
    @ResponseBody
    // @RestController
    public class ResponseBodyController {
    
        @GetMapping("/response-body-string-v1")
        public void responseBodyV1(HttpServletResponse response) throws IOException {
            response.getWriter().write("ok");
        }
    
        @GetMapping("/response-body-string-v2")
        public ResponseEntity<String> responseBodyV2(HttpServletResponse response) throws IOException {
            return new ResponseEntity<>("ok", HttpStatus.OK);
        }
    
     //   @ResponseBody
        @GetMapping("/response-body-string-v3")
        public String responseBodyV3() {
            return "ok";
        }
    
        @GetMapping("/response-body-json-v1")
        public ResponseEntity<HelloData> responseBodyJsonV1() {
            HelloData helloData = new HelloData();
            helloData.setUsername("userA");
            helloData.setAge(20);
    
            return new ResponseEntity<>(helloData, HttpStatus.OK);
        }
    
        @ResponseStatus(HttpStatus.OK)
    //    @ResponseBody
        @GetMapping("/response-body-json-v2")
        public HelloData responseBodyJsonV2() {
            HelloData helloData = new HelloData();
            helloData.setUsername("userA");
            helloData.setAge(20);
    
            return helloData;
        }
    }
    
    responseBodyV1
    サーブレットを直接処理するように、HTTPメッセージ本体には、HttpサーブレットResponseオブジェクトを介してok応答メッセージが直接伝達される.response.getWriter().write("ok")responseBodyV2
    responseEntityエンティティはHttpEntityを継承し、HttpEntityはHTTPメッセージのタイトルとマスター情報を有する.ResponseEntityでは、HTTPレスポンスコードを設定することもできます.
    responseBodyV3
    @ResponseBodyを使用すると、viewを使用せずにHTTPメッセージ変換器から直接HTTPメッセージを入力できます.ResponseEntityも同様に動作します.
    responseBodyJsonV1
    フィードバックフィードバック.HTTPメッセージ変換器でJSON形式に変換して返します.
    responseBodyJsonV2
    ResponseEntityではHTTPレスポンスコードを設定できますが、@ResponseBodyではこれらを設定するのは難しいです.
    @ResponseStatus(HttpStatus.OK)を使用してプレゼンテーションを行い、レスポンスコードを設定することもできます.
    @RestController
    @RestControllerを使用すると、これらのコントローラはすべて@ResponseBodyの効果を有します.したがって、ビューテンプレートではなく、HTTPメッセージ本体に直接データを入力します.その名の通り、REST APIを作成する際に使用されるコントローラです.
    参照として,@ResponseBodyはクラスレベルで全方法に適用され,@RestControllerはノイズに@ResponseBodyを適用した.

    HTTPメッセージ変換器


    HTTP APIのように直接HTTPメッセージ本体からJSONデータを読み込んだり書き込んだりすれば、HTTPメッセージ変換器を使うと便利です.

    @ResponseBodyの原理を使う



    使用
  • @ResponseBody
  • HTTPのBODY直接文字内容を返す
  • HttpMessageConverterがViewResolverに取って代わる動作
  • デフォルト文字処理:StringHttpMessageConverter
  • デフォルトオブジェクト処理:MappingJackson 2 HttpMessageConverter
  • Spring MVCは以下の場合にHTTPメッセージ変換器を適用する.
  • HTTPリクエスト:@RequestBody,HttpEntity
  • HTTP応答:@ResponseBody,HTTPEntity
  • HTTPメッセージ変換器は、HTTP要求とHTTP応答を同時に使用する.
  • canRead()、canWrite():メッセージ変換器がクラスをサポートしているかどうかを確認します.メディアタイプ
  • read()、write():メッセージ変換器によるメッセージの読み書き
  • スプリングガイドは、ターゲットクラスタイプとメディアタイプを確認することによって、使用するかどうかを決定します.気に入らない場合は、次のメッセージコンバータに移動します.
  • ByteArrayHttpMessageConverter:byte[]データを処理します.
  • クラスタイプ:byte[],メディアタイプ:/
  • リクエスト例)@RequestBody byte[]data
  • 応答例)@ResponseBody return byte[]
    書き込みメディアタイプアプリケーション/octet-stream
  • StringHttpMessageConverter:String文字でデータ処理を行います.
  • カテゴリ:String、Media Type/
  • リクエスト例)@RequestBody String data
  • 応答例)@ResponseBody return"OK"
    書き込みメディアタイプtext/plain
  • MappingJackson2HttpMessageConverter: application/json
  • クラスタイプ:オブジェクトまたはHashMap、メディアタイプアプリケーション/json関連
  • 要求例)@RequestBody HelloDataデータ
  • 応答例)@ResponseBody return helloData
    書き込みメディアタイプアプリケーション/json

  • リクエストマッピングhandler depter構造はよく理解できないので、もっと理解して整理します.🤫