【SpringMVC】Spring Web MVC 入門 (1)

ここに画像の説明を挿入します

序文

Spring とは何かについては以前に学習しました。そこで、今日は日常の Web サイト開発で広く使用されているフレームワークである Spring Web MVC を共有します。

Spring Web MVCとは何ですか?

まずは公式の説明を見てみましょう。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
Spring Web MVC は Spring Framework が提供する Web コンポーネントであり、主に柔軟で疎結合な Web アプリケーションを開発するために使用される MVC デザインパターンのフレームワークです。これは、Web アプリケーションの開発に使用できる Model-View-Controller (略して MVC) アーキテクチャとコンポーネントを提供します。

Spring Web MVC は、リクエスト駆動型の Web MVC 設計パターンを実装する Java ベースの軽量 Web フレームワークです。これは、MVC アーキテクチャ パターンのアイデアを使用して、Web 層の責任を分離します。リクエスト駆動とは、リクエスト/レスポンス モデルの使用を指します。フレームワークの目的は、日々の Web 開発を簡素化することです。 Spring Web MVC は、日常の Web 開発を簡素化することも目的としています。

MVC アーキテクチャ パターンについては常に言及されてきましたが、MVC とは正確には何でしょうか?

MVCとは

MVC (モデル-ビュー-コントローラー) アーキテクチャ モデルは、ユーザー インターフェイス、データ モデル、コントローラーを分離するために使用されるソフトウェア設計パターンです。このアーキテクチャ パターンにより、システムの保守性、拡張性、柔軟性が向上します。 MVC アーキテクチャでは、モデルはアプリケーションのデータとビジネス ロジックの処理を担当し、ビューはユーザーへのデータの表示を担当し、コントローラーはユーザー要求の処理とモデルとビュー間の対話の調整を担当します。 。
ここに画像の説明を挿入します

  • ビュー: ブラウザーと対話してデータを表示するためにアプリケーション内で特に使用されるリソースを指します。
  • モデル: アプリケーションの主要部分であり、プログラム内のデータ ロジックを処理するために使用されます。
  • コントローラー: ディスパッチャーとして理解でき、ビューからのリクエストを処理するためにどのモデルを使用する必要があるか、処理後にどのビューに戻る必要があるかを決定するために使用されます。ビューとモデルを接続するためにすぐに使用できます

MVC アーキテクチャ パターンは、デスクトップ アプリケーションや Web アプリケーションの開発でよく使用されます。 Web アプリケーションでは、通常、コントローラーはサーブレットまたはコントローラー クラスによって実装され、モデルは通常 Java クラスによって実装され、ビューは HTML または JSP ページによって実装されます。 MVC アーキテクチャ パターンを通じて、プログラムの各部分をより独立させ、保守と拡張を容易にすることができます。

Spring MVCとは何ですか?

MVC はアーキテクチャの設計パターンおよびアイデアであり、Spring MVC は MVC のアイデアを具体的に実装したものであり、Web アーキテクチャでもあります。

要約すると、Spring MVC は、MVC アーキテクチャ パターンを実装する Web フレームワークです。

以前に Spring Boot プロジェクトを作成したとき、チェックされた Spring Web フレームワークは実際には Spring MVC フレームワークでした。

ここに画像の説明を挿入します
Spring Boot と Spring MVC がありますが、両者の違いは何でしょうか?

Spring Boot と Spring MVC の違い

スプリングブートとは何ですか?

Spring Boot は Pivotal チームが提供する新しいフレームワークで、新しい Spring アプリケーションの初期構築と開発プロセスを簡素化するように設計されています。このフレームワークは構成にアドホックなアプローチを使用するため、開発者が定型的な構成を定義する必要がありません。このようにして、Spring Boot は、急速なアプリケーション開発という急成長を遂げている分野のリーダーになることを目指しています。 Spring Boot は Spring ファミリーのサブプロジェクトであり、その独自の設計は Spring の構成を簡素化し、独立して実行されるプログラムを簡単に構築でき、開発効率を大幅に向上させることができます。

関係性と相違点

Spring MVC は Web アプリケーションを構築するためのフレームワークであり、MVC 設計パターンに基づいており、ビジネス ロジック、データ、インターフェイス表示を分離することで、コンポーネント間の依存関係を減らし、コードの再利用性を向上させます。 Spring MVC では、アプリケーションのさまざまなコンポーネントと依存関係を管理するために、XML または他のタイプの構成ファイルを手動で構成する必要があります。

