SpringMVC-请求参数的绑定

请求参数的绑定说明

绑定机制

  1. 表单提交的数据都是k=v格式的 username=haha&password=123
  2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
  3. 要求:提交表单的name和参数的名称是相同的

示例:

​ 请求URL:hello?username=hehe&pssword=123

​ 后台代码:

1
2
3
4
5
6
@RequestMapping(value = "/hello")
public String sayHello(String username,String password){
System.out.println("Hello SpringMVC");
System.out.println(username+"::::"+password);
return "success";
}

​ 注意:参数名username和password必须和URL传递的参数名一样,不然接收不到参数

支持的数据类型

  1. 基本数据类型和字符串类型
  2. 实体类型(JavaBean)
  3. 集合数据类型(List、map集合等)

基本数据类型和字符串类型

  1. 提交表单的name和参数的名称是相同的
  2. 区分大小写

jsp页面代码:注意form表单中的name属性值

1
2
3
4
5
<form action="hello" method="post">
姓名:<input type="text" name="username" /></br>
密码:<input type="text" name="password" /></br>
<input type="submit" value="提交">
</form>

后台代码:注意方法的参数名

1
2
3
4
5
6
@RequestMapping(value = "/hello")
public String sayHello(String username,String password){
System.out.println("Hello SpringMVC");
System.out.println(username+"::::"+password);
return "success";
}

实体类型(JavaBean)

  1. 提交的表单的name和JavaBean中的属性名称需要一致
  2. 如果一个JavaBean类中包含其他引用类型,那么表单的name属性需要编写成:对象.属性,例如:user.uname

示例:

​ jsp页面代码:注意form表单中的name属性值

1
2
3
4
5
6
7
8
<form action="saveAccount" method="post">
姓名:<input type="text" name="username" /></br>
密码:<input type="text" name="password" /></br>
金额:<input type="text" name="money" /></br>
用户姓名:<input type="text" name="user.uname" /></br>
用户年龄:<input type="text" name="user.age" /></br>
<input type="submit" value="提交">
</form>

​ 后台控制类代码:注意方法的参数名

1
2
3
4
5
6
7
8
9
/**
* 请求参数绑定把数据封装到JavaBean的类中
*/
@RequestMapping(value = "/saveAccount")
public String saveAccount(Account account){
System.out.println("Hello SpringMVC");
System.out.println(account);
return "success";
}

​ 后台实体代码:

​ Account类:注意类的属性名

1
2
3
4
5
6
public class Account implements Serializable {
private String username;
private String password;
private Double money;
private User user;
...还有get、set、toString方法

​ User类:注意类的属性名

1
2
3
4
public class User implements Serializable {
private String uname;
private int age;
...还有get、set、toString方法

​ 结果:

结果

集合数据类型

与实体类型(JavaBean)基本一致

List封装,使用:list名称[list中序号].list保存对象的属性,参照示例,如:userList[0].uname:

​ userMap[‘one’].uname:userMap是Account类中Map<String,User>的属性名,uname是Account类中Map对象存储的实体User的属性,one表示userMap存储的User对象对应的key。

Map封装,使用:map名称[map保存对象对应的key].map保存对象的属性,参照示例,如:userMap[‘one’].age:

​ userMap[‘one’].uname:userMap是Account类中Map<String,User>的属性名,uname是Account类中Map对象存储的实体User的属性,one表示userMap存储的User对象对应的key。

示例:

jsp页面代码:注意form表单中的name属性值

1
2
3
4
5
6
7
8
9
10
11
12
<form action="saveAccount" method="post">
姓名:<input type="text" name="username" /></br>
密码:<input type="text" name="password" /></br>
金额:<input type="text" name="money" /></br>
用户1姓名:<input type="text" name="userList[0].uname" /></br>
用户1年龄:<input type="text" name="userList[0].age" /></br>
用户2姓名:<input type="text" name="userList[1].uname" /></br>
用户2年龄:<input type="text" name="userList[1].age" /></br>
用户3姓名:<input type="text" name="userMap['one'].uname" /></br>
用户3年龄:<input type="text" name="userMap['one'].age" /></br>
<input type="submit" value="提交">
</form>

后台控制类代码:注意方法的参数名

1
2
3
4
5
6
@RequestMapping(value = "/saveAccount")
public String saveAccount(Account account){
System.out.println("Hello SpringMVC");
System.out.println(account);
return "success";
}

后台实体代码:

​ Account类:

1
2
3
4
5
6
7
8
public class Account implements Serializable {
private String username;
private String password;
private Double money;
private User user;
private List<User> userList;
private Map<String,User> userMap;
...还有get、set、toString方法

​ User类:

1
2
3
4
public class User implements Serializable {
private String uname;
private int age;
...还有get、set、toString方法

jsp页面输入:

参数

结果:

结果

自定义类型转换器

  1. 第一步:定义一个类,实现Converter接口,该接口有两个泛型。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /**
    * 将字符串转换为日期
    */
    public class StringToDate implements Converter<String, Date> {
    // String s 传进来的字符串
    @Override
    public Date convert(String s) {
    if (s == null) {
    throw new RuntimeException("请您传入数据!");
    }
    DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
    // 把字符串转换日期
    try {
    return dateFormat.parse(s);
    } catch (ParseException e) {
    e.printStackTrace();
    throw new RuntimeException("数据类型转换出现错误!");
    }
    }
    }
  2. 第二步:注册自定义类型转换器,在springmvc配置文件中编写配置

    1
    2
    3
    4
    5
    6
    7
    8
    <!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
    <set>
    <bean class="com.ligangit.util.StringToDate"/>
    </set>
    </property>
    </bean>
  3. 第三步:让自定义类型转换器生效conversion-service

    1
    2
    <!--开启SpringMVC框架注解支持-->
    <mvc:annotation-driven conversion-service="conversionService"/>

    获取Servlet原生的API

    只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //    原生的ServletAPI
    @RequestMapping(value = "/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response){
    System.out.println("Hello SpringMVC");
    System.out.println(request);
    HttpSession session = request.getSession();
    System.out.println(session);
    ServletContext servletContext = session.getServletContext();
    System.out.println(servletContext);
    return "success";
    }

最后更新: 2020年06月30日 22:46

原始链接: http://ligangit.com/2020/06/29/SpringMVC-请求参数的绑定/

× 请我吃糖~
打赏二维码