2024年最新springmvc详解(三):注解开发基础和参数绑定,面试题kafka数据丢失问题

最后

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例

MyBatis答案解析
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

//所以用包装类型作为形参更好

//调用service更新商品信息,页面需要将商品信息传到此方法

itemsService.updateItems(id, itemsCustom);

return “success”;

}

}

在controller的商品信息修改页面显示和商品信息修改提交两个方法如下:

这两个方法的形参其实就是通过参数绑定所实现的,修改某个商品的参数需要先跳到修改页面显示出该商品的当前参数,其中调用的就是业务层的根据id查询商品信息方法;修改完商品参数以后需要将新的商品信息提交到数据库进行更新,商品信息修改提交方法调用的就是业务层的根据id更新Items表的数据。

我们需要讲解得就是如何实现参数绑定,editItems方法中涉及到默认支持的参数绑定类型(Model model)和简单类型的参数绑定(@RequestParam(value=“id”,required=true) Integer items_id),editItemsSubmit方法涉及到默认支持的参数绑定类型(Model model)和简单类型(Integer id)和pojo类型(ItemsCustom itemsCustom)的参数绑定。详见下面三、参数绑定的类型。

2.4.2、开发jsp

跳转到单个商品信息修改页面的jsp

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt”%>

修改商品信息

<c:if test=“${allErrors!=null }”>

<c:forEach items=“${allErrors }” var=“error”>

${ error.defaultMessage}

</c:forEach>

</c:if>

修改商品信息:

商品名称 商品价格 商品生产日期

<%--

商品图片

<c:if test=“${item.pic !=null}”>


</c:if>

--%> 商品简介 ${itemsCustom.detail }

修改商品信息成功提交后的页面jsp

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

成功提示

操作成功!

三、参数绑定的类型

=========

3.1、spring参数绑定过程


从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变量接收!!!!(servlet是这种方式)

其原理如下:

需要重点说明的是:spring参数绑定过程是处理器适配器调用springmvc提供参数绑定组件将key/value数据转成controller方法的形参(先转成形参,再赋给形参),这一过程都是spring帮我们自动完成的,我们只需要遵守规则(即下面讲解的不同类型的参数在controller方法的形参处该如何绑定)

3.2、默认支持的参数绑定类型


直接在controller方法形参上定义下边类型的对象,就可以使用这些对象,适配器调用参数绑定组件直接进行绑定。在参数绑定过程中,如果遇到下边类型直接进行绑定。可以看到2.4.1中都用到了默认支持的Model。

1、HttpServletRequest

通过request对象获取请求信息

2、HttpServletResponse

通过response处理响应信息

3、HttpSession

通过session对象得到session中存放的对象

4、Model/ModelMap

model是一个接口,modelMap是一个接口实现 。

作用:将model数据填充到request域。

2.4.1中的editItems方法和editItemsSubmit方法都用到了Model。

3.3、简单类型


简单类型包括:Integer、String、Float、Long、Double等类型,但不包括日期类型(日期类型会单独讲解)

绑定规则:

通过@RequestParam对简单类型的参数进行绑定。

如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。

如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。

通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,报下边错误:

2.4.1中的editItems方法的形参:

对应于itemsList.jsp中的提交按钮:

若不使用@RequestParam,则editItems方法的形参需要和request传入参数名称为id保持一致;而使用了@RequestParam就可以将request传入参数名称为id与editItems方法的形参Integer items_id进行对应,达到修改参数名称的效果。

3.4、pojo类型


3.4.1、绑定规则:

pojo作为controller的形参时,jsp页面中input的name和controller的pojo形参中的属性名称一致,即可将页面中数据绑定到pojo。

2.4.1中editItemsSubmit方法的形参ItemsCustom itemsCustom即为pojo类型(继承自逆向工程生成的items),对应关系如下

jsp页面定义:商品信息修改页面editItems.jsp

controller的pojo形参ItemsCustom的定义:(由于ItemsCustom继承自逆向工程生成的Items,故ItemsCustom的属性和Items中的属性相同)

3.4.2、自定义参数绑定实现日期类型绑定

对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。

将请求日期数据串传成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。

