(三)请求参数绑定

   SpringMVC中的参数绑定过程使把表单提交的请求参数,作为控制器中方法的参数进行绑定的,要求提交表单的“name”属性和方法参数名称相符,支持的数据类型有:

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

1、绑定基本数据类型和字符串类型

   提交表单的“name”属性和方法参数的名称一致,注意区分大小写。

  • 请求网页:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>入门程序</title>
</head>
<body>
    <h3>程序入口</h3>
    <a href="param/saveData?name=LiHua&age=20">saveUser</a>
</body>
</html>
  • 控制器:ParamController.java
@Controller
@RequestMapping(path = "/param")
public class ParamController {

    @RequestMapping(path = "/saveData")
    public String saveUser(String name, Integer age){
        System.out.println("name: " + name + "\n" + "age: " + age);
        return "success";
    }
}
  • 运行结果:
    在这里插入图片描述

2、绑定实体类型

   提交表单的“name”要和JavaBean中的属性名称一致,如果JavaBean类中包含其他的引用类型,则表单的“name”属性需要编写成:对象.属性。

2.1 普通JavaBean类
  • JavaBean类:User.java,需要实现 Serializable 接口,且需有 set()、get() 方法。
public class User implements Serializable {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • 控制器中的方法:直接在方法中传入JavaBean类对象
	@RequestMapping(path = "/saveUser")
    public String saveUser(User user){
        System.out.println(user);
        return "success";
    }
  • 测试 form 表单:
	<form action="param/saveUser" method="post">
        姓名:<input type="text" name="name" /><br/>
        年龄:<input type="text" name="age" /><br/>
        <input type="submit" value="提交"><br/><br/>
    </form>
  • 运行结果:
    在这里插入图片描述
2.2 含引用类型的JavaBean类
  • JavaBean类:Account.java,有引用类型作为属性。
public class Account {
    private Integer money;
    private User user;

    public Integer getMoney() {
        return money;
    }

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

    public User getUser() {
        return user;
    }

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

    @Override
    public String toString() {
        return "Account{" +
                "money=" + money +
                ", user=" + user +
                '}';
    }
}
  • 控制器中的方法:也是直接在方法中传入JavaBean类对象
	@RequestMapping(path = "/saveAccount")
    public String saveAccount(Account account){
        System.out.println(account);
        return "success";
    }
  • 测试 form 表单:
    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="user.name" /><br/>
        年龄:<input type="text" name="user.age" /><br/>
        金额:<input type="text" name="money" /><br/>
        <input type="submit" value="提交"><br/><br/>
    </form>
  • 运行结果:
    在这里插入图片描述

3、绑定集合类型

   在jsp页面中,以 集合名[index].属性 的方式编写。

  • 测试JavaBean类:
public class MyAccount {
    private List<User> userList;
    private Map<String, User> userMap;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    public Map<String, User> getUserMap() {
        return userMap;
    }

    public void setUserMap(Map<String, User> userMap) {
        this.userMap = userMap;
    }
    
    @Override
    public String toString() {
        return "MyAccount{" +
                "userList=" + userList +
                ", userMap=" + userMap +
                '}';
    }
}
  • 测试控制器类:
	@RequestMapping(path = "/saveMyAccount")
    public String saveMyAccount(MyAccount myAccount){
        System.out.println(myAccount);
        return "success";
    }
  • 测试 form 表单:
	<form action="param/saveMyAccount" method="post">
        姓名1<input type="text" name="userList[0].name" /><br/>
        年龄1<input type="text" name="userList[0].age" /><br/>

        姓名2<input type="text" name="userMap['one'].name" /><br/>
        年龄2<input type="text" name="userMap['one'].age" /><br/>

        <input type="submit" value="提交"><br/><br/>
    </form>
  • 运行结果:
    在这里插入图片描述

4、自定义类型转换器

   在SpringMVC中,框架会自动将请求参数(String类型)转换为我们接收的对应类型,例如,会自动将字符串 “2020/4/7” 转换为 Date 类型,但是,如果传入的日期字符串格式为 “2020-4-7” 时,则会转换失败,这时候就需要我们自定义类型转换器了。

  • 自定义类型转换器,需要实现 Converter 接口:
public class StringToDateConverter implements Converter<String, Date> {

    @Override
    public Date convert(String s) {
        try{
            return new SimpleDateFormat("yyyy-MM-dd").parse(s);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
  • 在spring配置文件(springmvc.xml)中配置:
	<!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.lyj.param.StringToDateConverter"/>
            </set>
        </property>
    </bean>


    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven conversion-service="conversionService"/>
  • 控制器方法:
	@RequestMapping(path = "/saveDate")
    public String saveDate(Date date){
        System.out.println(date);
        return "success";
    }
  • 测试 form 表单:
	<form action="param/saveDate" method="post">
        日期:<input type="text" name="date" /><br/>
        <input type="submit" value="提交"><br/><br/>
    </form>
  • 测试结果:覆盖了原来的 StringToDateConverter 转换器(因为存储各种String转换器的是一个set集合),默认的日期转换器可以转换字符串 “2020/4/7” 这种格式。
    在这里插入图片描述

5、获取Servlet原生API

   直接在控制器的方法中,定义想要调用的对象即可。

	@RequestMapping(path = "/save")
    public String save(HttpServletRequest request, HttpServletResponse response){
        System.out.println(request);
        System.out.println(response);
        return "success";
    }

6、配置解决中文乱码的过滤器

   在 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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个用于创建独立的、可执行的 Spring 应用程序的框架,它可以帮助开发者快速搭建基于 Spring 的项目。而在 Spring Boot 绑定 HTTP 请求参数到 DTO(Data Transfer Object,数据传输对象)对象的过程是基于其分层体系结构进行的。 在传统的分层体系结构,通常会将应用程序分为多个层级,如表示层(Presentation Layer)、业务逻辑层(Business Layer)和数据访问层(Data Access Layer)等。而 DTO 对象则主要用于在这些层级之间传递数据。 当一个 HTTP 请求到达应用程序时,使用 Spring MVC 模块可以将请求参数绑定到具体的 DTO 对象上。具体实现的方式有多种,可以通过注解或配置文件等进行配置。 首先,需要在表示层(通常是控制器声明一个方法,该方法接受需要绑定参数的 DTO 对象作为参数。Spring Boot 的自动配置功能会根据参数的类型自动进行绑定。 然后,在 HTTP 请求传递的参数会被解析,并与 DTO 对象的属性进行匹配。如果参数名称与 DTO 对象的属性名称相同,则会自动将值赋给对应的属性。 最后,当所有参数绑定完毕后,控制器方法可以使用传递的 DTO 对象进行相应的业务处理。 通过这种方式,Spring Boot 将 HTTP 请求参数与 DTO 对象之间建立了绑定关系,使得在不同的层级之间传递数据更加方便和高效。同时,利用注解和自动配置等特性,开发者可以轻松地实现参数绑定,减少了开发的复杂性和工作量。 总之,Spring Boot 将 HTTP 请求参数绑定到 DTO 对象的分层体系结构,可以帮助开发者快速搭建基于 Spring 的项目,并提供了方便和高效的数据传递功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值