3. SpringMVC 的参数绑定
3. SpringMVC 的参数绑定
用户请求服务器的时候会向后台传递参数(Controller), 如何来快速的接收到用户传递的参数,可以通过参数绑定来实现。
1 传统方式进行参数传递
在 Controller 中的方法的形式参数上直接声明HttpServletRequest, HttpServletResponse , HttpSession(就是以前的 JAVAEE 获取方法)
//注解,通过这个地址login1.action执行当前方法
@RequestMapping("test01.action")
public ModelAndView test01(HttpServletRequest req){
//springmvc会将请求对象 赋值给req
String username= req.getParameter("username");
String password= req.getParameter("password");
System.out.println(username);
System.out.println(password);
ModelAndView mv= new ModelAndView();
mv.setViewName("main");//通过配置视图解析器前后缀,找到指定界面
return mv;
}
2 通过 SpringMVC 的参数绑定实现【***用这个就行】
对于普通的数据类型(8 大基本数据类型、String 数据类型)会直接自动进行参数绑定【springmvc 的内部有默认的类型转换器,比如 Spring -> int】;但是如果是自定义数据类型或其他数据类型,需要创建一个 bean 对象类,进行封装调用。
2.1 SpringMVC 的基本数据类型的参数绑定
2.1.1 方法形式参数名和页面传入参数名一致
只需要保证请求作用域 request(也就是从浏览器传过来的值)的 name 和方法上的形式参数名称一致,就可以自动赋值。
@RequestMapping("test02.action")
public ModelAndView test02(String username1,String password){
//springmvc会将请求对象,赋值给request
//参数绑定就是自动从requeest,将参数值取出来赋值给形式参数username password
System.out.println(username1);
System.out.println(password);
ModelAndView mv= new ModelAndView();
mv.setViewName("main");通过配置视图解析器前后缀,找到指定界面
return mv;
}
2.1.2 方法形式参数名和页面传入参数名不一致
如果你的形参的名字和页面传入的参数名字不一致,可以使用@RequestParam
注解,将参数名不同的设置@RequestParam(value="页面的参数名")
@RequestParam 的三个值
- value:请求参数的参数名, 注解中 value 值要和页面传入的参数名称一致。
- required:该参数是否必须,默认为 true,如果没有给这个值,则出现 400 错误页面。
- defaultValue:请求参数的默认值,比如 defaultValue = “default”,如果给了参数,就获取,如果没有给参数,则默认为 default 的值。
比如从页面传入的参数名是 username 和 password,接收参数是 name 和 password,需要对 name 增加注解,应该写成下面这种情况
public ModelAndView test03(@RequestParam(value="username") String name, String password){
//需要将形式参数name标明只的是页面参数username
System.out.println(name);
System.out.println(password);
ModelAndView mv= new ModelAndView();
mv.setViewName("main");
return mv;
}
2.1.3 总结
- 基本数据类型和 String 的参数自动绑定
- springmvc 会自动将请求对象,赋值给 request,参数自动绑定就是自动的从 request 中奖数据赋值给参数列表
- 前提条件(参数列表和请求 request 域中的名称相同,不同就不赋值)
- 自动的从 request 中获取值赋值给参数列表(名称要相同,而且只能处理简单的参数(8 中基本数据类型 + String))
- 如果从页面传入的参数名和方法形式参数不一样,就需要通过
@RequestParam
注解来设置(可以设置多个,顺序和形式参数要一致)- 如果参数名称不同可以通过注解
@RequestParam
补救,如果没有注解存在,就按参数列表来获取值,如果有注解存在,先按注解赋值(有注解优先看注解)
2.2 SpringMVC 的对象数据类型 pojo 参数绑定
pojo 概念:
POJO(Plain Ordinary Java Object)就是简单的 Java 对象,实际就是普通 JavaBeans。(需要创建对应的 javabean 类)
其中只有一些属性及其 getter setter 方法的类,没有别的什么业务逻辑方法。
使用场景
当页面需要传递多个参数时(一个表单等情况),我们可以将多个参数封装到一个 JavaBean 类。(使用 POJO 类进行数据封装,就是创建不同 javabean 对象封装)。
将这个 JavaBean 作为方法形参,SpringMVC 可以直接将页面的数据赋值给 JavaBean 对象(参数列表参数自动赋值)。
【前提条件】JavaBean 类中成员变量的名字和必须和表单中 name 属性的值一样(因为取值赋值通过 get/set 方法)。
案例
前台页面 jsp
<input type="text" name="username" placeholder="请输入用户名"/>
<input type="password" name="password" placeholder="请输入密码"/>
我们就可以将其封装成一个 User 的pojp
对象
public class User{
private String username;
private String password;
//省略get/set方法(一定得有)
}
参数绑定:
@RequestMapping("test04.action")
//从页面获取参数然后赋值给javabean对象的同名属性(通过set方法)
public ModelAndView test04(User user){
//springMVC可以将表单的数据赋值给一个javaBean对象
//通过get方法获取已经被自动赋值的javabean对象属性
System.out.println(user.getUsername());
System.out.println(user.getPassword());
ModelAndView mv= new ModelAndView();
mv.setViewName("main");
return mv;
}
2.3 SpringMVC 的嵌套 javabean 参数绑定
概念
封装多个不同类型的 javabean 对象做成员变量(就是一个 javabean 又封装了多个 javabean 对象作为属性)。
当前的 javaBean 类的成员变量有复杂类型(其他 javabean)如:Person 类中有 birthday 等变量
通过当前成员属性名(javabean 对象作为成员属性名)加.点来获取它的属性
javabean
public class Person {
private int id;
private String username;
private String password;
private Birthday birthday;
//省略get/set方法
}
public class Birthday {
private int year;
private int month;
private int day;
//省略get/set方法
}
后台获取方法
@RequestMapping("test05.action")
//按照name相同自动参数绑定赋值
public ModelAndView test05(Person person){
//springMVC可以将表单的数据赋值给 一个javaBean对象
System.out.println(person.getUsername());
System.out.println(person.getPassword());
System.out.println(person.getBirthday().getYear());
System.out.println(person.getBirthday().getMonth());
System.out.println(person.getBirthday().getDay());
ModelAndView mv= new ModelAndView();
mv.setViewName("main");
return mv;
}
前台 jsp 写法
<form method="post" action="${pageContext.request.contextPath}/registerPerson.action">
用户名: <input type="text" name="username" /><br/>
用户密码: <input type="text" name="password"/><br/>
年 <input type="text" name="birthday.year"/><br/>
月<input type="text" name="birthday.month"/><br/>
日<input type="text" name="birthday.day"/><br/>
<input type="submit" value="添加"/><br/>
</form>