所以自定义参数绑定将日期串转成java.util.Date类型。需要向处理器适配器中注入自定义的参数绑定组件。

自定义的日期类型的转换器:

package cn.itcast.ssm.controller.converter;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

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

public class CustomDateConverter implements Converter<String,Date>{

@Override

public Date convert(String source) {

//实现 将日期串转成日期类型(格式是yyyy-MM-dd HH:mm:ss)

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

try {

//转成直接返回

return simpleDateFormat.parse(source);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//如果参数绑定失败返回null

return null;

}

}

在springmvc的配置文件spring.xml中配置自定义的日期类型的转换器:

3.5、包装pojo


这里我们对2.4.1中的查询商品列表方法进行讲解。

quertItems方法的形参ItemsQueryVo即为包装pojo类型(其属性为pojo)

绑定规则:

包装pojo作为controller的形参时,jsp页面中input的name和包装pojo中的_pojo.属性_名称一致,即可将页面中数据绑定到pojo。

jsp页面定义:下旬商品信息页面itemsList.jsp

controller的包装pojo形参ItemsQueryVo的定义:

包装pojo形参ItemsQueryVo的pojo属性ItemsCustom的定义:

3.6、集合类型


关于集合类型的参数绑定,为了简单起见,我们主要讲解表现层的controller和jsp是如何实现参数绑定的。而业务层和持久层的具体方法就不做赘述了。

3.6.1、数组绑定

针对数组绑定我们实现商品批量删除功能,用户在页面选择多个商品,批量删除。

controller方法定义:

// 批量删除 商品信息(数组绑定)

@RequestMapping(“/deleteItems”)

public String deleteItems(Integer[] items_id) throws Exception {//简单类型参数绑定(数组)

// 调用service批量删除商品

// …

return “success”;

}

jsp页面定义:

3.6.2、list绑定

针对list绑定实现批量商品修改功能,在页面输入多个商品信息,将多个商品信息提交到controller方法中。

功能实现分析:

1、进入批量商品修改页面(editItemsQuery.jsp),在次页面通过查询商品列表功能,将所有商品信息显示出来

2、通过批量修改商品提交功能将修改后的商品数据提交到数据库。

通常在需要批量提交数据时,将提交的数据绑定到list中,比如:成绩录入(录入多门课成绩,批量提交)。

故使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list属性

controller方法定义:

List接收页面提交的批量数据,定义在在包装pojo中中的list属性,故editItemsAllSubmit方法传入的形参为包装pojo

// 批量修改商品页面,将商品信息查询出来,在页面中可以编辑商品信息

@RequestMapping(“/editItemsQuery”)

public ModelAndView editItemsQuery(HttpServletRequest request,

ItemsQueryVo itemsQueryVo) throws Exception {

// 调用service查找 数据库,查询商品列表

List itemsList = itemsService.findItemsList(itemsQueryVo);

// 返回ModelAndView

ModelAndView modelAndView = new ModelAndView();

// 相当 于request的setAttribut,在jsp页面中通过itemsList取数据

modelAndView.addObject(“itemsList”, itemsList);

modelAndView.setViewName(“items/editItemsQuery”);

return modelAndView;

}

// 批量修改商品提交(List绑定,将list封装在包装类型的属性中)

// 通过ItemsQueryVo接收批量提交的商品信息,将商品信息存储到itemsQueryVo中itemsList属性中。

@RequestMapping(“/editItemsAllSubmit”)

public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo)

throws Exception {

return “success”;

}

jsp页面定义:

3.6.3、map绑定

在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。

包装类中定义Map对象如下:

Public class QueryVo {

private Map<String, Object> itemInfo = new HashMap<String, Object>();

//get/set方法…

}

controller方法定义:

public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{

System.out.println(queryVo.getStudentinfo());

}

页面定义如下:

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

blic String useraddsubmit(Model model,QueryVo queryVo)throws Exception{

System.out.println(queryVo.getStudentinfo());

}

页面定义如下:

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

[外链图片转存中…(img-zdJ7M0DV-1715226646951)]

[外链图片转存中…(img-h57c1mIO-1715226646951)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值