SpringMVC--请求参数绑定,Spring是怎样巧用三级缓存解决循环依赖的

(3)使用Bean对象进行页面传值到控制器
  • Spring MVC控制器传值到页面

    (1)使用Request、Session进行控制器传值到页面(不建议使用)

    (2)使用ModelAndView进行控制器传值到页面

    (3)使用ModelMap进行控制器传值到页面(建议使用)

请求参数是通过表单/URL?加上后面的参数(key=value)组成的,例如:xxxx:8080?username=aaa&password=111中的username和password就是请求参数。

SpringMVC绑定请求参数:

(1)请求地址提供请求参数:username、password。

(2)控制器中的方法进行参数接收:指定和请求参数同样的名称

(3)当请求参数名和控制器指定名称不一致时将无法取得参数

(4)可以在控制器的参数中通过@ReqeustParam指定URL传递参数名称


/**

 * @Author: Ly

 * @Date: 2020-09-22 17:14

 */

@Controller

@RequestMapping("/param")

public class ParamController {



    /**

     * 请求参数

     * @return

     */

    @RequestMapping("/testParam")

    public String testParam(String username,String password){

        System.out.println("执行了...");

        System.out.println("用户名是:"+username);

        System.out.println("密码是:"+password);

        return "success";

    }

  

} 

传送不同类型的的数据:

  • 基本类型参数:包括基本类型和 String 类型

@RequestMapping("/testParam")

public String testParam(String username,String password){

    System.out.println("执行了...");

    System.out.println("用户名是:"+username);

    System.out.println("密码是:"+password);

    return "success";

} 

  • POJO 类型参数:实体类

    在jsp页面中添加一个表单,并创建对应的实体类Account(name与参数名称一致)


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

    姓名:<input type="text" name="username"><br/>

    密码:<input type="text" name="password"><br/>

    金额:<input type="text" name="money"><br/>

    <input type="submit" value="提交">

</form> 

  • 请求参数绑定,把数据封装到Javabean的类中

/**

 * @return

 */

@RequestMapping("/saveAccount")

public String saveAccount(Account account){

    System.out.println("执行了...");

    System.out.println(account);

    return "success";

} 

  • POJO 类型参数:实体类+关联实体类

    在jsp页面中添加一个表单,新建一个User类,属性包括name和age,并在Account类中添加User类对象


<form action="param/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.name"><br/>

    用户年龄:<input type="text" name="user.age"><br/>

    <input type="submit" value="提交">

</form> 

  • 数组和集合类型参数:包括 List 结构和 Map 结构的集合(包括数组)

    在jsp页面中添加一个表单,删除Account类中User对象属性,并定义一个List<User> list;集合对象属性和一个Map<String,User> map;集合对象属性。


<%--把数据封装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/>



    用户姓名:<input type="text" name="list[0].name"><br/>

    用户年龄:<input type="text" name="list[0].age"><br/>

    用户姓名:<input type="text" name="map['one'].name"><br/>

    用户年龄:<input type="text" name="map['one'].age"><br/>



    <input type="submit" value="提交">

</form> 

SpringMVC 绑定请求参数是自动实现的,但是必须按照相关格式,如果绑定基本类型或者 String 类型,要求我们的参数名称必须和控制器中方法的形参名称保持一致(严格区分大小写)。如果是 POJO 类型,或者它的关联对象:要求表单中参数名称和 POJO 类的属性名称保持一致,并且控制器方法的参数类型是 POJO 类型。如果是集合类型,可以将集合类型的请求参数放在 POJO 中,在表单中请求参数名称要和 POJO 中集合属性名称相同,还可以接收的请求参数是 json 格式数据,并通过相关注解实现。

如果遇特殊类型转换要求,需要我们自己编写自定义类型转换器

案例:日期类类型的数据

日期的格式为2020/10/10,如果我们把格式修改为2020-10-10,SpringMVC在绑定参数时就会报错。

定义日期类


public class DataType implements Serializable{



    private Date date;



    public Date getDate() {

        return date;

    }



    public void setDate(Date date) {

        this.date = date;

    }



    @Override

    public String toString() {

        return "date=" + date;

    }

} 

在JSP页面中添加表单,并在表单中传输2020-10-10格式的日期数据


<%--自定义类型转换器--%>

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

    日期:<input type="text" name="date">

    <input type="submit" value="提交">

</form> 

执行测试代码:


/**

 * 自定义类型转换器

 * @param dateType

 * @return

 */

@RequestMapping("/deleteDate")

public String deleteDate(DateType date){

    System.out.println("执行了...");

    System.out.println(date);

    return "success";

} 

上边代码执行过后会发现报错,因为SpringMVC不能解析这个数据,这时需要我们自定义类型转换器:

  • 第一步:定义一个类,实现 Converter 接口

public class StringToDateConverter implements Converter<String, Date> {



    @Override

    public Date convert(String source) {

        //判断

        if(source==null){

            throw new RuntimeException("请您传入数据");

        }

        DateFormat df=new SimpleDateFormat("yyy-MM-dd");



        try{

            //把字符串转换为日期

            return df.parse(source);

        }catch (Exception e){

            throw new RuntimeException("数据类型转换出现错误");

        }



    }

} 

  • 第二步:在 spring 配置文件中配置类型转换器,spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。

<!--配置自定义类型转换器-->

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">

    <property name="converters">

        <set>

            <!--类型转换器的路径-->

            <bean class="com.ly.utils.StringToDateConverter"></bean>

        </set>

    </property>

</bean> 

  • 第三步:在 annotation-driven 标签中引用配置的类型转换服务

给大家分享下我的复习的面试资料

这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

  • 第一部分:Java基础-中级-高级

image

  • 第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)

image

  • 第三部分:性能调优(JVM+MySQL+Tomcat)

image

  • 第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)

image

  • 第五部分:微服务(SpringBoot+SpringCloud+Dubbo)

image

  • 第六部分:其他:并发编程+设计模式+数据结构与算法+网络

image

进阶学习笔记pdf

  • Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法

image

  • Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis

image

image

image

  • Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)

image

image

image

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

image

image

oU-1630916040266)]

[外链图片转存中…(img-nRlxL6fy-1630916040267)]

[外链图片转存中…(img-RkqZl8VO-1630916040268)]

  • Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)

[外链图片转存中…(img-9WtlcZsl-1630916040270)]

[外链图片转存中…(img-9pWfmN0X-1630916040271)]

[外链图片转存中…(img-a4WBLTeI-1630916040272)]

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

[外链图片转存中…(img-mUfzpaKa-1630916040273)]

[外链图片转存中…(img-sLdtFrbN-1630916040274)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值