Parameter pengawal (Parameter)


Modul WebMVC bukan sahaja menjadikan pengawal penulisan sangat mudah, tetapi juga memproses parameter permintaan menjadi lebih mudah! WebMVC secara automatik akan menukar jenis data yang sepadan dengan parameter kaedah atau ahli kelas berdasarkan konfigurasi anotasi parameter kaedah pengawal atau ahli kelas yang melibatkan anotasi berikut:

Anotasi parameter asas
  • @RequestParam. : Ikat parameter dalam permintaan; parameter :

  • nilai: nama parameter, jika tidak dinyatakan, nama pembolehubah kaedah akan digunakan secara lalai

    awalan: awalan nama parameter, lalai ialah ""
  • Nilai lalai: nilai lalai bagi parameter yang ditentukan , lalai ialah "";

  • Contoh kod:

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

Akses ujian URL melalui penyemak imbas:

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

Hasil pelaksanaan:

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

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

Anotasi parameter khas

@P athVariable: pemetaan permintaan mengikat Pembolehubah parameter laluan dalam;

nilai: nama parameter, jika tidak dinyatakan, nama pembolehubah parameter kaedah digunakan secara lalai; Melalui penyemak imbas:

@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);
    }
}
execution Result:
  • http://localhost:8080/demo/path/webmvc/20?user.sex=F
    e

    note
    : Pembolehubah parameter berasaskan laluan mestilah berterusan, seperti:

    Correct:/path/{name}/ {age}

    Ralat :/path/{name}/age/{jantina}

    @ModelBind: anotasi pengikat parameter objek nilai
    parameter awalan parameter, parameter awalan x; lalai ialah "" ;

    Kod contoh:

      Hi, webmvc, Age: 20, Sex: F
    • Akses ujian URL melalui penyemak imbas:
    • 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);
          }
      }

    Hasil pelaksanaan:
  • .
  • Julat nilai termasuk: JAVA, JS, HTML, XML, SQL, CSV, DEFAULT

    Nilai lalai DEFAULT, yang melengkapkan pelepasan SQL dan HTML parameter_escape_order设定是在控制器方法参数执行验证之前还是之后执行参数转义动作,参数取值范围为beforeafter,默认为after

    dilangkau: Maklumkan operasi induk bagi escaping; kaedah atau parameter semasa akan diabaikan, dan lalainya adalah palsu; Contoh kod satu:

      http://localhost:8080/demo/bind/webmvc?demo.sex=F&demo.ext.age=20
    • Akses ujian URL melalui penyemak imbas:

    Hi, webmvc, Age: 20, Sex: F

    Hasil pelaksanaan: (Output konsol1)
    • @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();
          }
      }

    Sebab kelas pengawal diisytiharkan dengan anotasi @ParameterEscape, ini bermakna semua parameter permintaan dalam keseluruhan kelas pengawal perlu dilepaskan, jadi kandungan kandungan parameter berjaya dilepaskan
    Oleh kerana parameter desc mengisytiharkan @ParameterEscape Nilai yang dilangkau dalam anotasi; ditetapkan kepada benar, yang bermaksud bahawa tetapan peringkat atas dilangkau, jadi kandungan parameter tidak terlepas;
    http://localhost:8080/demo/escape?content=<p>content$<br><script>alert("hello");</script></p>&desc=<script>alert("hello");</script>

    Hasil pelaksanaan: (Output konsol)

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

    Contoh 2 penerangan:

    • Walaupun kelas pengawal diisytiharkan dengan tetapan @ParameterEscape yang melangkaui kaedah melangkau dengan kaedah @ParameterEscape. Kandungan parameter kaedah yang diisytiharkan tidak terlepas, jadi kandungan kandungan parameter tidak terlepas
    • Oleh kerana parameter desc mengisytiharkan anotasi @ParameterEscape, menunjukkan bahawa parameter perlu dilepaskan, kandungan parameter berjaya dilepaskan;
    Nota
    : Apabila kedua-dua kelas pengawal dan kaedah mengisytiharkan anotasi @ParameterEscape, anotasi yang diisytiharkan pada kelas akan dianggap tidak sah; pengawal dan pengawal bukan tunggal:

    Kelas pengawal tunggal telah dimulakan apabila modul WebMVC dimulakan
    Kelas pengawal bukan tunggal akan mencipta objek tika setiap kali permintaan diterima , objek tika dikeluarkan selepas permintaan selesai;

    Berdasarkan penerangan di atas, pengawal bukan tunggal boleh menerima parameter permintaan melalui ahli kelas Kod sampel adalah seperti berikut:
    @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();
        }
    }

    Akses ujian URL melalui pelayar:
    .
    http://localhost:8080/demo/escape2?content=<p>content$<br><script>alert("hello");</script></p>&desc=<script>alert("hello");</script>
    Hasil pelaksanaan kod sampel ini:

      Content: <p>content$<br><script>alert("hello");</script></p>
      Desc: <script>alert(&quot;hello&quot;);</script>
    • Nota: Dalam mod tunggal, modul WebMVC akan mengabaikan pemberian nilai kepada ahli kelas pengawal Ia juga disyorkan untuk tidak menggunakan pembolehubah ahli sebagai parameter dalam mod tunggal akibat yang tidak dijangka mungkin berlaku dalam persekitaran berbilang benang soalan! !