Java——Spring MVC数据绑定
1.URL Mapping(URL映射)
URL Mapping指将URL与Controller方法绑定。
通过将URL与方法绑定,SpringMVC便可通过Tomcat对外暴露服务。
1)@GetMapping 绑定Get请求
@GetMapping("/g")@ResponseBody
public String getMapping(){
return "This is get method";
}
2)@PostMapping 绑定Post请求
@PostMapping("/p")@ResponseBody
public String postMapping(){
return "This is post mathod";
}
再访问Post请求的时候,我们可以使用form表单或者postman
form表单:
<div><form action="/p" method="post">
<input type="submit" value="submit">
</form>
</div>
postman:
3)@RequestMapping 通用绑定
(1)如果直接定义在类上,这是给类下面的所有逻辑处理增加URL前缀
@Controller@RequestMapping("/test")
public class URLMappingController {
@GetMapping("/g")
@ResponseBody
public String getMapping(){
return "This is get method";
}
@PostMapping("/p")
@ResponseBody
public String postMapping(){
return "This is post mathod";
}
}
那么在访问路径下面都需要添加前缀:
(2)还可以直接定义在具体方法上面,功能与GetMapping与PostMapping一样
@Controllerpublic class URLMappingController {
// @GetMapping("/g")
@RequestMapping("/g")
@ResponseBody
public String getMapping(){
return "This is get method";
}
}
如果这样定义将不区分是post方法还是get方法:
也可以通过下面方式来指定具体请求方式:
public class URLMappingController {// @GetMapping("/g")
@RequestMapping(value = "/g",method = RequestMethod.GET)
@ResponseBody
public String getMapping(){
return "This is get method";
}
}
2.Controller方法参数接收
在spring中要接受请求参数有两种做法:
a.使用Controller方法参数接收
b.使用Java Bean接受数据
(1)Controller方法参数接受
@Controllerpublic class URLMappingController {
@PostMapping("/p")
@ResponseBody
public String postMapping(String name,String password){
return name + ":" + password;
}
}
访问:
需要注意的是:
public String postMapping(String name,String password)
我们这里输入的是数字,接收的是字符串,这是spring帮我们完成的强转。
但是强转可能出现问题。
get的参数传递是在url中拼接:
例如:localhost:8080/g?name=kebi&password=123456
@Controllerpublic class URLMappingController {
@GetMapping("/g")
@ResponseBody
public String getMapping(String name, String password){
return name + ":" + password;
}
}
如果我们在传参的时候:
localhost:8080/g?nameOld=kebi&password=123456
这样不符合URL的定义规则,虽然不会报错。
如果改成这样:
localhost:8080/g?nameo_ld=kebi&password=123456
java那边也会不符合命名规范:
public String getMapping(String name_old, String password)
所以可以使用注解映射:
public String getMapping(@RequestParam("name_old") String nameOld, String password)
(2)使用Java Bean来接受请求的参数
如果一个请求里面传入了100个参数,那么使用Controller就会现在繁琐,因此我们可以将所有参数封装到一个对象,
这样在对象管理上面会方便很多。
创建User实体类:
public class User {private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然后就可以使用对象来接收参数:
@PostMapping("/p1")@ResponseBody
public String postMapping1(User user){
return user.getName() + ": " + user.getPassword();
}
当我们在请求这个URL的时候,spring MVC会自动创建实体对象,并将参数填充到User对象同名的参数中。
public String postMapping1(User user,String name)
如果我们在实体类之外在定义一个相同的参数,那么SpringMVC在填充的时候
只要是URL中同名的参数都会进行赋值,不论是实体类中的参数还是自定义的参数。
3.接收复合表单数据
利用数组或者List接收请求中的复合数据
利用@RequestParam为参数设置默认值
使用Map对象接收请求参数及注意事项
绝对路径与相对路径吗:
一般在提交数据的时候,可能并不简单:
当有多个复选按钮的时候,可能会一次提交多个数据
<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>
(1)使用list接收
@PostMapping("/apply")@ResponseBody
public String apply(String name,String course,Integer[] purpose){
System.out.println(name);
System.out.println(course);
for (Integer p: purpose){
System.out.println(p);
}
return "apply test";
}
我们还可以设置默认值:
public String apply(@RequestParam(defaultValue = "ANON") String name, String course, Integer[] purpose)
这样如果前端不传参数,那么将会使用ANON默认值。
(2)使用List集合接收
public String apply(String name, String course, @RequestParam List<Integer> purpose)
只需要增加@RequestParam注解,spring才知道需要使用List集合来进行存储。
其实也可以使用对象接收:
public class Form {private String name;
private String course;
private List<Integer> purpose;
}
控制器书写方式与前面类似。
@PostMapping("/apply")@ResponseBody
public String apply(Form form){
System.out.println(form.getName());
System.out.println(form.getCourse());
for (Integer p: form.getPurpose()){
System.out.println(p);
}
return "apply test";
}
(3)使用Map注意事项
在使用map接收数据时,Map会无法接收复合数据的。
4.关联对象赋值
将关联对象的对象名放在表单参数名的前面,就可以给关联对象赋值。
public class Form {private String name;
private String course;
private List<Integer> purpose;
private UserInfo userInfo=new UserInfo();
}
public class UserInfo {
private String name;
private String mobile;
private String address;
}
表单传参的时候需要注意:
<h3>收货人</h3><input name="userInfo.name" class="text" style="width: 150px">
<h3>联系电话</h3>
<input name="userInfo.mobile" class="text" style="width: 150px">
<h3>收货地址</h3>
<input name="userInfo.address" class="text" style="width: 150px">
这样就可以取出数据。
5.日期类型数据转换
1)@DateTimeFormat注解
如果前面传一个时间参数:
<input type="text" name="date">
后台直接使用date对象进行接收,那样肯定会强转失败:
public String postMapping(String name, String password, Date date)
400错误一般是由于强转失败。
可以使用@DateTimeFormat这个注解,pattern表示接收格式:
public String postMapping(String name, String password, @DateTimeFormat(pattern = "yyyy-MM-dd") Date date)
将其封装成为对象也是可行的:
将其封装成为对象也是可行的:public class User {
private String name;
private String password;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date date;
}
只是也需要加上@DateTimeFormat这个注解。
@PostMapping("/p")@ResponseBody
public String postMapping(User user){
System.out.println(user.getName());
System.out.println(user.getPassword());
System.out.println(DateFormat.getDateInstance().format(user.getDate()));
return "date test";
}
2)Converter全局转换器
如果每一个时间我需要进行时间注解,那也太麻烦了。
因此我们可以设置一个全局默认的时间转换器。
(1)创建转换器
新建converter这个包,以及转换器类MyDateConverter:
/** 实现日期转换器的要点有三个:
* 1.实现Converter这个接口
* 2.Converter<String, Date>有两个范型
* 3.必须要实现convert这个接口
* */
public class MyDateConverter implements Converter<String, Date> {
public Date convert(String s){ //s表示输入的字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date d = sdf.parse(s); //格式转换
return d;
} catch (ParseException e){
return null; //如果输入的字符串格式不对,直接返回null
}
}
}
(2)注册使用
在applicationContext.xml中配置:
<!--FormattingConversionServiceFactoryBean通知MVC有哪些自定义的转换类--><bean >
<!--转化类定义-->
<property name="converters">
<set>
<bean class="com.ikidana.springmvc.converter.MyDateConverter"/>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
spring mvc在遇到类型转换的时候,一旦遇到date类型,就会使用MyDateConverter这个类进行转换。
那么如果既使用了@DateTimeFormat这个注解,又使用了全局转换器,那么以谁为准了?
对于SpringMVC,一旦增加了对应了日期转换器,那么优先使用转换器类来处理,而直接忽略掉注解。
以上是 Java——Spring MVC数据绑定 的全部内容, 来源链接: utcz.com/z/393965.html