コントローラパラメータ(パラメータ)
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
注
: パスベースのパラメータ変数は、次のように連続している必要があります:Error :/path/{name}/age/{sex}正解: /path/{name}/ {age}@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
设定是在控制器方法参数执行验证之前还是之后执行参数转义动作,参数取值范围为before
或after
,默认为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>
コントローラークラスなので@ParameterEscape アノテーションで宣言されている場合は、コントローラー クラス全体のすべてのリクエスト パラメーターをエスケープする必要があることを意味するため、パラメーターの内容は正常にエスケープされます。
パラメーターの説明で @ParameterEscape アノテーション内のスキップされた値が宣言されているため、 true に設定されている場合、上位レベルの設定がスキップされるため、パラメーターの内容はエスケープされません。
サンプル コード 2:
Content: <p>content$<br><script>alert("hello");</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 モジュールが初期化されるときにインスタンス化されます。
上記の説明に基づいて、非シングルトン コントローラーはクラス メンバーを通じてリクエスト パラメーターを受け取ることができます。サンプル コードは次のとおりです:
Content: <p>content$<br><script>alert("hello");</script></p> Desc: <script>alert("hello");</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 モジュールはコントローラー クラス メンバーへの値の割り当てを無視します。また、同時マルチスレッド環境ではメンバー変数をパラメーターとして使用しないことをお勧めします。 。 質問! !