接收 客户端发送的 请求— 获取参数
以前的技术: request对象获取参数
返回 服务器端响应给 客户端的各种类型的数据 — 响应 与 跳转
跳转:
之前: 转发 或 重定向
响应数据:
Jsp: 存入域对象
Html: json
这两个的区别就是看有没有@ResponseBody,这个注解就是告诉springMvc不进行页面跳转,而是直接进行数据返回。
直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。
注意:
默认是转发 forward:
return “success”;
return “forward:/jsp/success.jsp”;
重定向需要单独指定:
return “redirect:/success.jsp”;
在Controller中方法返回ModelAndView对象,并且设置视图名称
在Controller中方法形参上直接声明ModelAndView,无需在方法中自己创建,在方法中直接使用该对象设置视图,同样可以跳转页面
注意:
以上三种方式, 最终数据都是存入了request域对象!
方式一:通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void;
方式二:将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回
手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换成json格式的字符串,我们可以使用web阶段学习过的json转换工具jackson进行转换,通过jackson转换json格式字符串,回写字符串
**导入所需的Jackson依赖:
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.9.0version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.0version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.9.0version>
dependency>
通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置:
在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,
因此,我们可以使用mvc的注解驱动代替上述配置
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使用
可用在Spring-mvc.xml配置文件中使用
同时使用
** Spring-mvc.xml 必配:
注解扫描
三大组件
客户端请求参数的格式是:name=value&name=value……
服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动做类型转换;
自动的类型转换是指从String向其他类型的转换
Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
获得集合参数时,要将集合参数包装到一个POJO中才可以。
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装
<script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js">script>
<script>
var userList = new Array();
userList.push({username:"zhangsan",age:18});
userList.push({username:"lisi",age:28});
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/user/quick15",
data:JSON.stringify(userList),
contentType:"application/json;charset=utf-8"
});
script>
** 将请求的json字符串, 反序列化为 对象! — 相当于 objectMpper.readValue()
List <-- > [{},{}]
User <–> {}
一般来说, 这两个注解, 与异步交互时相关(ajax)
@ResponseBody相当于:
ObjectMapper mapper = new ObjectMapper();
//并且传递给客户端
mapper.writeValue(response.getWriter(),user);
@RequestBody相当于:
Mapper.readValue(json,class)
当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件!
原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作。
当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
注意:
以上是解决了 post请求乱码! 没有解决get请求(tomcat解决了) tomacat8之后就解决了get请求乱码问题
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
注解@RequestParam参数:
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。
Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
例如:
常规的做法:
restFul风格:
/user/1 GET : 得到 id = 1 的 user
/user/1 DELETE: 删除 id = 1 的 user
/user/1 PUT: 更新 id = 1 的 user
/user/1 POST: 新增 user
上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。
地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。
在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
·常见运用:
SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。(String转换为Date)
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:
作为形参传入即可使用, 使用方式和之前web阶段时,一模一样!
使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
@RequestHeader属性:
使用@CookieValue可以获得指定Cookie的值
@CookieValue属性:
value:指定cookie的名称
required:是否必须携带此cookie