Java框架_SpringMVC_day02_请求参数的绑定

本文详细讲解了SpringMVC中的请求参数绑定机制,包括基本数据类型、JavaBean实体、集合类型及自定义类型转换器的使用。通过实例演示如何解决中文乱码问题,并介绍了如何在控制器中使用ServletAPI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

三、请求参数的绑定

3.1 请求参数的绑定机制

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

3.2.1 index.jsp

3.2.2 ParamController.java

3.3 实体类型(JavaBean)

3.3.1 封装 Account 类

3.3.2 index.jsp

3.3.3 Controller

3.3.4 Post 请求参数中文乱码问题的解决

3.4 给集合属性数据封装

3.4.1 index.jsp

3.4.2 Account.java

3.4.3 Controller

3.5 自定义类型转换器

3.5.1 User.java

3.5.2 index.jsp

3.5.3 Controller

3.5.4 自定义类型转换器(StringToDateConverter.java)

3.5.5 springmvc.xml 配置注册自定义类型转换器

3.6 在控制器中使用原生的 ServletAPI 对象

3.6.1 index.jsp

3.6.2 Controller


三、请求参数的绑定

3.1 请求参数的绑定机制

(1)绑定机制

       【1】表单提交的数据都是k=v格式的 username=haha&password=123

       【2】SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的

       【3】要求:提交表单的name和参数的名称是相同的

(2)支持的数据类型

       【1】基本数据类型和字符串类型

       【2】实体类型(JavaBean)

       【3】集合数据类型(List、map集合等)

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

注意:

(1)提交表单的name和参数的名称是相同的

(2)区分大小写

3.2.1 index.jsp

<h3>传递参数</h3>
<a href="param/testParam?username=张三&age=18">传递参数(字符串和基本数据类型)</a>

3.2.2 ParamController.java

@Controller
@RequestMapping(value = "/param")
public class paramController {

    @RequestMapping(value = "/testParam")
    public String testParam(String username,Integer age){
        System.out.println("执行了 paramController 中的 testParam 方法!! username:"+username+"   age:"+age);
        return "success";
    }

3.3 实体类型(JavaBean)

(1)提交表单的name和JavaBean中的属性名称需要一致

(2)如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

3.3.1 封装 Account 类

package com.cpz.domain;

import java.util.List;
import java.util.Map;

public class Account {
    private String name;
    private String password;
    private Double money;
    private User user;


}

3.3.2 index.jsp

<form action="param/saveAccount" method="post">
    账号:<input type="text" name="name"/><br>
    密码:<input type="text" name="password"/><br>
    金额:<input type="text" name="money"/><br>
    用户姓名:<input type="text" name="user.username"/><br>
    用户年龄:<input type="text" name="user.age"/><br>
    <input type="submit" value="提交"/>
</form>

3.3.3 Controller

    @RequestMapping(value = "/saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了 paramController 中的 testParam 方法!! account:"+account);
        return "success";
    }

3.3.4 Post 请求参数中文乱码问题的解决

在 web.xml 中配置 Spring 提供的过滤器类:

    <!-- 配置过滤器,解决中文乱码的问题 -->
    <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>

3.4 给集合属性数据封装

3.4.1 index.jsp

<form action="param/saveAccount" method="post">

    用户姓名(list):<input type="text" name="list[0].username"/><br>
    用户年龄(list):<input type="text" name="list[0].age"/><br>
    用户姓名(list):<input type="text" name="list[1].username"/><br>
    用户年龄(list):<input type="text" name="list[1].age"/><br>

    用户姓名(map):<input type="text" name="map['one'].username"/><br>
    用户年龄(map):<input type="text" name="map['one'].age"/><br>
    用户姓名(map):<input type="text" name="map['two'].username"/><br>
    用户年龄(map):<input type="text" name="map['two'].age"/><br>
    <input type="submit" value="提交"/>
</form>

3.4.2 Account.java

public class Account {
    private String name;
    private String password;
    private Double money;
    private User user;
    private List<User> list;
    private Map<String,User> map;
}

3.4.3 Controller

    @RequestMapping(value = "/saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了 paramController 中的 testParam 方法!! account:"+account);
        return "success";
    }

3.5 自定义类型转换器

3.5.1 User.java

public class User {
    private String username;
    private Integer age;
    private Date birthday;
}

3.5.2 index.jsp

<form action="param/saveUser" method="post">
    姓名:<input type="text" name="username"/><br>
    年龄:<input type="text" name="age"/><br>
    生日:<input type="text" name="birthday"/><br>
    <input type="submit" value="提交"/>
</form>

3.5.3 Controller

    @RequestMapping(value = "/saveUser")
    public String saveUser(User user){
        System.out.println("执行了 paramController 中的 saveUser 方法!! user:"+user);
        return "success";
    }

结论:默认支持的日期格式是:yyyy/MM/dd,如果输入yyyy-MM-dd呢?则会报错,怎么办呢?

3.5.4 自定义类型转换器(StringToDateConverter.java)

package com.cpz.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> {
    //进行类型转换的方法
    public Date convert(String source) {
        // 判断,或者return null;
        if (source == null){
            throw new RuntimeException("参数不能为空");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = df.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

3.5.5 springmvc.xml 配置注册自定义类型转换器

    <!-- 注册自定义类型转换器 -->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.cpz.utils.StringToDateConverter"></bean>
            </set>
        </property>    

    <!-- 3:配置spring开启注解mvc的支持,自动开启处理器映射器和处理器适配器 -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

3.6 在控制器中使用原生的 ServletAPI 对象

3.6.1 index.jsp

<a href="param/testServlet">测试ServletAPI</a>

3.6.2 Controller

    @RequestMapping(value = "/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println("执行了 paramController 中的 testServlet 方法!! request:"+request);
        System.out.println("session:"+request.getSession());
        System.out.println("application:"+request.getSession().getServletContext());
        System.out.println("response:"+response);
        return "success";
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值