Spring Boot は、Spring アプリケーションの初期構築および開発プロセスを簡素化することを目的とした、より最新のフレームワークです。構成よりも規約の原則により、Spring Boot はアプリケーションのさまざまなコンポーネントと依存関係を自動的に構成し、面倒な手動構成プロセスを回避できます。さらに、Spring Boot には、組み込み Web サーバー、自動テスト、セキュリティ制御などの多くの組み込み機能とツールも提供されており、開発者はビジネス ロジックの実装にさらに集中できるようになります。

したがって、Spring Boot は Spring MVC をアップグレードおよび最適化したものであり、自動構成と組み込みツールによって開発プロセスを簡素化し、開発効率を向上させることができます。同時に、Spring Boot は Spring MVC などの他の Spring コンポーネントの使用もサポートしており、それらとシームレスに統合できます。

簡単に言うと、Spring MVC は Spring Boot を通じて Spring MVC の依存関係を追加することで Web 関数を実装します。

Spring MVC は MVC アーキテクチャ パターンを実装していますが、Spring MVC は独自の特性を組み合わせていくつかの変更も加えています。

ここに画像の説明を挿入します

Spring MVC の学習

Spring MVC とは何かを理解した後、Spring MVC を学習します。Spring MVC では多くのアノテーションが使用されるため、Spring MVC を学習する鍵はそのアノテーションを学習することです。

注釈の概要

1. @SpringBootApplication

Spring MVC プロジェクトを作成すると、「プロジェクト名」+Application クラスが自動的に生成され、このクラス内に最初のアノテーションが表示されます。

ここに画像の説明を挿入します
@SpringBootApplication は、@SpringBootConfiguration と @EnableAutoConfiguration を組み合わせた便利なアノテーションです。このアノテーションにより、Spring Boot プロジェクトを迅速に開始できるようになります。

  • @SpringBootConfiguration: このアノテーションは、現在のクラスが Spring Boot 構成クラスであり、これには基本的な Spring Boot 構成が含まれることを示します。
  • @EnableAutoConfiguration: このアノテーションは、現在のプロジェクトのクラスパスと構成されたプロパティに基づいて必要な Bean を自動的に選択して構成するように Spring Boot に指示するために使用されます。これにより、新しいプロジェクトのセットアップが大幅に簡素化されます。

Spring Boot プロジェクトで @SpringBootApplication アノテーションを使用すると、アプリケーションをすぐに起動してテストできるように、開発環境が自動的に構成されます。同時に、コードをより簡単に管理できるように、基本的なディレクトリ構造も提供します。

つまり、@SpringBootApplication アノテーションが付与されたクラスが Spring MVC プロジェクトの起動クラスとなり、このクラスからプロジェクトが起動されます。

まずは簡単な Spring MVC コードを書いてみましょう。

package com.example.springmvcdemo2;

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

@RestController
public class HelloController {
    
    
    @RequestMapping("/hi")
    public String hi() {
    
    
        return "你好,Spring MVC";
    }
}

このコードを記述して開始すると、次の結果がコンソールに表示されます。

ここに画像の説明を挿入します
このような結果は、Spring MVC プロジェクトが正常に開始されたことを示しています。

次に、ブラウザを使用して現在の Spring MVC プロジェクトにアクセスし、ブラウザの検索バーにhttp"//127.0.0.1:8080/hi と入力します。なぜこのように URL を入力する必要があるのでしょうか。前に述べたように、Spring はサーブレットに基づいて開発されているため、Spring は Tomcat サーバーも使用します。Tomcat はデフォルトで 8080 ポートと 8005 管理ポートにバインドされているため、Spring プロジェクトにアクセスするには、Spring プロジェクトの 8080 ポートへのアクセスも必要です。しかし、以前にサーブレットを調べたときに、URL の /hi に加えて、パスにもプロジェクト名があることがわかりましたが、なぜそれをパスに含める必要がないのでしょうか。ここに Spring MVC プロジェクトにアクセスするときの URL を入力しますか? プロジェクト名を追加する場合はどうすればよいですか?前のサーブレットでは、Tomcat とプロジェクトの関係は次のようになります。1 つの Tomcat サーバーは複数のプロジェクトを持つことができますが、Spring MVC では、Tomcat とプロジェクトの関係は次のようになります。1 つの Spring MVC プロジェクトには 1 つの Tomcat サーバーが含まれ、1 つのプロジェクトは 1 つの Tomcat に対応します。つまり、Spring MVC では、複数の Tomcat サーバーを同時に起動できます。これらの複数の Tomcat サーバーのポートが競合しない限り、Spring MVC プロジェクトにアクセスするときにその必要はありません。プロジェクト名を指定します。 。

次に、/hi が @RequestMapping のコンテンツです。

ここに画像の説明を挿入します

