请求参数类型

 

客户端请求参数的格式是: name=value&name=value... ... 服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:

1、基本类型参数

2、POJO类型参数

3、数组类型参数

4、集合类型参数

 

我们下面会逐个来学习

 

请求参数类型

 

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配

例如http:localhost:8080/user/quick10?username=zhangsan&age=12。如果我们想获得username=zhangsan&age=12这个参数,如何获取呢,如下 在Controller中写一个带两个参数的方法

 

获得POJO类型参数

 

Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配

例如http:localhost:8080/user/quick11?username=zhangsan&age=12。如果我们想username=zhangsan&age=12这个参数放到一个类(实体类)里,如下

 

获得数组类型参数

 

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配

例如http:localhost:8080/user/quick12?strs=111&strs=222&strs=333。如果我们想把111,222,333放到数组(数组名叫strs)里,怎么实现呢,如下

 

获得集合类型参数

 

获得集合参数时,要将集合参数包装到一个POJO中才可以

首先先新建一个VO类和一个form.jsp页面来实现表单提交,要求提交的数据是集合类型的,原因是我们要把集合封装到一个VO对象里面,这样客户 端的数据才能封装到VO对象的集合里面。然后如下

 

获得集合类型参数2

 

如何把集合直接封装到方法的形参位置呢

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据,而无需用上面的POJO来帮 我们进行二次封装,直接一步搞定

首先我们需要一个ajax.jsp页面、一个js目录里面放一个jQuery文件(因为ajax需要用到jquery),最后在spring.mvc解决静态资源引用权限问题。然后如下

 

 

静态资源访问的开启

 

为什么上面会找不到jquery文件的位置,原因: 由于前端控制器的配置,SpringMVC的前端控制器是一个DispatcherServlet,我们在一开始的web.xml中 就已经配置过前端控制器,其中的url-pattern标签表示缺省的Servlet,会去DispatcherServlet进行虚拟路径匹配,匹配UserController类中的 RequestMapping注解的资源,由于RequestMapping里面找不到jquery文件的资源,匹配不上就访问不了jquery文件。

解决就是在spring-mvc里面引入静态资源(jquery-3.3.1.js)文件的权限问题

代表在springMVC框架中开放对某些资源的访问权限,一般来说是静态资源

 

当我们后期在webapp目录下,又要新建一个img目录用来存放图片,那么我们需要在spring-mvc里面多写入如下

注意mapping是我们资源的地址,location是资源所在的目录

 

但是上面那种解决方法比较不方便,当静态资源增多时,需要额外写多个<mvc:resources mapping="/xxx/**" location="/xxx/"/> 我们可以使用下面那种简单的,如下

上面那行表示在访问我(服务器)的资源时,springmvc会帮忙找对应的匹配地址,找不到就交由原始容器(Tomcat)的内部机制来寻找资源

也就是这两种方式都可以让自己的静态资源被访问到

 

解决请求数据的乱码问题 -- 配置全局乱码过滤器

 

当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。在web.xml里面写入如下:

 

参数绑定的注解@requestParam -- 基本使用

 

当请求的名称与Controller的业务方法参数名称不一致时,就需要通过@requestParam注解,显示的去绑定新参数与原参数的关系

 

参数绑定的注解@requestParam -- 详细使用

 

上面我们没有使用相关参数,只是简单使用一下。其实注解@requestParam有如下参数可以使用:

1、value: 与请求参数名称

2、required: 此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数报错

3、defaultValue: 当没有指定请求参数时,则使用指定的默认值赋值

 

获取Restful风格的参数

 

Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风 格设计的软件可以更简洁,更有层次,更易于实现缓存机制等

Restful风格的请求是使用 "url+请求方式" 表示一次请求目的,HTTP协议里面四个表示操作方式的动词如下:

1、GET: 用于获取资源

2、POST: 用于新建资源

3、PUT: 用于更新资源

4、DELETE: 用于删除资源

 

例如:

1、/user/1 GET: 表示得到id=1的user

2、/user/1 DELETE: 表示删除id=1的user

3、/user/1 PUT: 表示更新id=1的user

4、/user POST: 表示新增user

 

上述例子的url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对 应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。如下

 

 

自定义类型转换器

 

SpringMVC框架内部已经定义好的一些类型转换器

1、SpringMVC默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置

2、但是不是所有的数据类型都提供了转换器,我们可以自定义我们需要的转换器,例如:日期类型的数据就需要自定义转换器

 

自定义类型转换器的开发步骤:

1、定义转换器类,并实现Converter接口,重写方法

2、在配置文件(spring-mvc.xml)中声明转换器

3、在中引用转换器

 

具体过程:

 

第一步: 首先新建一个目录converter,在里面新建一个类DateConverter,里面写入如下:

 

第二步: 在spring-mvc.xml里面写入如下:

 

验证如下:

 

获得Servlet相关API

 

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:

1、HttpServletRequest

2、HttpServletResponse

3、HttpSession

 

获得请求头信息1

 

使用@RequestHeader注解可以获得请求头信息,相当于web阶段学习的request.getHeader(name)

@RequestHeader注解的属性如下:

1、value: 请求头的名称

2、required: 是否必须携带此请求头

 

 

获得请求头信息2

 

@RequestHeader注解可以获取到'Cookie: JSESSIONID=02D1B44226370E7A72C479848577D443',如果我们只需要JSESSIONID后面的值呢,可以使用下面的@CookieValue注解,可以专门获取JSESSIONID后面的值。JSESSIONID是Cookie的名字,JSESSIONID的值是Cookie的值。使用@CookieValue可以获得指定Cookie的值

 

@Cookie注解的属性如下:

1、value: 指定cookie的名称

2、required: 释放必须携带此cookie