コントローラパラメータ(パラメータ)


WebMVC モジュールを使用すると、コントローラーの作成が非常に簡単になるだけでなく、リクエスト パラメーターの処理も簡単になります。 WebMVC は、コントローラーのメソッド パラメーターまたはクラス メンバーのアノテーション設定に基づいて、メソッド パラメーターまたはクラス メンバーに対応するデータ型を自動的に変換します。 : リクエスト内のパラメータをバインドします。

@RequestHeader: リクエストヘッダ内のパラメータ変数をバインドします。
  • 上記の 3 つのアノテーションは同じです。パラメータ:

  • value: パラメータ名、指定されていない場合、デフォルトでメソッドパラメータ変数名が使用されます。
  • prefix: パラメータ名の接頭辞、デフォルトは「」です。

  • defaultValue: 指定されたパラメータのデフォルト値。 、デフォルトは "" です。
  • サンプルコード:

    @Controller
    @RequestMapping("/demo")
    public class DemoController {

        @RequestMapping("/param")
        public IView testParam(@RequestParam String name,
                          @RequestParam(defaultValue = "18") Integer age,
                          @RequestParam(value = "name", prefix = "user") String username,
                          @RequestHeader(defaultValue = "BASIC") String authType,
                          @CookieVariable(defaultValue = "false") Boolean isLogin) {

            System.out.println("AuthType: " + authType);
            System.out.println("IsLogin: " + isLogin);
            return View.textView("Hi, " + name + ", UserName: " + username + ", Age: " + age);
        }
    }

ブラウザからのアクセス URL テスト:

    http://localhost:8080/demo/param?name=webmvc&user.name=ymper

実行結果:

    控制台输出:
    AuthType: BASIC
    IsLogin: false

    浏览器输出:
    Hi, webmvc, UserName: ymper, Age: 18
特別なパラメータの注釈

@P athVariable: バインディング リクエスト マッピングのパス パラメーター変数;

value: パラメーター名 (指定されていない場合、デフォルトでメソッド パラメーター変数名が使用されます)ブラウザ経由:

@Controller
@RequestMapping("/demo")
public class DemoController {