2 つの新しいアノテーション @RestController と @RequestMapping も、上記の単純なコードに表示されます。これら 2 つのアノテーションの役割を見てみましょう。

2. @RestController

Spring MVC プロジェクトには多くのクラスがあり、各クラスには多くのメソッドがある可能性がありますが、Spring プログラムはどのメソッドを実行するかをどのようにして知るのでしょうか?

Spring はすべてのクラスをスキャンします。クラスに @RestController アノテーションが付いている場合、Spring はこのクラスのメソッドに @RequestMapping アノテーションが付いているかどうかを確認します。もちろん、その役割はこれに限定されません。まずは使って詳しく説明します後で。

3. @RequestMapping

Spring MVC で @RequestMapping を使用して、ブラウザ コネクタの役割である URL ルーティング マッピングを実装します。

ルート マッピング: ユーザーが URL にアクセスしたときに、ユーザーのリクエストをプログラム内の特定のクラスのメソッドにマッピングするプロセスをルート マッピングと呼びます。

上記のコードでは、ローカル Tomcat サーバーである 127.0.0.1:8080 にアクセスするときに、次の /hi は /h1 ルーティング マップにアクセスする方法を示しています。

では、この @RequestMapping の / は省略できますか? / を省略すると Spring が自動的に / を追加してくれるので、/ を追加することをお勧めします。

package com.example.springmvcdemo2;

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

@RestController
public class HelloController {
    
    
    @RequestMapping("hi")
    public String hi() {
    
    
        return "你好,Spring MVC";
    }
}

ここに画像の説明を挿入します

@RequestMapping は Spring MVC プロジェクトで最もよく使用されるアノテーションの 1 つです。@RequestMapping の使い方を詳しく学習してみましょう。

3.1 @RequestMapping の使用法

@RequestMapping アノテーションはメソッドだけでなくクラスでも使用できます。

package com.example.springmvcdemo2;

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

@RestController
@RequestMapping("sayHi")
public class HelloController {
    
    
    @RequestMapping("hi")
    public String hi() {
    
    
        return "你好,Spring MVC";
    }
}

@RequestMapping がクラスを変更する場合、アクセスされるアドレスはクラスパス + メソッドパスになります。

ここにアクセスする場合、クラスパスが追加されていないとアクセスが成功しません。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

3.2 @RequestMapping は GET メソッドまたは POST メソッドを受け入れることができますか?

この問題を解決するには、postman を使用して GET リクエストと POST リクエストをそれぞれ構築する必要があります。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
postman によって構築された GET リクエストと POST リクエストを見ると、この @RequestMapping がデフォルトで GET メソッドと POST メソッドをサポートしていることがわかります。答えは「はい」です。 @ReqeustMapping のソース コードを見てみましょう。

ここに画像の説明を挿入します

  1. @Target({ElementType.TYPE, ElementType.METHOD}): このアノテーションはクラス レベルまたはメソッド レベルで使用できます。
  2. @Retention(RetentionPolicy.RUNTIME): このアノテーションは実行時に有効です。つまり、ランタイム コードはこのアノテーションの情報にアクセスできます。
  3. @Documented: これは、API ドキュメントの生成に使用される標準の JavaDoc アノテーションです。
  4. @Mapping: このアノテーションは通常、処理メソッドを URL パスにマッピングするために Spring の @Configuration クラスとともに使用されます。
  5. @Reflective({ControllerMappingReflectiveProcessor.class}): このアノテーションは、実行時にこのアノテーションを使用してクラスとメソッドを解析して処理するように Spring に指示します。

注釈内の各要素は次のとおりです。

  1. name(): このマッピングの名前を表す文字列を返します。指定しない場合、デフォルトは空の文字列になります。
  2. value(): マッピングする必要がある URL パスを表す文字列配列を返します。指定しない場合、デフォルトは空の配列になります。このパスには、/users/{id} などのプレースホルダーを含めることができます。
  3. path(): URL パスを指定するために使用される別の配列。この配列の値は value() によって返される値と同じであり、それらは相互のエイリアスです。
  4. Method(): このマッピングで受け入れられる HTTP メソッドのタイプを示す RequestMethod 配列を返します。指定しない場合は、デフォルトで空の配列が設定され、すべてのメソッド タイプが受け入れられることを示します。
  5. params(): リクエストパラメータを表す文字列配列を返します。リクエスト パラメータが配列のいずれかに一致すると、このマッピングがトリガーされます。
  6. headers(): リクエストヘッダーを表す文字列配列を返します。リクエスト ヘッダーが配列のいずれかに一致すると、このマッピングがトリガーされます。
  7. Consumers(): このマップで受け入れられるメディア タイプを示す文字列の配列を返します。指定しない場合、デフォルトは空の配列となり、すべてのメディア タイプが受け入れられることを示します。
  8. generated(): このマッピングが生成できるメディア タイプを示す文字列配列を返します。指定しない場合は、デフォルトで空の配列が設定され、すべてのメディア タイプを生成できることを示します。

