SpringMVC フレームワークの詳細な説明

1.Spring MVC とは?

Spring MVC の公式説明は次のとおりです。

Spring Web MVC は、Servlet API 上に構築されたオリジナルの Web フレームワークであり、Spring フレームワークに最初から含まれています。正式名称「Spring Web MVC」はそのソースモジュール(spring-webmvc)の名前に由来しますが、「SpringMVC」と呼ばれることが多いです。

上記の定義から、2 つの重要なメッセージを引き出すことができます。

  1. Spring MVC は Web フレームワークです。
  2. Spring MVC は、サーブレット API の上に構築されています。

ただし、Spring MVC とは何かを本当に理解するには? まず、MVC とは何かを理解する必要があります。

1.1 MVCとは

MVCModel View Controllerの略で、ソフトウェア エンジニアリングにおけるソフトウェア アーキテクチャ パターンで、ソフトウェア システムをモデル、ビュー、コントローラの 3 つの基本部分に分割します。

  • モデル(モデル) は、アプリケーション データ ロジックの処理に使用されるアプリケーションの一部です。通常、モデル オブジェクトはデータベース内のデータへのアクセスを担当します。
  • ビュー(ビュー) は、データの表示を処理するアプリケーションの一部です。通常、ビューはモデル データから作成されます。
  • コントローラー(コントローラー) は、ユーザーの操作を処理するアプリケーションの一部です。通常、コントローラーは、ビューからのデータの読み取り、ユーザー入力の制御、モデルへのデータの送信を担当します。

1.2 MVC と Spring MVC の関係

MVC はアイデアであり、Spring MVC は MVC アイデアの具体的な実現です。一般的に、Spring MVC は、MVC パターンを実装し、サーブレット API を継承する Web フレームワークです。

2. 最初の SpringMVC プログラム

(1) SpringMVC プロジェクトの作成
Spring Boot をベースに Spring MVC を作成する、つまり、Spring Boot プロジェクトを作成し、Spring Web モジュールを確認することができます 詳細は、SpringBoot プロジェクトの作成と運用 を参照してください。

(2) ユーザーとSpringプログラムとの相互接続を実現するUserControllerクラスを作成具体的な実装コードは以下の通り。

@Controller
@ResponseBody
@RequestMapping("/user")    // 路由映射
public class UserController {
    
    

    @RequestMapping("/hi")
    public String sayHi() {
    
    
        return "<h1>hi, SpringMVC<h1>";
    }
}

(3) 実装後、プロジェクトを起動し、アドレス http://localhost:8080/user/hi にアクセスすると、「hi, SpringMVC」の情報が表示されます。

2.1 @RequestMapping アノテーション

@RequestMappingこれは、Spring Web アプリケーションで最も一般的に使用されるアノテーションの 1 つであり、インターフェースのルート マッピングを登録するために使用されます。

ルート マッピング: いわゆるルート マッピングとは、ユーザーが URL にアクセスしたときに、ユーザーの要求をプログラム内の特定のクラスの特定のメソッドにマッピングするプロセスを指し、ルート マッピングと呼ばれます。

2.2 @ResponseBody アノテーション

@ResponseBody戻り値がcharacterの場合はに変換されtext/html、戻り値がobjectの場合はに変換されてフロントエンドにapplication/json返され。
@ResponseBodyメソッドまたはクラスを変更するために使用できます。変更されたクラスは、クラス内のすべてのメソッドがhtmlorjsonではなくor を返すことを意味します视图

2.3 get と post

@RequestMappingデフォルトは request のgetメソッド。POST リクエストを受け取りたい場合は、明示的に@RequestMappingreceive を指定できますpost

@RequestMapping(value = "/hi",method= RequestMethod.POST)

get リクエストを記述する 3 つの方法:

// 写法1
@RequestMapping("/index") 
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET) 
// 写法3
@GetMapping("/index")

投稿リクエストを書く 2 つの方法:

// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST) 
// 写法2
@PostMapping("/index")

3. パラメータを取得する

3.1 単一のパラメーターを渡す

