文章目录
获得基本参数类型
什么是基本参数类型?即最基本的数据类型,如字符型,整形…
在获取用户基本请求参数中,请求的参数只要和对应方法的形参能对应起来。"对应"的意思是:参数类型,和参数名称,和参数个数,都必须一样。那么,请求的参数值会无误的自动注入到方法的形参中,但是如果只名称对应也能注入,此时数据类型会自动转换,而且可能会出问题
有一点需要解释一下,这里不对应起来也不会报错,但是注不进去,但是!某些时候参数没有对应起来,会报错,就比如形参里有整形,则整形的必须要注入
参数名:页面中收集参数标签的name属性参数名:页面中收集参数标签的name属性
最重要的是参数对应起来
获得POJO类型的参数,即通过请求参数构建对象
前面说过,我们把我们编写的MVC中的后端控制器称为POJO,其实POJO就是简单的JavaBean。
这里,获取POJO类型的参数的解释:
获得用户传递过来的参数,并让MVC把它封装到我们的实体类中。
再进一步解释,假设我们想用用户传递过来的参数来初始化一个对象,我们就可以让MVC把参数直接封装到我们想要的对象中。
参数名:页面中收集参数标签的name属性
获得数组类型参数
即,用户有多个请求参数,然后参数名(参数名:页面中收集参数标签的name属性)都一样,那么其实他传递过来的就是一个数组,我们需要用数组进行接收。
方法:
就跟获得获得基本参数类型差不多,不多这里的形参需要是数组
参数名:页面中收集参数标签的name属性
获得集合参数类型(类型可为对象)
集合的特殊性,我们不能直接注入,我们需要一种间接的方式
通过对象的属性来注入:
我们先创建一个对象,为他设置一个对应类型集合的属性一般干这种事的我们把这种类起名为VO
然后这是集合中存放的类:我们要做的就是利用前台传入的参数创建并或得由多个Use对象组成的List集合
然后看我们的后端控制器:
我们把我们创建的类放进去,所以,这里就等于是"获得POJO类型的参数,即通过请求参数构建对象"这一步的东西了
然后,我们通过前端来向VO类中传入数据来构建List
我们要把对应的参数值传入对应的位置,那么我们就需要在获取参数上动手脚,看前端:name的值首先前面部分得和VO类中集合属性的名一样,然后这里的List集合有下标,我们可以通过下标控制是向集合中添加哪个数据,然后因为其内容存的是Use对象,对象也有属性,就可以通过.属性名
的方式来构建具体对象的值
看效果:
这里有个问题,post提交中文这里的后台可能出现乱码
解决MVC中Post提交表单出现乱码
在web.xml配置文件中加上如下内容:
<filter>
<filter-name>springUtf8Encoding</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>springUtf8Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
即可
获得集合参数的第二种方式
这里,我们在一种特殊的情况下,我们直接在servlet中用集合的形参去接收前端返回回来的集合
当使用ajax提交时,可以cnentype为Json形式,那么在方法参数位置使用@RequestBody
注意和(@ReSponseBody区分开)可以直接接收集合数据而无需使用POJO进行包装。
前端部分:
后端控制器部分:注意这里的@RequestBody的放置位置
结果:
出现无法访问到静态资源(如Jq的文件)的问题
问题原因:
我们这是MVC程序,这里配置的核心控制器下面是缺省"/",即表示所有的请求都会过这里,让这里进行处理,然后我们设置的静态资源的路径也会被当成@RequestMapping
的映射地址来处理,自然找不到
解决方法:
在MVC的配置文件中加上这一句:<mvc:resources location="/静态资源所在的路径/" mapping="/静态资源所在的路径/**" />
,这里他的作用就是开放资源的访问
即可,如果还有问题,可以这样:
选择Idea中的这个地方,对项目进行重构一下,基本就可以了。
简直要气死人,我的这里,我以为代码问题,浪费我一个小时的时间,淦
更建议的解决方式:
或者:不加上面的东西,只在MVC配置文件中加一个<mvc:default-servlet-handler/>
,表示如果MVC找不到资源,则交由原框架来找寻,我们这里的原框架就是Tomcat
参数绑定的注解
参数绑定,作用:
如果得到的参数名称和我们形参中的参数名称不一样,但是我们又想把得到的参数值注入到形参中,我们就可以使用参数绑定的注解@RequestParam
他可以有三个参数:
value: 与请求参数名称
required:此在指定的请求参数是否必须包括。默认是true,提交时如果没有此参数则报错(请求的时候必须包含此项参数)。如果设置为false,则可以不包含
defaultValue: 当没有指定请求参数时,则使用指定的默认值赋值,当这里设置了值,则required的值就默认使用false
获得Restful风格的参数
Restful风格简单介绍:
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。 主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。
Restful风格的请求是使用“url+ 请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
GET:用于获取资源
POST:用于新建资源
PUT:用于更新资源
DELETE:用于删除资源
如:
例如:
/use/1 GET: 得到id= 1的user
/user/1 DELETE: 删除id=1的user
/user POST: 新增user
/user/1 PUT: 更新id= 1的user
这里请求的路径,后面直接跟着参数值。所以,我们设置映射url,就需要后面写一个占位符,用来接收值
然后,在形参的地方,用@PathVariable
来绑定参数,value的值需要和占位符地方的参数名一致
自定义类型转换器
这里简单记录一下。
我们在前端页面向后台传递的参数值,都是以字符串的形式传递到后端,但是我们可以看到我们定义的整形的参数,也可以接受到前端页面传递的整形的参数。这是因为MVC会将我们前端的某些字符进行初步类型转换。SpringMVC默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
自定义类型转换器的开发步骤:
- 定义转换器类实现Converter接口
- 在配置文件中声明转换器
- 在中引用转换器
我们这里记录一下自定义一个Date类型的数据转换作为例子:
这里是我们的servlet,渴望得到一个Date类型的数据
- 定义转换器类实现Converter接口:
- 在配置文件中声明转换器:
- 在中引用转换器:
结果:
获得servlet中常用的API(Request,Response的)
这里非常简单,对于框架,为我们需要什么常用的的对象,MVC都会自动帮我们创建
我们只需要在形参中写一下即可,如下:
直接形参传入,就可直接使用,MVC看到我们需要,则会自动帮我们在这里注入这些常用的东西
获取请求头
这里仅记录两个常用的。
主要靠注解来实现:
- 获取普通的请求头信息:
使用@RequestHeader可以获得请求头信息
@RequestHeader注解的属性如下:
value:请求头的名称(请求头中的信息也是由键值对组成,这里的名称指的是其中的键)
required:是否必须携带此请求头(为true,则访问此servlet则必须带着为此名称的请求头信息,否则报错) - 获得 请求头中Cookie的信息:
使用:@CookieValue实现,Cookie在请求头中比较特殊,Cookie的值也是一个键值对,所以需要另外他专有的注解来实现
它也有两个属性
value:名称(Cookie中的信息也是由键值对组成,这里的名称指的是其中的键)
required:是否必须携带此请求头(为true,则访问此servlet则必须带着为此名称的请求头信息,否则报错)