@RequestMapping のメソッドは、デフォルトではすべてのメソッドからリクエストを受け取るように設定されていますが、メソッドを指定したい場合は、リクエストされたメソッドを明示的に指定できます。

@RequestMapping(value = "sayHi", method = RequestMethod.GET)

@RequestMapping にパラメーターが 1 つしかない場合、このパラメーターは value とみなされます。複数のパラメーターがある場合は、value="sayhi"、method=RequestMethod.GET と同様に、パラメーターのキーを明示的に指定する必要があります。

GET リクエストの受信のみを許可するように @RequestMapping のパラメータを変更した後、postman を使用して GET リクエストと POST リクエストを構築し、結果を確認します。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
POST メソッドが構築されると、405 が表示され、メソッドは許可されません。

4 件のリクエスト

異なるパスにアクセスするということは、異なるリクエストを送信することを意味します。リクエストを送信するときに、いくつかのパラメーターが渡される場合があり、バックエンドは、対応するビジネス処理を実行するために、これらの渡されたパラメーターを取得する必要があります。

4.1 単一パラメータの受け渡し

Spring MVC では、渡されたパラメーターと同じ名前を使用してこのパラメーターを取得できます。これはすべて Spring MVC の最下層によって行われます。実際、Spring MVC の最下層は私たちのために多くのことを行ってくれます。リクエストがコントローラーから Mudel に転送されると、必要なものが Spring MVC の最下層で処理されているので、使用したい場合はそれらを取得するだけです。

package com.example.springmvcdemo2;

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

@RestController
@RequestMapping("/request")
public class UserController {
    
    
    @RequestMapping("/r1")
    public String r1(String name) {
    
    
        return "name: " + name;
    }
}

ここに画像の説明を挿入します

ただし、パラメーター名を要求されたパラメーター名と異なるように設定すると、バックエンドはこのパラメーターを取得できなくなります。

package com.example.springmvcdemo2;

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

@RestController
@RequestMapping("/request")
public class UserController {
    
    
    @RequestMapping("/r1")
    public String r1(String username) {
    
    
        return "name: " + username;
    }
}

ここに画像の説明を挿入します

4.2 複数のパラメータを渡す
@RequestMapping("/r2")
public String r2(String name, int age) {
    
    
    return "name: " + name + " age: " + age; 
}

ここに画像の説明を挿入します

リクエスト内のパラメーターの順序は、コードがパラメーターを取得する順序と一致している必要がないことがわかります。

ここで年齢のパラメータを渡さないとどうなるでしょうか?

ここに画像の説明を挿入します
int 型の age パラメータが渡されると、ここで 500 エラーが報告されます。つまり、サーバーの Java コードにエラーがあります。このとき、何が問題だったのかを確認するためにコード ログを確認する必要があります。

ここに画像の説明を挿入します
先ほどのコードの観察から、パラメーターが渡されない場合はデフォルトで null が返されることがわかりますが、パラメーターの受け取りに int 型を使用しているため、int 型を null に変換することはできません。この問題を回避するには、int 型のラッパークラス Integer を使用して、返された null を処理できるようにする方法です。

@RequestMapping("/r2")
public String r2(String name, Integer age) {
    
    
    return "name: " + name + " age: " + age;
}

ここに画像の説明を挿入します
上記の例から、パラメーターを受け取るときは、基本的なデータ型のラッパー クラスを使用するようにしてくださいという結論が得られます。

もう 1 つの問題は、バックエンドがこのパラメーターの型が Integer であると考えているため、それを受け取るために Integer を使用しますが、リクエストで渡されるパラメーターの型が String である場合、何が起こるでしょうか。見に来て。

ここに画像の説明を挿入します
バックエンドによって取得されるパラメータのデータ型は、要求されたパラメータのデータ型と変換可能である必要があります。そうでない場合は、フロントエンドとバックエンドの間でネゴシエーションが必要となる問題が発生します。

4.3 オブジェクトの通過

