SpringMVC 请求参数的绑定


:这篇博客主要讲的是 SpringMVC 中请求参数的绑定,里面涉及的 环境搭建以及代码 已经在上一篇博客中给出(SpringMVC环境搭建)。


一、请求参数绑定概念

1. 绑定机制

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

2. 支持的数据类型

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

二、请求参数绑定基本数据类型

在这里插入图片描述

1. 编写页面代码 param.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--请求参数的绑定--%>
	<a href="param/testParam?username=haha">请求参数绑定</a>
</body>
</html>

2. 编写控制器代码 ParamController.java

/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {
    
    

    /**
     * 请求参数绑定入门(基本类型)
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username){
    
    
        System.out.println("执行了。。。");
        System.out.println("用户名:" + username);
        return "success";
    }
}

三、请求参数绑定实体类型(JavaBean)

1. 编写页面代码 param.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%--把数据封装到 Account 类中--%>
    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br/><%--name和Account中的属性名相同--%>
        密码:<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>

</body>
</html>

2. 编写控制器代码 ParamController.java

/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {
    
    

    /**
     * 请求参数绑定_把数据封装到 JavaBean 的类中
     * @return
     */
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
    
    
        System.out.println("执行了。。。");
        System.out.println(account);
        return "success";
    }
}

3. 编写实体类代码 Account.java 和 User.java

Account.java 代码如下:

package cn.zjw.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Account implements Serializable {
    
    

    private String username;
    private String password;
    private Double money;

    private User user;
   
    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }

    public Double getMoney() {
    
    
        return money;
    }

    public void setMoney(Double money) {
    
    
        this.money = money;
    }

    public User getUser() {
    
    
        return user;
    }

    public void setUser(User user) {
    
    
        this.user = user;
    }

    @Override
    public String toString() {
    
    
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", uname=" + uname +
                ", age=" + age +
                '}';
    }
}

User.java 代码如下:

package cn.zjw.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    
    

    private String uname;
    private Integer age;

    public String getUname() {
    
    
        return uname;
    }

    public void setUname(String uname) {
    
    
        this.uname = uname;
    }

    public Integer getAge() {
    
    
        return age;
    }

    public void setAge(Integer age) {
    
    
        this.age = age;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                '}';
    }
}

四、解决中文乱码问题

在 web.xml 中进行如下配置:
在这里插入图片描述

代码如下:

  <!--配置解决中文乱码的过滤器-->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

五、请求参数绑定集合类型

1. 编写页面代码 param.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%--把数据封装到 Account 类中,类中存在 list 和 map 集合--%>
    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br/>
        密码:<input type="text" name="password"/><br/>
        金额:<input type="text" name="money"/><br/>
        <%--数据封装到 User 对象,再封装到 list 集合--%>
        用户姓名:<input type="text" name="list[0].uname"/><br/>
        用户年龄:<input type="text" name="list[0].age"/><br/>
        <%--数据封装到 User 对象,再封装到 map 集合--%>
        用户姓名:<input type="text" name="map['one'].uname"/><br/>
        用户年龄:<input type="text" name="map['one'].age"/><br/>
        <input type="submit" value="提交"/>
    </form>

</body>
</html>

2. 编写控制器代码 ParamController.java

/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {
    
    

    /**
     * 请求参数绑定_把数据封装到 JavaBean 的类中
     * @return
     */
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
    
    
        System.out.println("执行了。。。");
        System.out.println(account);
        return "success";
    }

}

3. 编写实体类代码 Account.java 和 User.java

User.java 代码同上;
Account.java 代码如下:

package cn.zjw.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Account implements Serializable {
    
    

    private String username;
    private String password;
    private Double money;

//    private User user;
    private List<User> list;
    private Map<String, User> map;

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }

    public Double getMoney() {
    
    
        return money;
    }

    public void setMoney(Double money) {
    
    
        this.money = money;
    }

    public List<User> getList() {
    
    
        return list;
    }

    public void setList(List<User> list) {
    
    
        this.list = list;
    }

    public Map<String, User> getMap() {
    
    
        return map;
    }

    public void setMap(Map<String, User> map) {
    
    
        this.map = map;
    }

    @Override
    public String toString() {
    
    
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}

六、自定义类型转换器

1. 编写工具类代码 StringToDateConverter.java

package cn.zjw.utils;

import org.springframework.core.convert.converter.Converter;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 字符串转换成日期类型
 */
public class StringToDateConverter implements Converter<String, Date> {
    
    

    /**
     * String s 传入进来的字符串
     * @param s
     * @return
     */
    @Override
    public Date convert(String s) {
    
    
        //判断
        if (s == null){
    
    
            throw new RuntimeException("请传入数据");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        try {
    
    
            //把字符串转换成日期
            return df.parse(s);
        } catch (ParseException e) {
    
    
            throw new RuntimeException("数据类型转换错误");
        }
    }
}

2. 配置自定义类型转换器

在 springmvc.xml 中进行如下配置:
在这里插入图片描述

代码如下:

扫描二维码关注公众号,回复: 12344673 查看本文章
    <!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="cn.zjw.utils.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

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

3. 编写页面代码 param.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%--自定义类型转换器--%>
    <form action="param/saveUser" method="post">
        用户姓名:<input type="text" name="uname"/><br/>
        用户年龄:<input type="text" name="age"/><br/>
        用户生日:<input type="text" name="date"/><br/>
        <input type="submit" value="提交"/>
    </form>

</body>
</html>

4. 编写控制器代码 ParamController.java

package cn.zjw.controller;

import cn.zjw.domain.Account;
import cn.zjw.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {
    
    

    /**
     * 自定义类型转换器
     * @return
     */
    @RequestMapping("/saveUser")
    public String saveUser(User user){
    
    
        System.out.println("执行了。。。");
        System.out.println(user);
        return "success";
    }
}

5. 编写实体类代码 User.java

User.java 代码如下:

package cn.zjw.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    
    

    private String uname;
    private Integer age;

    private Date date;

    public String getUname() {
    
    
        return uname;
    }

    public void setUname(String uname) {
    
    
        this.uname = uname;
    }

    public Integer getAge() {
    
    
        return age;
    }

    public void setAge(Integer age) {
    
    
        this.age = age;
    }

    public Date getDate() {
    
    
        return date;
    }

    public void setDate(Date date) {
    
    
        this.date = date;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }
}

猜你喜欢

转载自blog.csdn.net/pary__for/article/details/112917089