二.Spring MVC数据绑定
1.URL Mapping(URL映射)
URL Mapping 指将URL与Controller方法绑定,通过将URL与方法绑定,Spring MVC便可以通过Tomcat对外暴露服务。
我们可以这么理解,作为web应用来说,所有对外暴露的接口都是一个个URL网址,我们通过URL来执行后端的程序代码。
URL Mapping注解
@RequestMapping 通过绑定 @GetMapping 绑定Get请求 @PostMapping 绑定Post请求
下面来对这三种注解进行演示:
创建一个新的控制器类,先编写如下代码测试:
package com.haiexijun.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class URLMappingController { @GetMapping("/g") @ResponseBody public String getMapping(){ return "this is get method"; } @PostMapping("/p") @ResponseBody public String postMapping(){ return "this is post method"; } }
运行项目后打开浏览器,分别输入对应的url地址,get请求成功被响应,post请求因为不能通过浏览器来访问,所以报405错误。
我们可以通过编写一个表单来验证post请求。这里不演示了。
**@RequestMapping可写在类名前。这个注解在大多数情况下是用于进行URL的全局设置的,我们都知道作为URL,它可能是有多级结构的。**比如,希望当前这个Controller里面所有的映射地址都是以 /um开始的。如果不用@RequestMapping,那GetMapping和PostMapping都要改为“/um/g”和“/um/p” .
package com.haiexijun.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/um") public class URLMappingController { @GetMapping("/g") @ResponseBody public String getMapping(){ return "this is get method"; } @PostMapping("/p") @ResponseBody public String postMapping(){ return "this is post method"; } }
@RequestMapping也可以写在方法名前,表示该方法不在区分post请求和get请求了。也就是说所有类型的请求都可以访问得到这个方法所映射的URL了。但并不推荐这么来用 @RequestMapping也可以配置,使其分post请求和get请求。配置value和method就好了。
@RequestMapping(value = "/g",method = RequestMethod.GET) @ResponseBody public String getMapping(){ return "this is get method"; }
2.Controller方法参数接收请求参数
在大多数情况下,一个请求发过来的时候是要包含一些数据,这些数据通常是由请求参数的方式来体现的。比如说用户登陆的时候,要输入用户名和密码,那么这些数据就以post请求参数的形式发送到Controller的方法中。
接收请求参数的常用做法: 可以通过Controller方法接收参数,或使用java Bean接收数据。
下面是通过Controller方法参数接收请求参数,方法会自动进行类型转换。
对于get请求,有一个小小的注意点。就是如果get请求输入的请求参数为manager_name(localhost:8888/g?manager_name=lily)的话,controller方法里面的参数该怎么写呢?java可不支持manager_name的命名规则。这时候就要用到一个新的注解:@RequestParam
这个注解写在参数前,专用于这种特殊的参数进行描述的,@RequestParam还要传入原始的请求参数。
@RequestMapping(value = "/g",method = RequestMethod.GET) @ResponseBody public String getMapping(@RequestParam("manager_name") String managerName){ return "this is get method"; }
这里其实如果注解里面添加了原始的参数名称,后面的请求参数则可以为任意,比如abc都可以。
## 3.Controller实体对象接收请求参数(使用javaBean接收请求参数) 假设一个表单的输入项非常的多没有一百多个的话,问题就产生了,难道我要将这一百多个输入项的参数一个个在controller方法里面写出来吗?可想而至,方法声明该会有多长啊?维护起来是十分困难的。为了解决这个问题,Spring MVC允许我们一次性将我们前台输入的数据保存为指定的javaBean。一步到位,完成了由数据到对象的转换工作。
下面来演示具体使用步骤:
创建一个entity包,在包下面创建一个User实体类。这个实体类就是一个标准的javaBean。
package com.haiexijun.springmvc.entity; public class User { private String username; private Long password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Long getPassword() { return password; } public void setPassword(Long password) { this.password = password; } }
编写一个表单:
<form action="/um/p1" method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit" value="提交"> </form>
然后在Controller里面编写一个方法:
在程序运行的时候Spring MVC就会自动创建User 这个对象,并且根据前面的请求参数,便会在实体内寻找同名属性,对User实体内的属性依依赋值。要保证前台传入的参数名与属性名保持一致,并且对于数值类型,也得要求前台传入的这个数据能够成功地转换到实体属性对应的类型。
@PostMapping("/p1") @ResponseBody public String postMapping1(User user){ return user.getUsername()+":"+user.getPassword(); }
启动运行:
3.接收表单复合数据
下面通过一个案例来演示复合数据获取。比如复选框传过来的数据。
知识点:首先我们会利用数组或者List接收请求中的复合数据。利用@RequestParam为参数设置默认值。使用Map对象接收请求参数及注意事项。
下面通过代码学习:
下面是前端html表单的代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>学员调查问卷</title> <style> .container { position: absolute; border: 1px solid #cccccc; left: 50%; top: 50%; width: 400px; height: 300px; margin-left: -200px; margin-top: -150px; box-sizing: border-box; padding: 10px; } h2{ margin: 10px 0px; text-align: center; } h3{ margin: 10px 0px; } </style> </head> <body> <div class="container"> <h2>学员调查问卷</h2> <form action="./apply" method="post"> <h3>您的姓名</h3> <input name="name" class="text" style="width: 150px"> <h3>您正在学习的技术方向</h3> <select name="course" style="width: 150px"> <option value="java">Java</option> <option value="h5">HTML5</option> <option value="python">Python</option> <option value="php">PHP</option> </select> <div> <h3>您的学习目的:</h3> <input type="checkbox" name="purpose" value="1">就业找工作 <input type="checkbox" name="purpose" value="2">工作要求 <input type="checkbox" name="purpose" value="3">兴趣爱好 <input type="checkbox" name="purpose" value="4">其他 </div> <div style="text-align: center;padding-top:10px" > <input type="submit" value="提交" style="width:100px"> </div> </form> </div> </body> </html>
在Controller包下创建FormController类,下面编写代码,进行表单处理:
package com.haiexijun.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class FormController { //通过数组来接收表单复合数据 @PostMapping("/apply") @ResponseBody public String apply(String name,String course,Integer[] purpose){ return name+" "+course+" "+purpose.length; } }
启动运行:
这里再扩展一个小的知识点,如果作为我们上面的表单,假如name我们没有填写任何东西。那么接收时,controller里面的参数会为一个空的值,那对于空的值进行后续操作时,程序就很可能产生错误。为了解决这个情况,我们也可以对可能不存在的参数设置默认值。这里也用到@RequestParam注解来设置默认值。如下:
@PostMapping("/apply") @ResponseBody public String apply(@RequestParam(value = "name",defaultValue = "haiexijun") String name, String course, Integer[] purpose){ return name+" "+course+" "+purpose.length; }
上面,name的默认值就被设置为haiexijun了,当表单的name项为填入参数时,就会默认值为haiexijun。