SpringMVC を説明する最も詳細なブログ

Spring MVC とは
MVC はソフトウェア アーキテクチャ パターンであり、ソフトウェア システムを 3 つの基本部分 (モデル、ビュー、コントローラー) に分割します。
ここに画像の説明を挿入

Spring MVC は、MVC のアイデアを具体的に実装したものです。

Spring MVC を学習するには、次の 3 つの関数を習得する必要があります。

  1. 接続の機能: ユーザー (ブラウザ) を Java プログラムに接続します。つまり、アドレスにアクセスすると Spring プログラムを呼び出すことができます。

    @RequestMapping("/hi")
    

    @RequestMapping の機能は、URL ルートを登録することであり、このルートを通じて、フロントエンド リクエストはバックエンド プログラムと対話できます。@RequestMapping アノテーションはメソッドとクラスの両方を変更できますが、アクセス レベルは異なります。
    @RequestMapping がパラメーターを指定しない (ルーティング アドレスのみを設定する) 場合、このメソッドは Get リクエストと Post リクエストの両方のタイプをサポートします。
    メソッド属性が @RequestMapping に設定されている場合、設定されたリクエスト タイプのみをサポートでき、他のタイプではエラー (405) が報告されます。

    概要: @RequestMapping、@GetMapping、@PostMapping

  2. パラメータを取得する機能: ユーザーはアクセス時にいくつかのパラメータを持ってきて、プログラム内でパラメータを取得する方法を見つけます。
    2.1 単一パラメータを取得する

    @GetMapping("/reg")
    // 注意,前端传的参数 命名必须也是 name.
    public String reg(String name){
          
          
        return "注册:"+name;
    }
    
    @GetMapping("/reg")
    // 注意,前端传的参数 命名必须也是 name.
    public String reg(String name){
          
          
        return "注册:"+name;
    }
    

    @RequestParam は、リクエスト パラメーターの名前を変更できるだけでなく、このパラメーターが必須パラメーターであることを確認することもできます。
    フロントエンドは時刻を送信し、バックエンドはcreatetimeを送信します。必要

    @GetMapping("/time")
    public String setTime(@RequestParam(value="time",required = false) String createtime){
          
          
        return "时间:"+createtime;
    }
    

    ここに画像の説明を挿入
    2.2 オブジェクトの取得
    渡す必要があるパラメータが多すぎる場合は、オブジェクトを直接渡すことを検討できます。まず、モデルの下に User エンティティ クラスを作成します。

    @Setter
    @Getter
    @ToString
    public class User {
          
          
       private String name;
       private int age;
       private String password;
       private int sex;
    }
    
    @GetMapping("/reg2")
    public Object reg2(User user){
          
          
        return user;
    }
    

    2.3 json オブジェクトを渡す
    Postman を使用して json オブジェクトを渡しました
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    が、バックエンドが JSON オブジェクトを取得していないことがわかりました。

    解決策: JSON オブジェクトを取得するには、@RequestBody アノテーションを追加する必要があります。

    @GetMapping("/reg2")
    public Object reg2(@RequestBody User user){
          
          
        return user;
    }
    

    2.4 URL 内のパラメータ @PathVariable を取得する

    @PostMapping("/p/{name}/{password}")
    public Object param(@PathVariable String name,@PathVariable String password){
          
          
        return name+" "+password;
    }
    

    ここに画像の説明を挿入
    2.5 ファイルのアップロード

    @RequestMapping("/file")
    public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {
          
          
        // 保存文件
        file.transferTo(new File("D:\\test.jpg"));
        return "上传成功";
    }
    
    @RequestMapping("/file2")
    public String upload2(@RequestPart("myfile") MultipartFile file) throws IOException {
          
          
        // 1.上传文件目录(从配置文件中读取)
        String basePath = uploadPath;
    
        // 2.生成动态的文件名
        String fileName = UUID.randomUUID()+
                (file.getOriginalFilename().substring(
                        file.getOriginalFilename().lastIndexOf(".")
                ));
    
        file.transferTo(new File(basePath+fileName));
        return "上传成功";
    }
    

    ここに画像の説明を挿入
    2.6 Cookie を取得する本来の方法

    /**
     * Spring MVC(基于Servlet)所有映射方法中都会内置两个参数:HttpServletRequest HttpServletResponse
     * */
    @RequestMapping("/getCk")
    public Cookie[] getCk(HttpServletRequest request, HttpServletResponse response){
          
          
        Cookie[] cookies = request.getCookies();
        return cookies;
    }
    

    Cookie を構築し、Cookie とセッション アノテーションを取得する
    ここに画像の説明を挿入
    簡単な方法
    : @CookieValue

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

    ここに画像の説明を挿入
    ヘッダーの取得: @RequestHeader

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

    ここに画像の説明を挿入
    セッションへのアクセスと取得

    // 相当于登录存储Session的操作
    @RequestMapping("/getSession")
    public String setSession(HttpServletRequest request){
          
          
        HttpSession session = request.getSession(true);
        if(session!=null){
          
          
            session.setAttribute("username","ls");
        }
        return "用户登录成功";
    }
    

    ここに画像の説明を挿入

    /**
         * 验证用户是否登录
         * */
        @RequestMapping("/getSession2")
        public String getSession(HttpServletRequest request){
          
          
            String username = "无";
            HttpSession session = request.getSession(false);
            if(session!=null && session.getAttribute("username")!=null){
          
          
                username = (String) session.getAttribute("username");
            }
            return username;
        }
    

    セッションを読み取る簡単な方法:

    @RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute(value = "username",required = false) String username){
          
          
        return username;
    }
    
  3. データを出力する機能: ビジネスロジックを実行した後、プログラムの実行結果をユーザーに返す必要があります。

    デフォルトでは、HTML ページが返されますが、@ResponseBody アノテーションを追加すると、ページ以外のデータを返すことができます。@ResponseBody を使用してクラスを変更すると、このクラスのすべてのメソッドが非ページ データを返すことになります。

    @ResponseBody を追加しないとエラーが報告されます

    @RequestMapping("/gethtml")
    public String getHtml(String name){
          
          
        return "<h1>你好:"+name+"</h1>";
    }
    

リクエストの転送とリクエストのリダイレクトについて

@RequestMapping("/index")
    public String index(){
    
    
        return "redirect:/index.html";
    }

    @RequestMapping("/index2")
    public String index2(){
    
    
        return "forward:/index.html";
    }
  • リクエストの転送 (forward): サーバーはクライアントのリクエストを転送し、それに応じて結果をクライアントに送信します。URL アドレスは変更されません。リクエスト転送を使用すると、外部リソースが失われ、アクセスできなくなる可能性があります。
  • リクエストのリダイレクト(リダイレクト):サーバーがアクセス先のアドレスにリクエストを再定義し、URLアドレスが変更されます。したがって、リクエストのリダイレクトとターゲット アドレスへの直接アクセスの効果はまったく同じであり、外部リソースが失われることはありません。

結合されたアノテーション
@RestController = @Controller + @ResponseBody

おすすめ

転載: blog.csdn.net/qq_39537400/article/details/124108885