Spring MVC では、次のコードのように、メソッド内のパラメーターを直接使用してパラメーターを渡すことができます。

    @RequestMapping("/showname")
    public String showName(String name) {
    
    
        return "姓名:" + name;
    }

郵便配達員でパラメーターの受け渡しをシミュレートします。
ここに画像の説明を挿入

3.2 オブジェクトの受け渡し

Spring MVC は、Person オブジェクトなどのパラメーター オブジェクトの割り当てを自動的に実装できます。Person
クラスを作成します。

@Data
public class Person {
    
    
    private int id;
    private String name;
    private String password;
}

オブジェクト コードの実装を渡します。

    @RequestMapping("/person")
    public Object getPerson(Person person) {
    
    
        return person;
    }

URL を介してパラメーターにアクセスし、渡します。
ここに画像の説明を挿入

3.3 フォーム パラメータの受け渡し/複数のパラメータの受け渡し (非オブジェクト)

@RequestMapping("/login")
    public String login(String username, String password) {
    
    
        return "用户名:" + username + " 密码:" + password;
    }

URL を介してパラメーターにアクセスし、渡します。
ここに画像の説明を挿入

3.4 バックエンド パラメータの名前変更 (バックエンド パラメータ マッピング)

いくつかの特殊なケースでは, フロントエンドによって渡されたパラメータキーがバックエンドによって受信されたキーと一致しないことがあります. 例えば, フロントエンドは時間をバックエンドに渡し, バックエンドはそれを受け取るための createtime フィールドを持っています. , だからパラメータの受信が発生します. これが当てはまらない場合, フロントエンドとバックエンドのパラメータ値の名前を変更する@RequestParamために.

    @RequestMapping("/time")
    public String getTime(@RequestParam("time") String createtime) {
    
    
        return createtime;
    }

パラメータを渡す URL を入力します。
ここに画像の説明を挿入

3.5 パラメータの設定はオプションです

パラメータを時間に渡さずに上記の例を見てみましょう。
ここに画像の説明を挿入

400 と報告されますが、なぜこれが起こっているのですか? ソースコード
を見てください:パラメータはデフォルトで必須であることがわかりました. パラメータを渡さない場合, エラーが報告されます.設定で設定することにより, パラメータを必須でないように設定できます. 具体的な実装以下のとおりであります:@RequestParam
ここに画像の説明を挿入
@RequestParamrequired=false

    @RequestMapping("/time2")
    public String getTime2(@RequestParam(value = "time", required = false) String createtime) {
    
    
        return createtime;
    }

URL を介したアクセスでは、パラメーターは設定されません。
ここに画像の説明を挿入

設定が有効であることを示すエラーは報告されていないことがわかりました。

3.6 JSONオブジェクトを受け取る

    @RequestMapping(value = "getjson", method = RequestMethod.POST)
    public Object getJson(@RequestBody Person person) {
    
    
        return person;
    }

postman を介して json 文字列を渡します。
ここに画像の説明を挿入

正常に受信されました。

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

    @RequestMapping("/geturl/{name}/{password}")
    public String getUrl(@PathVariable String name, @PathVariable String password) {
    
    
        return "名称:" + name + " 密码:" + password;
    }

URL でパラメーターを取得します。
ここに画像の説明を挿入

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

application.yml構成ファイルを作成し、構成ファイルのパスを保存します。

# 图片保存路径
myfile:
  path: E:/Data/

バックエンド実装コード:

    @Value("${myfile.path}")
    private String filePath;    // 从配置文件中获取文件上传路径

    @RequestMapping("/upfile")
    public boolean upFile(String name, @RequestPart("myfile") MultipartFile file) {
    
    
        boolean result = false;
        try {
    
    
            // 得到原文件的名称和后缀
            String fileType = file.getOriginalFilename();
            if (fileType != null) {
    
    
                fileType = fileType.substring(fileType.lastIndexOf("."));
            }
            // 文件保存的名称
            String fileName = UUID.randomUUID().toString() + fileType;
            file.transferTo(new File(filePath + fileName));
            result = true;
            log.info(name + ":图片上传成功!");
        } catch (IOException e) {
    
    
            log.error(name + ":图片上传失败!");
        }
        return result;
    }

