请求参数
(这里的形参数据都是SpringMvc注入的)
controller里的方法不是我们来调用的 是由SpringMvc的前端控制器所调用的(前端控制器调用了处理器 由处理器和适配器去调用我们controller里的方法),controller里的方法叫handler->处理器
SpringMVC的Controller方法形参数据类型:
Controller方法(处理器)是SpringMVc调用,形参的值由SpringMVC注入(传递参数)
javaWeb核心的api接口对象
- HttpServletRequest请求对象
- HttpServletResponse 响应对象
- HttpSession session对象
- Model/ModelMap Model是一个接口,ModelMap是一个接口实现。作用:将model数据填充到request域。
- ps:如果只是往域中存数据推荐用model/modelmap
kv键值对是我们的请求参数 之前写的通过?传值 表单传值都是kv键值对
而现在在springmvc里面使用conventer组件把数据绑定到我们的方法形参实现数据的传输
如果只是往request添加数据,推荐使用Model,而不直接注入Request对象,与JavaWeb解耦
如果调用request对象其他方法,只能注入Request对象
TestController.java
1.参数注入
方法返回一个逻辑视图名
@controller:交给spring管理
@RequestMapping:加上前缀 然后这个方法呢可以注入javaWeb的核心api对象
以后写SpringMvc写javaWeb的东西东西时注入就行了
只有不转发之后才能展示
(写这个的用处:后期写的是java对象 用通过这种方式写数据)
请求参数 客户端请求参数时基于key/value对的方式
当然了客户端请求参数:还可通过以json形式的方式
如果是key-value :我们只要在自己的方法形参定义参数来接收这个请求参数就可以了
前端传过来的时字符串类型 跨平台数据传输都是字符串格式的
字符串
但是对于这种数据我们需要一种协议、格式 来对我们我们的参数的值进行一个说明
参数的类型
1.简单数据类型 保证类型 int String 日期
2.自定义类类型
3.集合类型
4.数据类型
简单数据类型
要求形参参数名与请求参数名一样(不一样会映射失败)
kv键值对用?传值
写一个controller我来接受这些传过来的参数
记得上面说的- >我们只要在自己的方法形参定义参数来接收这个请求参数就可以了
但是要求:要求形参参数名与请求参数名一样 spring可以进行数据类型转换
这是效果:而且他还会把String数据类型的id转换成int类型
特殊问题:如果是日期呢?
405:你发送的请求时post请求 但是我只能处理get请求
404:文资源找不到
400:参数有问题 错误的请求
原因:他无法解析日期 导致不能进行类型转换
如果前端传递时一个日期字符串, Controller方法使用日期类型接收,默认转换失败,报400错误
对日期类型,需要自定义转换器:
- 全局的日期转换器类,编写一个转换器类,在springMVC的配置文件进行配置
- 使用SpringMVC提供的日期转换注解,局部
方法一:全局的日期转换器类,编写一个转换器类,在springMVC的配置文件进行配置
1.实现接口
这个实现类交给spring管理 @Componnet
扫描这个包:
注册到注解驱动上
转换服务工厂bean ->
beans不用加扫描配置了 以及不用@Componnet了
添加一个bean
配置一个转换服务的工厂beanConversionServiceFactoryBean 需要在我们项目中导入这个依赖
这个类在spring-context-support
外部bean配置
内部bean配置
使用条件:只在外部bean内部使用或者需要其他地方使用
转换器此时已经注入到我们的转工厂服务bean 但是最终转换器是SpringMVC的前端控制器
它在请求参数传过来时,调用自己的conventer 把字符串转换为日期类型
下一步就是在SpringMVC的注解驱动上注册转换器服务 ConversionServiceFactoryBean
优点:整登项目只需要配置一次,整个项目的所有日期类型都可以通过该转换器
缺点:配置繁琐
方法二:使用SpringMVC提供的日期转换注解,局部
去掉
把请求参数的日期字符串转换为Date类型
自定义类类型 pojo
登录页面:login.jsp
java写一个User对象 而你前端表单提交的数据可以映射到我这个User对象对应的属性上去
SpringMVC帮助你创建对象
之前方法形参名要与前端的请求参数名一样,如果不一样会返回null 映射不成功 现在我要求不一样
如果请求参数名与形参名不一样 默认会映射失败 使用注解进行手动映射 @RequestParam 而且这个注释还必要要传值来进行映射 不然会报错(不同于之前的)
@RequestParam注解的属性
- name/value;请求参数名
- required:是否必须有这个参数,默认值: true,如果没有这个参数,报错,如果false,如果没有参数,不报错,参数值: null
- defaultValue:默认值
id不能重复 for的作用是关联id
表单里的数据,我不能一个一个的去接收 就会很麻烦
springmvc提供了对象类型->类类型
此时SpringMVC会自动的把请求参数名映射到对应的属性名上去了,要求请求参数名与属性名一样就行了
改一下css样式:
注册不能时get请求 密码啥的都暴露了 用post
集合类型
多个User对象
inti()方法报错:没有构造方法
mybatis当中含有的包装类型 -> vo(前端传过来的)
数据的接收 需要我们后台服务器经行一个数据的封装来对接
拿到数据users 然后调用service里的方法把数据添加到我们的数据了
以后开发中,批量修改和批量添加需要时,可以用到这个。
后台Controller,把集合属性封装到一个类中 作为该类的一个属性
数组类型:
批量删除,批量查询(根据一组id)