    @RequestMapping("/path/{name}/{age}")
    public IView testPath(@PathVariable String name,
                      @PathVariable(value = "age") Integer age,
                      @RequestParam(prefix = "user") String sex) {

        return View.textView("Hi, " + name + ", Age: " + age + ", Sex: " + sex);
    }
}
実行結果:
  • http://localhost:8080/demo/path/webmvc/20?user.sex=F

    : パスベースのパラメータ変数は、次のように連続している必要があります:

    正解: /path/{name}/ {age}

    Error :/path/{name}/age/{sex}

    @ModelBind: 値オブジェクトパラメータバインディングアノテーション
    プレフィックス: バインドされたパラメータ名のプレフィックス、オプションのパラメータ、デフォルトは "" ;

    サンプルコード:

      Hi, webmvc, Age: 20, Sex: F
    • ブラウザからのアクセス URL テスト:
    • public class DemoVO {
      
          @PathVariable
          private String name;
      
          @RequestParam
          private String sex;
      
          @RequestParam(prefix = "ext")
          private Integer age;
      
          // 省略Get和Set方法
      }
      
      @Controller
      @RequestMapping("/demo")
      public class DemoController {
      
          @RequestMapping("/bind/{demo.name}")
          public IView testBind(@ModelBind(prefix = "demo") DemoVO vo) {
              String _str = "Hi, " + vo.getName() + ", Age: " + vo.getAge() + ", Sex: " + vo.getSex();
              return View.textView(_str);
          }
      }

    実行結果:
  • http://localhost:8080/demo/bind/webmvc?demo.sex=F&demo.ext.age=20

  • @ParameterEscape: コントローラー メソッド パラメーターのエスケープ アノテーション。

    WebMVC モジュールを通じてパラメーターを設定できます。parameter_escape_order设定是在控制器方法参数执行验证之前还是之后执行参数转义动作,参数取值范围为beforeafter,默认为after

    scope: 文字列パラメーターのエスケープ範囲、デフォルトは Type.EscapeScope.DEFAULT です。

      値の範囲には、JAVA、JS、HTML、XML、SQL、CSV、DEFAULTが含まれます。
    • デフォルト値DEFAULTは、SQLおよびHTMLのエスケープを完了します。
    スキップ: 親アノテーションのエスケープ操作を通知します。現在のメソッドまたはパラメーターは無視され、デフォルトは false です。サンプルコード 1:

    Hi, webmvc, Age: 20, Sex: F

    • ブラウザから URL にアクセスするテスト:
    • @Controller
      @RequestMapping("/demo")
      @ParameterEscape
      public class DemoController {
      
          @RequestMapping("/escape")
          public IView testEscape(@RequestParam String content,
                                  @ParameterEscape(skiped = true) @RequestParam String desc) {
      
              System.out.println("Content: " + content);
              System.out.println("Desc: " + desc);
              return View.nullView();
          }
      }
      
      // 或者:(两段代码执行结果相同)
      
      @Controller
      @RequestMapping("/demo")
      public class DemoController {
      
          @RequestMapping("/escape")
          @ParameterEscape
          public IView testEscape(@RequestParam String content,
                                  @ParameterEscape(skiped = true) @RequestParam String desc) {
      
              System.out.println("Content: " + content);
              System.out.println("Desc: " + desc);
              return View.nullView();
          }
      }

    実行結果: (コンソール出力)

    http://localhost:8080/demo/escape?content=<p>content$<br><script>alert("hello");</script></p>&desc=<script>alert("hello");</script>

    例 1 の説明:
    コントローラークラスなので@ParameterEscape アノテーションで宣言されている場合は、コントローラー クラス全体のすべてのリクエスト パラメーターをエスケープする必要があることを意味するため、パラメーターの内容は正常にエスケープされます。

    パラメーターの説明で @ParameterEscape アノテーション内のスキップされた値が宣言されているため、 true に設定されている場合、上位レベルの設定がスキップされるため、パラメーターの内容はエスケープされません。

    サンプル コード 2:

    Content: <p>content$<br><script>alert(&quot;hello&quot;);</script></p>
    Desc: <script>alert("hello");</script>

    • ブラウザーを介して URL テストにアクセスします。
      @Controller
      @RequestMapping("/demo")
      @ParameterEscape
      public class DemoController {
      
          @RequestMapping("/escape2")
          @ParameterEscape(skiped = true)
          public IView testEscape2(@RequestParam String content,
                                  @ParameterEscape @RequestParam String desc) {
      
              System.out.println("Content: " + content);
              System.out.println("Desc: " + desc);
              return View.nullView();
          }
      }
    • 実行結果: (コンソール出力)

    http://localhost:8080/demo/escape2?content=<p>content$<br><script>alert("hello");</script></p>&desc=<script>alert("hello");</script>

    例 2 の説明:

    コントローラー クラスは @ParameterEscape アノテーションで宣言されていますが、コントローラー メソッドはスキップされた設定を通じてエスケープをスキップします。つまり、宣言されたメソッドのパラメーターの内容はエスケープされないため、パラメーターの内容はエスケープされません
    パラメーターの説明では、パラメーターをエスケープする必要があることを示す @ParameterEscape アノテーションが宣言されているため、パラメーターの内容は正常にエスケープされます。

    : コントローラー クラスとメソッドの両方で @ParameterEscape アノテーションを宣言すると、クラスで宣言されたアノテーションは無効とみなされます

    非シングルトン コントローラーの特別な使用法

      シングルトン コントロールの違いコントローラーと非シングルトン コントローラー:
    • シングルトン コントローラー クラスは、WebMVC モジュールが初期化されるときにインスタンス化されます。
    非シングルトン コントローラー クラスは、リクエストが受信されるたびにインスタンス オブジェクトを作成し、インスタンス オブジェクトが解放されます。リクエストが完了した後、

    上記の説明に基づいて、非シングルトン コントローラーはクラス メンバーを通じてリクエスト パラメーターを受け取ることができます。サンプル コードは次のとおりです:

ブラウザーを介して URL テストにアクセスします。
Content: <p>content$<br><script>alert("hello");</script></p>
Desc: <script>alert(&quot;hello&quot;);</script>
このサンプルコードの実行結果:

@Controller(singleton = false)
@RequestMapping("/demo")
public class DemoController {

    @RequestParam
    private String content;

    @RequestMapping("/sayHi")
    public IView sayHi(@RequestParam String name) {
        return View.textView("Hi, " + name + ", Content: " + content);
    }
}
  • : シングルトン モードでは、WebMVC モジュールはコントローラー クラス メンバーへの値の割り当てを無視します。また、同時マルチスレッド環境ではメンバー変数をパラメーターとして使用しないことをお勧めします。 。 質問! !