渡されるパラメータが多いと、メソッド宣言に多くの仮パラメータが必要になり、後からパラメータを追加する際には、メソッド内の仮パラメータも変更する必要があり、非常に面倒なので、これらのパラメータをカプセル化することができます。オブジェクトとして、このオブジェクトで使用される可能性のあるすべてのパラメータを一度に書き込むことができます。リクエストにパラメータが渡されない場合、パラメータはデフォルト値に設定されます。後でパラメータを追加する必要がある場合でも、パラメータはデフォルト値に設定されます。 be カプセル化するこのオブジェクトの変更。 Spring MVC が受け取ったパラメータがオブジェクト型の場合、Spring MVC はオブジェクト内の属性に基づいてリクエスト内の対応する値を見つけ、これらの属性を値に割り当てます。これにより、プログラマの作業が大幅に容易になります。 . .

UserInfo オブジェクトをカプセル化します。

package com.example.springmvcdemo2;

public class UserInfo {
    
    
    private String name;
    private Integer age;
    private Integer id;

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public Integer getAge() {
    
    
        return age;
    }

    public void setAge(Integer age) {
    
    
        this.age = age;
    }

    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    @Override
    public String toString() {
    
    
        return "UserInfo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}
@RequestMapping("/r3")
public String r3(UserInfo user) {
    
    
    return user.toString();
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します

4.4 パラメータの名前変更

フロントエンドとバックエンドはプロジェクトを開始する前にリクエスト内のパラメータ名をネゴシエートする必要がありますが、バックエンド プログラマーがそれを作成し、その名前が良くないと感じました。変更したいです。変更できますか?答えは「はい」です。パラメータの名前を変更するには、 @RequestParam アノテーションを使用する必要があります。

@RequestMapping("/r4")
public String r4(@RequestParam("name") String username, @RequestParam("age") Integer userage) {
    
    
    return "username: " + username + " userage: " + userage;
}

ここに画像の説明を挿入します
このアノテーションを追加しても、リクエストにそのようなパラメーターが存在しない場合、問題が発生します。

ここに画像の説明を挿入します
これは、アノテーションのデフォルトでパラメータを渡す必要があるため、デフォルト値を必須ではないように設定する必要があるためです。

ここに画像の説明を挿入します

@RequestMapping("/r4")
public String r4(@RequestParam("name") String username, @RequestParam(value = "age", required = false) Integer userage) {
    
    
    return "username: " + username + " userage: " + userage;
}

ここに画像の説明を挿入します

4.5 配列の受け渡し

Spring MVC は、配列パラメーターの割り当てを自動的にバインドできます。言い換えれば、Spring MVC は、リクエストパラメータが配列である場合の処理​​を自動的に支援します。

@RequestMapping("/r5")
public String r5(String[] arr) {
    
    
    return Arrays.toString(arr);
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します

4.6 コレクションの受け渡し

配列を渡す場合と同様に、リクエスト内のパラメータに同じ名前が複数ある場合もコレクションとして扱うことができますが、コレクションとして扱う場合は @RequestParam を使用してパラメータの関係をバインドする必要があります。デフォルトでは、リクエスト内に同じ名前のパラメータが複数ある場合、Spring MVC はそれらを配列としてカプセル化しますが、それらをコレクションとしてカプセル化したい場合は、 @RequestParam を使用してパラメータの関係をバインドする必要があります。

@RequestMapping("/r6")
public String r6(@RequestParam("list") List<String> list) {
    
    
    return "size: " + list.size() + " list: " + list;
}

ここに画像の説明を挿入します

4.6 JSONデータの受け渡し

JSON データ形式は、読み書きが容易で、クロスプラットフォーム、クロス言語、軽量であるという利点があるため、ネットワーク送信で最も一般的に使用されるデータ形式と呼ばれています。 MVC?データ形式についてはどうですか?

JSON データ形式はキーと値のペアの形式であるため、受信する必要があるパラメータを Java オブジェクトにカプセル化し、それらを Spring MVC パラメータで使用します @RequestBody を使用してこのパラメータを変更すると、Spring MVC が JSON データを受信したときに、Java のプロパティに基づいて JSON データ内で同じ名前のキーと値のペアが検索されます。オブジェクトを作成し、その値を Java オブジェクトの属性に割り当てます。

@RequestMapping("/r7")
public String r7(@RequestBody UserInfo user) {
    
    
    return user.toString();
}

ここに画像の説明を挿入します

フィドラーパケットキャプチャの結果。

ここに画像の説明を挿入します

4.7 URL 内のパラメータを取得する

URL パス上のデータ バインディングは、 @PathVariable を使用して実現できます。パス上で {} を使用して、バインドされるデータを示します。

@RequestMapping("/r8/{name}/{age}")
public String r8(@PathVariable String name, @PathVariable Integer age) {
    
    
    return "name: " + name + " age: " + age;
}

ここに画像の説明を挿入します
Spring MVC がバインドされたデータのパラメーターを受け取るときは、リクエストで渡されるパラメーターの順序が一貫していることを確認する必要があります。そうしないと問題が発生する可能性があります。

ここに画像の説明を挿入します
@PathVariableで変更されたパラメータも必須となりますので、必須以外に設定したい場合は、@PathVariableのデフォルト値を変更するだけでなく、パスの調整も必要になります。

まず @PathVariable のデフォルト設定を変更して、それが機能するかどうかを確認してみましょう。

@RequestMapping("/r8/{name}/{age}")
public String r8(@PathVariable(value = "name", required = false) String name, @PathVariable Integer age) {
    
    
    return "name: " + name + " age: " + age;
}

ここに画像の説明を挿入します
明らかに成功するはずがないので、パスに変更を加える必要があります。

@RequestMapping({
    
    "/r8/{name}/{age}", "r8/{age}"})
public String r8(@PathVariable(value = "name", required = false) String name, @PathVariable Integer age) {
    
    
    return "name: " + name + " age: " + age;
}

ここに画像の説明を挿入します

4.8 ファイルのアップロード

Spring MVC は、リクエストによって送信されたファイルを受信することもできます。ファイルを受信できるように変更するには、 @RequestPart を使用します。

@RequestMapping("/r9")
public String r9(@RequestPart MultipartFile file) throws IOException {
    
    
    String fileName = file.getOriginalFilename();
    file.transferTo(new File("D:/tmp/" + fileName));
    return "接收到的文件的名称为" + fileName;
}

Spring MVC では、このタイプのファイルを表すには MultipartFile が必要です。transferTo()この方法では、指定されたディレクトリにファイルをコピーします。

郵便配達員は次のようにファイルを渡します。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

4.9 Cookieとセッションの取得

クッキーを取得する

Cookie とセッションに関する知識をご紹介しました。忘れた方はぜひご覧ください。Cookie とセッション

Cookie はリクエストの送信時にブラウザによってもたらされるため、HttpServletRequest クラスを取得し、このクラスを次のクラスに渡す必要があります。クッキーを入手します。

@RequestMapping("/r10")
public String r10(HttpServletRequest request) {
    
    
    Cookie[] cookies = request.getCookies();
    StringBuilder sb = new StringBuilder();
    for (Cookie cookie : cookies) {
    
    
        sb.append(cookie.getName());
        sb.append("=");
        sb.append(cookie.getValue());
        sb.append("<br>");
    }

    return sb.toString();
}

Spring MVC コードを作成した後、postman で Cookie を構築する必要があります。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

[ドメインの追加] をクリックすると、次のページが表示されます。次に、[Cookie の追加] をクリックして Cookie を追加します。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここで、username は Cookie の名前を表し、zhangsan は Cookie の値を表します。Path は、Web サイト上で Cookie にアクセスできるディレクトリを定義します。ここで、/ はすべてのディレクトリを表します。

ここに画像の説明を挿入します
構築が完了すると、設定した Cookie が postman のこの部分に明示的に表示されます。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

上記は Cookie の取得方法ですが、Spring MVC ではさらに便利な Cookie の取得方法も提供しています。

@RequestMapping("/r11")
public String r11(@CookieValue("username") String username) {
    
    
    return "username=" + username;
}

ここに画像の説明を挿入します
ただし、この方法では一度に 1 つの Cookie しか取得できないため、複数の Cookie を取得する必要がある場合は、最初の Cookie を取得する方法を使用できます。

セッションの取得

サーバーがセッションを取得したい場合は、リクエストの Cookie に含まれる sessionId に依存する必要があります。その後、サーバー上で、サーバーは取得した sessionId に基づいてブラウザとのセッションを取得します。 HttpServletRequest オブジェクトを取得する必要があります。

セッションを取得する前に、手動でセッションをセットアップし、いくつかの属性を設定する必要があります。

@RequestMapping("/setsession")
public String setSession(HttpServletRequest request) {
    
    
    HttpSession session = request.getSession(true);
    session.setAttribute("username", "zhangsan");

    return "设置session完成";
}

ここに画像の説明を挿入します
セッションをセットアップした後、Cookie をチェックすると、Cookie が自動的に Cookie に追加され、この Cookie が sessionId を記録していることがわかります。

ここに画像の説明を挿入します

セッションを設定したら、セッションを取得できます。

@RequestMapping("/getsession")
public String getSession(HttpServletRequest request) {
    
    
    HttpSession session = request.getSession(false);
    if (session != null) {
    
    
        return "username: " + (String)session.getAttribute("username");
    }

    return "session为null";
}

ここに画像の説明を挿入します

Spring MVC には、セッションを取得するための簡単な方法がいくつか用意されています。

@RequestMapping("/getsession1")
public String getSession1(HttpSession session) {
    
    
    return "username: " + (String)session.getAttribute("username");
}

ここに画像の説明を挿入します
それだけでなく、ブラウザとサーバーが初めて接続を確立する場合、セッションは存在しません。つまり、セッションが null の場合、session.getAtttribute() には null がありません。これは、基礎となる Spring MVC 層がこの問題の解決に役立つためです。

sessionId Cookie を削除してから、サーバーにリクエストを送信します。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

Spring MVCが提供するもう1つの方法は、よりシンプルでセッション内の属性値を直接取得できます。

@RequestMapping("/getsession2")
public String getSession2(@SessionAttribute("username") String username) {
    
    
    return "username: " + username;
}

ここに画像の説明を挿入します

4.10 ヘッダーの取得

まず、ヘッダーを取得するために従来の方法を引き続き使用します。つまり、HttpServletRequest クラスを使用して、必要なヘッダーを取得します。

@RequestMapping("/getheader")
public String getHeader(HttpServletRequest request) {
    
    
    String ua = request.getHeader("User-Agent");
    return "获取到User-Agent:" + ua;
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します
Spring MVC によって提供される @RequestHeader アノテーションを使用してヘッダーを取得します。

@RequestMapping("/getheader2")
public String getHeader1(@RequestHeader("User-Agent") String ua) {
    
    
    return "获取到User-Agent:" + ua;
}

ここに画像の説明を挿入します

5. 対応

先ほど Spring MVC から返されたレスポンスはすべてデータ型ですが、実際には、静的ページを返したり、ヘッダーの設定、ステータス コードの設定、その他の操作を返すこともできます。

5.1 固定ページに戻る

ここに静的ページを書きます。

ここに画像の説明を挿入します

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    hello, spring mvc,这里是html页面
</body>
</html>
package com.example.springmvcdemo2;


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

import java.util.HashMap;
import java.util.Map;

@RequestMapping("/response")
@RestController
public class ResponseController {
    
    
    @RequestMapping("/index")
    public Object index() {
    
    
        return "/index.html";
    }
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します
postman を介してリクエストを構築し、fiddler を使用してパケットをキャプチャすると、返されたデータが html ではなくテキスト タイプのデータであることがわかります。これは、Spring MVC が「/index.htnl」をデータの一部として扱うことを意味します。では、なぜそうなるのでしょうか?

これは @RestController の結果です。このアノテーションはデフォルトで返されたすべてをデータとして扱います。返された型を html に解析したい場合は、@RestController アノテーションを < a i に置き換える必要があります。 =1> @コントローラー

package com.example.springmvcdemo2;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RequestMapping("/response")
@Controller
public class ResponseController {
    
    
    @RequestMapping("/index")
    public Object index() {
    
    
        return "/index.html";
    }
}

ここに画像の説明を挿入します

では、この @RestController アノテーションと @Controller アノテーションの違いは何でしょうか? @RestController アノテーションのソースコードを見てみましょう。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

@RestController のソース コードを観察すると、@RestController アノテーションが @Controller + @ResponseBody として記述できることがわかります。

  • @Controller: コントローラーを定義し、Spring フレームワークの開始時にそれをロードし、このオブジェクトを管理のために Spring に渡します。
  • @ResponseBody: 返されるデータ形式を非ビューとして定義し、text/html 情報を返します
5.2 戻りデータ

静的ページに戻るには @Controller アノテーションを使用し、データを返すには @Controller アノテーションに基づいて @ResponseBody アノテーションを追加するだけです。そのため、クラス内のメソッドがビューとデータの両方を返すことができるように、コードは実際にはこの方法でより適切に記述されています。

@RequestMapping("/response")
@Controller
public class ResponseController {
    
    

    @RequestMapping("/getstatus")
    @ResponseBody
    public String getStatus() {
    
    
        return "这返回的是一个数据";
    } 
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します

5.3 HTMLコードスニペットを返す

Spring MVC で返されたデータに HTML コードが含まれている場合、ブラウザはこの HTML コードも解析します。

@RequestMapping("/returnhtml")
@ResponseBody
public String returnHtml() {
    
    
    return "<h1>Hello,HTML~</h1>";
}

ここに画像の説明を挿入します

postman が送信したリクエストを Fiddler で取得すると、レスポンスのデータ型が html 型ではなく text/plain プレーンテキスト型であることがわかります。

ここに画像の説明を挿入します
ブラウザを使用してアクセスすると、Fiddler を使用してパケットをキャプチャでき、応答のデータ型が html 型であることがわかります。

ここに画像の説明を挿入します
どうしてこれなの?実際、これは送信者が受信できるデータの種類によって異なります。postman が要求したデータ パケットをキャプチャすると、ヘッダーの accept が / であることがわかります。これは、すべての種類のデータを受信できることを意味します。

ここに画像の説明を挿入します

Spring MVC コードの戻り値の型はテキスト データ型である String であるため、postman を使用してリクエストを送信する場合、応答のデータ型は text/plain 型になります。

ブラウザから送信されたデータパケットを見ると、accept は / ではありませんが、いくつかの型が指定されていることがわかります。

ここに画像の説明を挿入します

そして、ブラウザが受信できるデータ型には text/plain がないため、ブラウザは返されたデータを解析して、どのデータ型を受信できるかを確認します。返される文字列は HTML フラグメントであるため、 HTML タイプとして解析されます。

このようにして、同じメソッドを使用して CSS、JavaScript、json、およびその他の型を返すこともできます。

5.4 JSONを返す

Spring MVC は JSON データを返すこともできます。

@RequestMapping("/returnjson")
@ResponseBody
public Map<String, String> returnJson() {
    
    
    Map<String, String> map = new HashMap<>();
    map.put("java", "java value");
    map.put("python", "python value");
    return map;
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここで返される型は Map 型であり、最終的に取得した応答のデータ型は依然として JSON であるのはなぜですか?

ここに画像の説明を挿入します

Fiddler によってキャプチャされた要求パケットの Accept から、現在あらゆる種類の応答が受信されていることを知ることができます。言い換えれば、コードによって返されるデータ型は次のとおりであるため、送信者は受信した応答のデータ型を明確に示しません。 Map (オブジェクトである場合)、Spring MVC アノテーション @ResponseBody はデフォルトで Jackson ライブラリを使用して、返されたデータ型をシリアル化/逆シリアル化するため、返される Map 型は JSON データ型に変換され、受信側で任意の型の応答を受信するため、受信したデータ型は JSON データ型になります。

5.5 ステータスコードの設定

Spring MVC でステータス コードを設定するには、HttpServletResponse クラスの setStatus() メソッドを使用する必要があります。

@RequestMapping("/returnstatus")
@ResponseBody
public String returnStatus(HttpServletResponse response) {
    
    
    response.setStatus(401);
    return "设置状态码成功";
}

ここに画像の説明を挿入します

5.6 ヘッダーの設定

Spring MVCでステータスコードを設定するには、HttpServletResponseクラスのsetHeader()メソッドを使用する必要があります。

@RequestMapping("/setheader")
@ResponseBody
public String setHeader(HttpServletResponse response) {
    
    
    response.setHeader("myheader", "666");
    return "设置header成功";
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します

5.7 応答の Content-Type を設定する

Spring MVC は、返されたデータまたはビューに基づいて、対応するデータ型を自動的に設定します。もちろん、対応するデータ型を自分で設定することもできます。 Spring MVC では、レスポンスのデータ型の設定を変更する必要があります。 @ReqeustMapping アノテーション が生成されます パラメータの値。

ここに画像の説明を挿入します

  • name(): 注釈の名前を指定します。デフォルト値は空の文字列です。
  • value() と path(): これら 2 つのプロパティは相互のエイリアスであり、マッピングを要求するパスを指定します。指定しない場合、デフォルトは空の配列になります。
  • Method(): この属性は、GET、POST、PUT などのリクエスト メソッドのタイプを指定します。デフォルトは空の配列です。
  • params(): この属性はリクエスト パラメータを指定します。デフォルトは空の配列です。
  • headers(): この属性はリクエストヘッダー情報を指定し、デフォルトは空の配列です。
  • Consumers(): この属性はリクエストのコンテンツ タイプを指定し、デフォルトは空の配列です。
  • generated(): この属性は応答コンテンツ タイプを指定し、デフォルトは空の配列です。

キーと値のペアで構成される文字列を返します。

@RequestMapping(value = "/returnjson2", produces = "application/json; charset=utf8")
@ResponseBody
public String returnJson2() {
    
    
    return "{\"sucess\":true}";
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します

プロデュースパラメータを設定しない場合、応答文字列はテキストタイプとして解析されます。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

Spring MVC は実際には戻り値の型に基づいて応答の型を決定しますが、その型がテキスト型であり、HTML、JavaScript、CSS などに解析できる場合は、応答データを指定するためのパラメータを生成するように設定できます。タイプ。

おすすめ

転載: blog.csdn.net/m0_73888323/article/details/134678266