SpringMVC学习02_数据响应与请求

1.今日内容介绍

  • SpringMVC的数据响应
  • SpringMVC获得请求数据

接收 客户端发送的 请求— 获取参数
以前的技术: request对象获取参数

返回 服务器端响应给 客户端的各种类型的数据 — 响应 与 跳转
跳转:
之前: 转发 或 重定向
响应数据:
Jsp: 存入域对象
Html: json

1.1. 数据响应方式

1) 页面跳转

  • 直接返回字符串
  • 通过ModelAndView对象返回

2) 回写数据

  • 直接返回字符串
  • 返回对象或集合

这两个的区别就是看有没有@ResponseBody,这个注解就是告诉springMvc不进行页面跳转,而是直接进行数据返回。

2.SpringMVC的数据响应

2.1. 页面跳转-返回字符串形式

直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。
在这里插入图片描述

注意:
默认是转发 forward:
return “success”;
return “forward:/jsp/success.jsp”;

重定向需要单独指定:
return “redirect:/success.jsp”;

2.2. 页面跳转-返回ModelAndView形式1

在Controller中方法返回ModelAndView对象,并且设置视图名称
在这里插入图片描述

2.3. 页面跳转-返回ModelAndView形式2

在Controller中方法形参上直接声明ModelAndView,无需在方法中自己创建,在方法中直接使用该对象设置视图,同样可以跳转页面
在这里插入图片描述

2.4. 页面跳转-返回ModelAndView形式3

在这里插入图片描述

注意
以上三种方式, 最终数据都是存入了request域对象!

2.5. 回写数据-直接回写字符串

方式一:通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void;

方式二:将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回

在这里插入图片描述

2.6. 回写数据-直接回写json格式字符串

在这里插入图片描述

手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换成json格式的字符串,我们可以使用web阶段学习过的json转换工具jackson进行转换,通过jackson转换json格式字符串,回写字符串
在这里插入图片描述

**导入所需的Jackson依赖:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.0</version>
</dependency>

2.7. 回写数据-返回对象或集合

通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置:
在这里插入图片描述

2.8. 回写数据-返回对象或集合2

在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,
因此,我们可以使用mvc的注解驱动代替上述配置

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。

使用<mvc:annotation-driven />自动加载 RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),
可用在Spring-mvc.xml配置文件中使用<mvc:annotation-driven />替代注解处理器和适配器的配置。
同时使用<mvc:annotation-driven />默认底层就会集成jackson进行对象或集合的json格式字符串的转换

** Spring-mvc.xml 必配:
注解扫描
三大组件
在这里插入图片描述

3.SpringMVC的请求

3.1. 请求参数类型

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

  • 简单类型: string + 基本类型参数
  • POJO类型参数
  • 数组类型参数
  • 集合类型参数

3.2. 获得简单数据类型参数(string + 基本类型)

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动做类型转换;
自动的类型转换是指从String向其他类型的转换
在这里插入图片描述在这里插入图片描述

3.3. 获得POJO类型参数

Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4. 获得数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
在这里插入图片描述
在这里插入图片描述

3.5. 获得集合类型参数1

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6. 获得集合类型参数2

当使用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 <–> {}

小结:

  • @RequestBody注解 可以将请求体中的参数,发送到服务器的json格式数据封装到参数中 — 接收参数: json转对象
    —用于post请求! (get没有请求体)
  • @ResponseBody注解 可以将方法返回的对象转化为json格式数据响应给客户端 — 响应时: 对象转json

一般来说, 这两个注解, 与异步交互时相关(ajax)

@ResponseBody相当于:

		ObjectMapper mapper = new ObjectMapper();
        //并且传递给客户端
        mapper.writeValue(response.getWriter(),user);

@RequestBody相当于:

		Mapper.readValue(json,class)

3.7. 静态资源访问的开启 – mvc.xml

当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件!
原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作。

我们可以通过以下两种方式指定放行静态资源:
在这里插入图片描述

3.8. 配置全局乱码过滤器 – web.xml

当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。

<!--配置全局过滤的filter-->
<filter>
    <filter-name>CharacterEncodingFilter</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>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注意:
以上是解决了 post请求乱码! 没有解决get请求(tomcat解决了) tomacat8之后就解决了get请求乱码问题

3.9. 参数绑定注解@RequestParam

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
在这里插入图片描述
注解@RequestParam参数:

  1. value:与请求参数名称
  2. required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错(给了defaultValue就不会报错)
  3. defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

3.10. Restful风格的参数的获取

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

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

  • GET:用于获取资源
  • POST:用于新建资源
  • PUT:用于更新资源
  • DELETE:用于删除资源

例如:

常规的做法:
在这里插入图片描述
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注解进行占位符的匹配获取工作。

在这里插入图片描述

·常见运用:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.11. 自定义类型转换器 – mvc.xml

SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。(String转换为Date)
在这里插入图片描述
在这里插入图片描述

3.12. 获得Servlet相关API

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

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession

作为形参传入即可使用, 使用方式和之前web阶段时,一模一样!

在这里插入图片描述

3.13. 获得请求头信息

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

@RequestHeader属性:

  • value:请求头的名称
  • required:是否必须携带此请求头
    在这里插入图片描述

使用@CookieValue可以获得指定Cookie的值

@CookieValue属性
value:指定cookie的名称
required:是否必须携带此cookie

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值