当时用@RequestMapping注解class和method时,与url对应的方法可以是任意类型的方法,如:方法名任意(不考虑一些关键字的情况)、参数任意、可以没有返回值等等。通过浏览器传递的参数可以将key与方法的形参名完全对应,得到浏览器传递到服务器的值;如果不对应也是可以得到的,此时就需要使用@RequestParam注解;但在使用@RequestParam注解时需要注意一个问题:@RequestParam注解的required属性设置,该属性值默认为true,但有时需要配置为false来避免400错误。
@Controller @RequestMapping("/demo/") public class HelloController { @RequestMapping("hello.do") public String execute(String username, String password) { System.out.println("hello spring"); System.out.println(username); System.out.println(password); return "hello"; } }
浏览器的请求调用这个方法时,可以传username、password的参数也可以只传其中的一个参数(key与形参名要一致),甚至可以不传参数。以上情形都可以正常调用这个方法。
但是,当使用@RequestParam来解决key与形参名不一致的问题时,如果没有指定required属性值,且在浏览器访问时也没有传递被@RequestParam注解的形参时,就会发生400错误。
@Controller @RequestMapping("/demo/") public class HelloController { @RequestMapping("hello.do") public String execute(String username, @RequestParam(value="pwd")String password) { System.out.println("hello spring"); System.out.println(username); System.out.println(password); return "hello"; } }
此时,如果不传key为pwd的参数,就会报400:HTTP Status 400 - Required String parameter 'pwd' is not present.即使传递的是key为password的参数时,也不能正常调用这个方法;如果在使用@RequestParam注解时,依然希望像未使用此注解时,可以在任何情况下都能正常调用该方法(不传参或只传其中任一参数时),就需要添加required=false。
@Controller @RequestMapping("/demo/") public class HelloController { @RequestMapping("hello.do") public String execute(String username, @RequestParam(value="pwd", required=false)String password) { System.out.println("hello spring"); System.out.println(username); System.out.println(password); return "hello"; } }
此时,就可以像不使用@RequestParam注解时一样调用这个方法,如果传递的key为password,也可以正常调用这个方法,但方法的形参password依然为null,只有key为pwd时,才可以将值正确的传递给password形参。