: ここではログを使用しており、@Slf4jクラスにアノテーションを追加する必要があります。

postman でファイルをアップロードします。
ここに画像の説明を挿入
ファイルは次のパスに正常に保存されます。
ここに画像の説明を挿入
ここに画像の説明を挿入

コンソールには成功ログも出力されます。
ここに画像の説明を挿入

3.9 Cookie/セッション/ヘッダーを取得する

Cookie を取得する方法 1:

    @RequestMapping("/getck")
    public void getCookie(HttpServletRequest request) {
    
    
        Cookie[] cookies = request.getCookies();
        Arrays.stream(cookies).forEach(cookie -> {
    
    
            log.info(cookie.getName() + ":" + cookie.getValue());
        });
    }

方法 2:

    @RequestMapping("/getck2")
    public String getCookie2(@CookieValue("bite") String bite) {
    
    
        return bite;
    }

ヘッダーを取得:

    @RequestMapping("/header")
    public String getHeader(@RequestHeader("User-Agent") String userAgent) {
    
    
        return userAgent;
    }

セッションを取得する方法 1:

    @RequestMapping("/getsess")
    public String getSession(HttpServletRequest request) {
    
    
        String result = "";
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute("SESSION_KEY") != null) {
    
    
            result = (String) session.getAttribute("SESSION_KEY");
        }
        return result;
    }

方法 2:

    @RequestMapping("/getsess2")
    public String getSession2(@SessionAttribute(required = false, name = "SESSION_KEY") String data) {
    
    
        return data;
    }

セッションを設定:

    @RequestMapping("/setsess")
    public boolean setSession(HttpServletRequest request) {
    
    
        boolean result = false;
        try {
    
    
            HttpSession session = request.getSession(true);
            session.setAttribute("SESSION_KEY", "java");
            result = true;
        } catch (Exception e) {
    
    
            log.error("出现异常:" + e.getMessage());
        }
        return result;
    }

4.データを返す

4.1 静的ページに戻る

フロントエンド ページ index.html を作成します。
ここに画像の説明を挿入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 style="color: blue">hello, SpringMVC</h1>
</body>
</html>

コントローラ コントローラを作成します。

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

ブラウザに URL を入力:
ここに画像の説明を挿入

4.2 JSON オブジェクトを返す

    @RequestMapping("/map")
    @ResponseBody
    public HashMap<String, String> mapJson() {
    
    
        HashMap<String, String> map = new HashMap<>();
        map.put("Java", "Java Value");
        map.put("MySQL", "MySQL Value");
        map.put("Redis", "Redis Value");
        return map;
    }

ここに画像の説明を挿入

4.3 リクエストの転送またはリクエストのリダイレクト

return は、ビューを返すだけでなく、ジャンプも実現できます。ジャンプには 2 つの方法があります。

  • forward: 転送要求;
  • redirect: リダイレクトを要求します。

リクエストの転送とリダイレクトの使用の比較:

// 请求重定向
@RequestMapping("/index1")
public String index(){
    
    
return "redirect:/index.html"; 
}
// 请求转发
@RequestMapping("/index2") 
public String index2(){
    
    
return "forward:/index.html"; 
}

フォワードとリダイレクトの例を挙げてください.
たとえば、あなたがボーイフレンド/ガールフレンドにアイスクリームを食べたいと言った場合、彼/彼女がイエスと言うなら、私はあなたのためにそれを買いますforward请求转发.一人で、はいredirect重定向

転送とリダイレクトの具体的な違いは次のとおりです。

  • リクエストのリダイレクト(redirect) はリクエストをリソースに再配置し、リクエストの転送(forward) はサーバー側の転送です。
  • リクエストのリダイレクトアドレスは変更されますが、リクエストの転送アドレスは変更されません。
  • リクエストのリダイレクトは、新しいアドレスへの直接アクセスと同じ効果があり、元の外部リソースにアクセスできないことはありません。リクエストの転送サーバー側の転送により、元の外部リソースにアクセスできなくなる場合があります。

おすすめ

転載: blog.csdn.net/m0_59140023/article/details/125799039