前言
原生的servlet接收参数需要通过request.getParameter()方法获取,然后进行类型转换。而springmvc完成了对Servlet的封装,简化了servlet的很多操作。例如springmvc在接收整形参数时,直接在Handler方法中声明形参即可,传入pojo类还可以直接封装成形参声明的pojo类型。
一、什么是参数绑定?
取出请求的参数值直接绑定到handler⽅法的形参上
二、使用及测试
-
创建springmvc工程,引入相关的依赖,配置web.xml和springmv.xml文件,创建对应的controller层,请参考springmvc的基础使用
-
servlet原生api的支持
-
引入原生Servlet相关jar包
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
-
测试代码:
@RequestMapping("/handle02") public void handle02(HttpServletRequest request, HttpServletResponse response, HttpSession session){ String id = request.getParameter("id"); System.out.println(id); }
-
测试:
-
-
绑定简单类型参数,注意:布尔值只支持true,false,0,1;尽量使用包装类,因为基本类型没有null
-
若handle方法中传参和请求中的参数名一致,则可以直接传入,若不一致,则需要在方法形参前加上@RequestParam(“请求中的参数名”)注解,测试代码:
@RequestMapping("/handle03") public void handle03(@RequestParam("para1") Boolean para){ System.out.println(para); }
-
测试:
-
-
绑定pojo类型参数,直接形参声明即可,类型就是Pojo的类型,形参名⽆所谓 ,但是要求传递的参数名必须和Pojo的属性名保持⼀致
-
创建pojo类
public class User { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
-
测试代码:
@RequestMapping("/handle04") public void handle04(User user){ System.out.println(user); }
-
测试:
-
-
绑定Pojo包装对象参数(即成员变量中包含别的pojo类),直接将成员变量名一一对应上即可
-
创建pojo类
public class QueryVo { private String mail; private String phone; // 嵌套了另外的Pojo对象 private User user; public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "QueryVo{" + "mail='" + mail + '\'' + ", phone='" + phone + '\'' + ", user=" + user + '}'; } }
-
测试代码:
@RequestMapping("/handle05") public void handle05(QueryVo queryVo){ System.out.println(queryVo); }
-
测试:
-
-
绑定⽇期类型参数(需要配置⾃定义类型转换器)
-
由于前端传递过来的是一个日期字符串,绑定参数是Date日期类型,所以需要定义⼀个SpringMVC的类型转换器
public class DateConverter implements Converter<String, Date> { @Override public Date convert(String s) { //从 String 转换成 Date类型 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date parse = simpleDateFormat.parse(s); return parse; } catch (ParseException e) { //case:若存在多种日期格式,可以在catch异常处理中再处理别的类型的日期 e.printStackTrace(); } return null; } }
-
在springmvc中注册自定义类型转换器
-
测试代码:
@RequestMapping("/handle06") public void handle06(Date date){ System.out.println(date); }
-
测试:
若存在多种日期格式,可以在catch异常处理中再处理别的类型的日期
-
总结
- springmvc封装了servlet操作,多个controller分别处理请求也解耦了相关的业务逻辑处理。
- 基本类型或者pojo类直接对应各个属性的名称即可进行传参。
- 请求传入String类型,形参接收为Date类型则需要自定义类型转换器。