Paramètres du contrôleur (Paramètre)


Le module WebMVC rend non seulement l'écriture des contrôleurs très simple, mais le traitement des paramètres de requête devient également plus facile ! WebMVC convertira automatiquement le type de données correspondant au paramètre de méthode ou au membre de classe en fonction de la configuration de l'annotation du paramètre de méthode du contrôleur ou du membre de classe. La liaison de paramètre implique les annotations suivantes :

Annotation du paramètre de base
  • @RequestParam. : Lier les paramètres dans la requête ;

  • @RequestHeader : Lier les variables de paramètre dans l'en-tête de la requête ; paramètres :

  • value : nom du paramètre, s'il n'est pas spécifié, le nom de la variable du paramètre de méthode sera utilisé par défaut ;

    prefix : préfixe du nom du paramètre, la valeur par défaut est ""
defaultValue : la valeur par défaut du paramètre spécifié ; , la valeur par défaut est "" ;

Annotations de paramètres spéciaux

@P athVariable : variable de paramètre de chemin de mappage de demande de liaison dans ;

valeur : nom du paramètre, s'il n'est pas spécifié, le nom de la variable du paramètre de méthode est utilisé par défaut :

    @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);
        }
    }

Test d'URL d'accès ; via le navigateur :

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

Résultat de l'exécution :

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

    浏览器输出:
    Hi, webmvc, UserName: ymper, Age: 18

Remarque
 : Les variables de paramètre basées sur le chemin doivent être continues, telles que :
  • Correct : /path/{name}/ {age}

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

    @ModelBind : annotation de liaison du paramètre d'objet de valeur

    prefix : préfixe du nom du paramètre lié, paramètre facultatif, la valeur par défaut est "" ;
    Exemple de code :

    @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);
        }
    }
    Accès au test d'URL via le navigateur :

    http://localhost:8080/demo/path/webmvc/20?user.sex=F

      Résultats d'exécution :
    • Hi, webmvc, Age: 20, Sex: F
    • @ParameterEscape : annotation d'échappement des paramètres de la méthode du contrôleur ;

      Vous pouvez configurer les paramètres via le module WebMVC parameter_escape_order设定是在控制器方法参数执行验证之前还是之后执行参数转义动作,参数取值范围为beforeafter,默认为afterC'est-à-dire échapper après la vérification des paramètres

      scope : plage d'échappement des paramètres de chaîne, la valeur par défaut est Type.EscapeScope.DEFAULT ;

      • La plage de valeurs comprend : JAVA, JS, HTML, XML, SQL, CSV, DEFAULT ;
      • Valeur par défaut DEFAULT, qui termine l'échappement de SQL et HTML

      ignoré : notifie l'annotation parent L'opération d'échappement du ; la méthode ou le paramètre actuel sera ignoré et la valeur par défaut est false ;

      processeur : processeur d'échappement de paramètres de chaîne personnalisé ;

      • Une logique d'échappement personnalisée peut être implémentée via l'interface IParameterEscapeProcessor ; Exemple de code 1 :
      • 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);
            }
        }

      Test d'URL d'accès via le navigateur :

      http://localhost:8080/demo/bind/webmvc?demo.sex=F&demo.ext.age=20

      Résultats de l'exécution : (Sortie de la console)

      Hi, webmvc, Age: 20, Sex: F

      Exemple 1 de description :
      Parce que la classe contrôleur est déclaré avec l'annotation @ParameterEscape, cela signifie que tous les paramètres de requête dans toute la classe du contrôleur doivent être échappés, donc le contenu du paramètre content est échappé avec succès
      Parce que le paramètre desc déclare @ParameterEscape La valeur ignorée dans l'annotation ; est défini sur true, ce qui signifie que les paramètres de niveau supérieur sont ignorés, de sorte que le contenu du paramètre n'est pas échappé.

      • Exemple de code deux :
      • @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();
            }
        }

      Accédez au test d'URL via le navigateur :

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

      Résultat de l'exécution : (Sortie de la console)

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

      Description de l'exemple 2 :
      Bien que la classe du contrôleur soit déclarée avec l'annotation @ParameterEscape, la méthode du contrôleur ignore l'échappement via le paramètre ignoré, ce qui signifie Le contenu du paramètre de méthode déclaré n'est pas échappé, donc le contenu du paramètre content n'est pas échappé
      Puisque le paramètre desc déclare l'annotation @ParameterEscape, indiquant que le paramètre doit être échappé, le contenu du paramètre est échappé avec succès ;

      Remarque
         : Lorsque la classe et la méthode du contrôleur déclarent l'annotation @ParameterEscape, l'annotation déclarée sur la classe sera considérée comme invalide

      Utilisation spéciale d'un contrôleur non singleton

      Contrôle Singleton La différence entre contrôleurs et contrôleurs non singleton :
    La classe de contrôleur singleton a été instanciée lorsque le module WebMVC est initialisé ;
    La classe de contrôleur non singleton créera un objet instance à chaque fois qu'une requête est reçue, l'objet instance est libéré. une fois la demande terminée ;

    Sur la base de la description ci-dessus, les contrôleurs non singleton peuvent recevoir les paramètres de la demande via les membres de la classe. L'exemple de code est le suivant :

    • @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();
          }
      }
    • Accès au test d'URL via le navigateur :

    http://localhost:8080/demo/escape2?content=<p>content$<br><script>alert("hello");</script></p>&desc=<script>alert("hello");</script>
    Le résultat de l'exécution de cet exemple de code :

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

    Remarque : En mode singleton, le module WebMVC ignorera l'attribution de valeurs aux membres de la classe de contrôleur. Il est également recommandé de ne pas utiliser de variables membres comme paramètres en mode singleton. Des conséquences inattendues peuvent survenir dans un environnement multithread simultané. . question! !