SpringMVCプロジェクトを作成する
SpringMVC プロジェクトは実際には SpingBoot プロジェクトに似ており、もう 1 つだけ SpringWeb プロジェクトが導入されています。
このブログを読んで SpringMVC プロジェクトを作成できます-- プロジェクトのブログを作成する
Spring MVCとは
Spring とは皆さんご存知かと思いますが、MVC とは MVC とは Model View Controller の略です この 3 つの単語を分けて見てみましょう Model (モデル)、View (ビュー)、Controller (コントローラー)
百度で検索した写真はとても鮮明です
MVC はフォームであり、SpringMVC は特定の実装です。jvm メソッド領域の特定の実装が永続的な生成とメタスペースであるのと同じです。つまり、SpringMVC は MVC ソフトウェア エンジニアリング アーキテクチャ パターンを実装します。
ちなみに、SpringMVC にはまだサーブレット API が詰め込まれています
接続
ブラウザで接続するためです サーバーレットを勉強していた頃は 404 403 500 エラーを報告したくてたまらなかったです 本当に吐きました
デモディレクトリの下にクラス UserController を作成しましょう
次に、このようなコードを大量に書きます
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/user") public class UserController { @RequestMapping("sayhi") @ResponseBody public Object Sayhi(){ return "hi!SpringMVC"; } }
次に、ブラウザでこれにアクセスしてください
127.0.0.1 は固定イントラネット アドレスです
8080 は構成ファイルで定義されたポート番号です。
ユーザーとセイヒは...
操作結果:
@Controller は、このクラスがコントローラーであることを意味し、Spring の開始時にロードおよび登録する必要があります。注意してください! 5 つの主要なアノテーションを持つ他のアノテーションはエラーを報告します。
@RequestMapping("/user") は、このクラスが "/user" でアクセスできることを意味します (ルーティングの設定)
@RequestMapping("/sayhi") クラス (前の @RequestMapping のクラス) でこのメソッドにアクセスします (複数レベルのディレクトリとして理解できます) クラスの @RequestMapping は省略できますが、メソッドでは省略できません
@ResponseBody このような注釈がない場合でも、エラーが報告され、return によって返される型は View の形式で認識されます。この注釈は、返されたオブジェクトがビューではないことをコンパイラーに伝えることができます。
@RestController アノテーションは @Controller + @ResponseBody と同等です
つまり、このコードは次のように書くこともできます
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @RestController @RequestMapping("/user") public class UserController { @RequestMapping("sayhi") public Object Sayhi(){ return "hi!SpringMVC"; } }
@RequestMappingアノテーションと@GETMapping
上記の考慮事項に加えて、
@R equestMapping は、一般的な Get、Post、Put... すべてのサポートなど、さまざまなリクエストをサポートします。パラメータ「メソッド」を制御することで特定のリクエストでのみアクセスできるように指定します)
(「/user」パラメータを忘れずに追加してください) このようなパラメータをメソッドの後に追加します (RequestMethod. がデフォルトのリクエスト タイプです) Post. からのみアクセスできるように指定する場合は、次のように記述します
別の書き方は @GETMapping("") (Post を @POSTMapping に指定) で、これは @RequestMapping(value="",mathod="") と同等です。
@GETMapping は値パラメータを書き込むだけで済みます
ただし、@RequestMapping はクラスにアノテーションを付けることができ、メソッド アノテーション @GETMapping はメソッドにのみアノテーションを付けることができることに注意してください
単一のパラメータを渡す (取得)
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController { @PostMapping("/sayhi") @ResponseBody public void get(String name){ System.out.println("传递的参数"+name); } }
postman を使用して Post リクエストを作成する
(os: この Key-Value を入力すると、URL が自動的に展開されます)
演算結果
メソッドやアノテーションがないのに、なぜ直接受け取るだけで、サーブレットはこの API とその依存関係を使用するのかと思うかもしれません (とにかくそう思います)。
ここで、メソッド名をカスタマイズできます(とにかく、アクセスルートも上でコメントされています) 文字列名 変数名がリクエスト内のキーと一致していることを確認してください
複数のパラメータを渡す(取得する)
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.Date; @Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController { @PostMapping("/sayhi") @ResponseBody public void get(String name,int age){ System.out.println("name="+name); System.out.println("age="+age); } }
ビルドリクエスト
単一パラメータの受け渡しと一貫していますが、このメソッドは複数のパラメータを入力します。
パラメータのマッピング (名前の変更)
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.Date; @Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController { @PostMapping("/sayhi") @ResponseBody public void get(@RequestParam("myname")String name,@RequestParam("myage")int age){ System.out.println("name="+name); System.out.println("age="+age); } }
メソッドのパラメータの前に @RequestParam アノテーションを追加し、変更する名前を入力するだけです。
注意すべき点の 1 つは、このアノテーションが追加されていない場合、プログラムは対応するパラメーターを受け取らない場合に null を返し、エラーは報告されないということです。
このパラメータを追加すると必須パラメータとなり、受信しない場合はエラーが報告されます。
@RequestParame("私の名前",requird=false)
必須パラメータを追加しても必須パラメータにはなりません
オブジェクトを渡す(取得する)
まず自分でオブジェクトを構築する
package com.example.demo; import lombok.Data; @Data public class Student { String name; int age; @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
@Data は Getter を与えることと同等であり (オブジェクトの転送には Getter を書き込む必要があります)、エラーは報告されません
@Override は必須ではありません。印刷の便宜のために書き直しました。
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.Date; @Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController { @PostMapping("/sayhi") @ResponseBody public void get(Student student){ System.out.println(student); } }
ビルドリクエスト
クラスの定義は、単一パラメータの変数名と同等であり、渡すことはキーの名前と一致しますが、ここで必要なのは、クラス内の属性がリクエスト内のキーと一致することです。
フォームを渡す(取得する)
package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.Date; @Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController { @PostMapping("/sayhi") @ResponseBody public void get(@RequestBody Student student){ System.out.println(student); } }
パラメータの前に @RequestBody を追加すると、パラメータは受信されません
@RequestBody : 機能: 主にフロントエンドからバックエンドに渡されるjson文字列のデータ(リクエストボディのデータ)を受け取るために使用されます。
URL内のパラメータを取得する
@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController { @PostMapping("/sayhi/{name}/{age}") @ResponseBody public void get(@PathVariable String name, @PathVariable int age){ System.out.println("name="+name); System.out.println("age="+age); } }
ビルドリクエスト
この /{} 内のパラメータは、メソッド内のパラメータ名と一致している必要があります。
この /{} は URL 内のデータとの対応を表します
各パラメータの前に @PathVariable も追加します
このパラメータがパス値を受け取ることを示します
ファイルを取得する
@Controller @RequestMapping(value="/user") public class UserController { @RequestMapping("/file") @ResponseBody public String File(@RequestPart("myfile") MultipartFile file) throws IOException { file.transferTo(new File("img.png")); return "success"; } }
MultipartFile オブジェクトに @RequestPart の注釈を付ける
これら 2 つは一貫している必要があります
Cookie/ヘッダーの取得
クッキー
@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController { @PostMapping("/sayhi") @ResponseBody public void get(@CookieValue("bug") String cookie){ System.out.println(cookie); } }
@CookieValue で注釈を付ける次のパラメータは、Value のプレフィックスに対応する必要があることに注意してください。
ヘッダ
@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController { @PostMapping("/sayhi") @ResponseBody public void get(@RequestHeader("header") String header){ System.out.println(header); } }
違いは、ヘッダーに @RequestHeader アノテーションが付けられていることです。
次に、次のパラメータが KEY に対応します
HTMLの静的ページを返す
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/get") public Object Return(){ return "index.html"; } }
実際、これらの @RequestMapping アノテーションは省略できます。
とにかく、この方法でのみ、/ファイル名に直接アクセスできます。
JSONオブジェクトを返します
@Controller @RequestMapping("/user") @ResponseBody public class UserController { @RequestMapping("/get") public HashMap<String,Integer> getJson(){ HashMap<String,Integer> map = new HashMap<>(); map.put("张三",18); map.put("李四",19); return map; } }
ヒント:@RestController == @Controller+@ResponseBody
リクエストの転送とリクエストのリダイレクト
@Controller @RequestMapping(value="/user") public class UserController { @RequestMapping("/forward") public String index1(){ //请求转发 return "forward:/index.html"; } @RequestMapping("/redirect") public String index3(){ //请求重定向 return "redirect:/index.html"; } }
注: @ResponseBody は View を返すため、ここでは役に立ちません。それ以外の場合は文字列を返します。
転送とリダイレクトの違いは次のとおりです。
前方
リダイレクト
両方ともであることが判明しました
ただし、リダイレクトされた URL は次のようになります。