Spring 梳理-接收请求的输入(原)
- Spring MVC 允许一下方式将客户端的数据传送到控制器的处理方法中
- 查询参数(Query Parameter)
- 表单参数(Form Parameter)
- 路径变量(Path Variable)
- 处理查询参数
- 不包含默认值
-
@Controller @RequestMapping(value="/FirstControl") public class HelloControl { @RequestMapping("requestParam") public String viewRequestParam(@RequestParam("id") String id,@RequestParam("name") String name,Model model){ DeptUserDomain dud=new DeptUserDomain(); dud.setId(id); dud.setName(name); model.addAttribute("dud",dud); return "requestParam"; } }
<body> viewPersonInfo<br> ${dud.id}<br> ${dud.name}<br> ${dud.salary} </body>
浏览器请求URL http://localhost:8085/testSpringMVC/FirstControl/requestParam?id=11&name=zs
-
- 包含默认值
-
@Controller @RequestMapping(value = "/FirstControl") public class HelloControl { @RequestMapping("requestParam2") public String viewRequestParam2(@RequestParam(value="id",defaultValue="id2") String id ,@RequestParam(value="name",defaultValue="ls")String name,Model model){ DeptUserDomain dud = new DeptUserDomain(); dud.setId(id); dud.setName(name); model.addAttribute("dud", dud); return "requestParam"; } }
<body> viewPersonInfo<br> ${dud.id}<br> ${dud.name}<br> ${dud.salary} </body>
浏览器请求 URL http://localhost:8085/testSpringMVC/FirstControl/requestParam2
-
- 不包含默认值
- 处理路径变量
- 从面向资源的角度,通过URL路径标识 优于 查询参数 的方式;例如 /domain/123 优于 /domain?id=123 ,后则描述的是一个带有参数的一个操作,本质上是通过HTTP发起的RPC
-
PathVariable参数出现了3次 @Controller @RequestMapping(value = "/FirstControl") public class HelloControl { @RequestMapping(value="/{id}") public String viewPathParam(@PathVariable("id")String id,Model model){ DeptUserDomain dud = new DeptUserDomain(); dud.setId(id); model.addAttribute("dud", dud); return "pathVariable"; } }
<body> viewPersonInfo<br> ${dud.id}<br> ${dud.name}<br> ${dud.salary} </body>浏览器请求路径 http://localhost:8085/testSpringMVC/FirstControl/113
- 处理表单参数
- 一个表单,需要三个RequestMapping:原始输入表单(GET)、提交处理(POST)、结果重定向(Redirect)
- 在处理POST类型的请求时,请求处理完后,最好进行一下重定向,这样浏览器的刷新就不会重新提交表单了
- post提交对应的控制器方法,可接收POJO类型参数,POJO参数的属性将会使用请求Form中同名的参数进行填充
- InternalResourceViewResolver 可以识别前缀格式: redirect:xxx forward:xxx
- 校验表单:使用Java校验API(JSR,java Validation API)。包含在 javax.validation.constraints 包中
- 表单校验需要两步:
- 第一步:在POJO类上加上校验注解
- 第二步:在控制器方法参数上,添加@Valid,启用校验
- 在POJO上添加校验注解,并不能阻止表单提交,,校验失败信息存储在控制方法Errors参数上
- @Valid是定义在JSR-303标准中的,我这里使用的是Hibernate Validation对它的实现。这里我们必须使用@Valid标注我们需要校验的参数user,否则Spring不会对它进行校验。另外我们的处理器方法必须给定包含Errors的参数,这可以是Errors本身,也可以是它的子类BindingResult,使用了Errors参数就是告诉Spring关于表单对象数据校验的错误将由我们自己来处理,否则Spring会直接抛出异常,而且这个参数是必须紧挨着@Valid参数的,即必须紧挨着需要校验的参数,这就意味着我们有多少个@Valid参数就需要有多少个对应的Errors参数,它们是一一对应的。
- 校验注解
-
限制
说明
@Null
限制只能为null
@NotNull
限制必须不为null
@AssertFalse
限制必须为false
@AssertTrue
限制必须为true
@DecimalMax(value)
限制必须为一个不大于指定值的数字
@DecimalMin(value)
限制必须为一个不小于指定值的数字
@Digits(integer,fraction)
限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future
限制必须是一个将来的日期
@Max(value)
限制必须为一个不大于指定值的数字
@Min(value)
限制必须为一个不小于指定值的数字
@Past
限制必须是一个过去的日期
@Pattern(value)
限制必须符合指定的正则表达式
@Size(max,min)
限制字符长度必须在min到max之间
-
- 表单校验需要两步:
-
@Controller @RequestMapping(value = "/FirstControl") public class HelloControl { @RequestMapping(value="/registerDeptUser",method=RequestMethod.GET) public String register(){ return "registerDeptUser"; } @RequestMapping(value="/registerDeptUser",method=RequestMethod.POST) public String register(DeptUserDomain dud){ System.out.println("id:"+dud.getId()); System.out.println("name:"+dud.getName()); return "redirect:default"; } @RequestMapping("/default") public String mydefault() { System.out.println("my first controller!!!"); return "default"; } }
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <form method="post"> id:<input type="text" name="id" /><br /> name:<input type="text" name="name" /><br /> <input type="submit" value="submit" /> </form> </body> </html>
信息: Server startup in 5055 ms id:id1id1 name:name1 my first controller!!!