SpringMvc(二)- 请求处理参数 和 响应数据处理
1、请求处理参数
1.1 请求参数 @RequestParam
1.1.1 不使用 @RequestParam 注解
请求参数处理,不使用参数注解:
1.如果请求参数名和请求处理的形参名一致,springMvc 框架会自动将你的请求参数名对应的参数值,绑定到请求方法的形参中,方法内就可以直接使用,不用手动获取;
2.如果你的请求没有携带参数,不会报错,只不过,请求处理方法的形参值都是null或其他值,如果请求处理方法形参是一个实体参数,原理和单个类型参数一致(只要请求参数名和实体名一致也可以自动绑定);
测试不使用 @RequestParam 注解
@RequestMapping("/testSpringMvcNoRequestParam")
public String testSpringMvcNoRequestParam( String userId,String userName){
    System.out.println(String.format("------ 请求参数:uid :%s ,uname:%s------",userId,userName));
    return "success";
}
测试 请求不带参数

测试 请求带参数

1.1.3 使用 @RequestParam 注解
@RequestParam 只能写在请求方法的形参上;
required = false 设置参数不是必传;
defaultValue 默认值;
- 1.如果请求处理方法,形参前,只增加了此注解,没有指定任何属性:
- 作用:当前形参必传,且参数名与形参名必须一致,如果不一致,参数绑定失败,请求直接报400错误,提示你的参数没有提供;
 
 - 2.如果请求处理方法,形参前,只增加了此注解,并添加了value属性值:
- 作用:请求的参数名必须和value属性指定的名称一致,此value属性可以省略(只写 请求参数别名时,如果有其他的属性,value属性必须指定);
 
 - 3.如果要取消每个参数的必传校验,可以给此注解增加属性 required=false(默认是true,必传),参数可以不传,不需要参数值的绑定;
 - 4.如果某个参数必传,但是为了防止请求没有携带此参数,可以通过指定属性defaultValue增加默认值,如果调用当前请求方法处理,没有提供参数,自动使用默认值,绑定到方法的对应形参中;
 
测试
@RequestMapping("/testSpringMvcRequestParam")
public String testSpringMvcRequestParam(@RequestParam("uid") String userId,
                                        @RequestParam(value = "uname",required = false,defaultValue = "KH96-mvc") String userName,
                                        @RequestParam String userPwd){
    System.out.println(String.format("------ 请求参数:uid :%s ,uname:%s,uPwd:%s------",userId,userName,userPwd));
    return "success";
}
测试结果

1.2 请求头参数 @RequestHeader
请求头参数@RequestHeader:
- 处理请求头携带参数;
 - 作用:从请求头中获取参数,根据别名或者参数形参名,将请求头对应参数值,绑定到请求处理方法的形参中,直接使用,用法跟@RequestParam类似,也可以指定是否必传,默认值;
 
测试
@RequestMapping("/testSpringMvcNoRequestHeader")
public String testSpringMvcNoRequestHeader(@RequestHeader(value = "token",required = false,defaultValue = "KH96_mvc") String token){
    System.out.println(String.format("------ 请求头参数:token :%s ------",token));
    return "success";
}
测试结果

1.3 Cookie 参数 @CookieValue
@CookieValue:
从cookie中获取参数,根据别名或者参数形参名,将请求头对应参数值,绑定到请求处理方法的形参中,直接使用,用法跟@RequestParam,@RequestHeader类似,也可以指定是否必传,默认值;
测试
@RequestMapping("/testSpringMvcCookieValue")
public String testSpringMvcCookieValue(@CookieValue("JSESSIONID") String sessionId){
    System.out.println(String.format("------ 请求cookie参数:JSESSIONID :%s ------",sessionId));
    return "success";
}
测试结果:

1.4 实体参数
请求参数处理 实体参数:
自动将请求参数自动将实体的属性名与形参绑定,原理和单个参数类型一致;
测试
@RequestMapping("/testSpringMvcBeanParam")
public String testSpringMvcBeanParam(UserVO userVO){
    System.out.println(String.format("------ 请求实体参数:userVO :%s ------",userVO));
    return "success";
}
测试结果

1.5 原生servlet的API接口作为请求参数
用法和javaWeb截断学习的用法完全一致;
@RequestMapping("testSpringMvcServletAPI")
public  void testSpringMvcServletAIP(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws IOException, ServletException {
    //获取请求方式
    System.out.println(String.format("------ 请求方式:%s ------",request.getMethod()));
    //获取请求参数
    System.out.println(String.format("------ 请求参数:%s ------",request.getParameter("userTel")));
    //手动转发
    // request.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(request,response);
    //获取session对象
    //手动添加参数
    HttpSession sessionHad = request.getSession();
    //sessionHad.setAttribute("userTel",request.getParameter("userTel"));
    //方式2;直接将HttpSession对象声明在请求处理方法的形参中,可以自动获取 session
    //重定向到
    //        response.sendRedirect("http://www.baidu.com");
}
2、响应数据处理
2.1 ModelAndView
ModelAndView 的数据模型放在request的作用域中,视图模型,放在request.getRequestDispatcher(前缀+视图名字+后缀);
结论:SpringMVC框架的前端核心控制器,会自动将返回的ModelAndView对象中的数据模型,添加到request作用域中使用内部转发方式,转发到目标视图;
测试
@RequestMapping("/testSpringMvcModelAndView")
public ModelAndView testSpringMvcModelAndView(String userEmail){
    //创建一个 ModelAndView 对象
    ModelAndView mav = new ModelAndView();
    //添加模型数据
    mav.addObject("uemail",userEmail);
    //可以添加多个模型数据,内部使用ModelMap集合存放的
    mav.addObject("uage",18);
    //设置目标视图
    mav.setViewName("ok");
    //返回  ModelAndView 对象
    return  mav;
}
测试结果

2.2 Map
要求:使用map返回模型数据,必须将map声明在请求处理方法的形参中,定义在方法的内部是无效的;
总结:
- 1.springMVC底层在调用目标请求处理方法前,会自动创建一个Model接口的隐含对象作为模型数据的存储对象,如果目标请求处理方法定义了一个map接口,自动将隐含对象使用引用传递方式传递到目标请求处理方法中,方法体内就可以直接添加模型数据;
 - 2.SpringMvc底层,在调用完你的请求处理方法后,不管返回什么类型,都会被转换为一个ModelAndView对象;
 
测试
@RequestMapping("/testSpringMvcMap")
public  String testSpringMvcMap(String userEmail, Map<String,Object> map){
    //输出map的目标类型
    System.out.println(map.getClass().getName());
    //org.springframework.validation.support.BindingAwareModelMap
    //添加模型数据
    map.put("uemail",userEmail);
    //返回目标视图名称
    return "ok";
}
测试结果

2.3 Model
Model,可以添加模型数据;
必须将 Model 声明在请求处理方法的形参中,定义在方法的内部是无效的,用法跟Map 一致;
测试
@RequestMapping("/testSpringMvcModel")
public  String testSpringMvcModel(String userEmail, Model model){
    //添加模型数据
    model.addAttribute("uemail",userEmail);
    //返回目标视图名称
    return "ok";
}
测试结果

2.4 forward: 转发 和 redirect: 重定向
2.4.1forward 转发
只需要在返回的视图名称前,增加一个前缀:forward 即可,直接转发到目标资源;
当前请求处理方法中的模型对象可以带走;
@RequestMapping("/testSpringMvcForward")
public String testSpringMvcForward(Map<String,Object> map){
    //转发页面跳转
    //return "forward:/forward.jsp";
    //转发到其他请求中
    //return "forward:/testSpringMvcModel?userEmail=123@qq.com";
    //自定义转发,携带模型数据
    map.put("uaddr","nj_wd_kh96");
    return "forward:/testSpringMvcModel?userEmail=123@qq.com";
}
2.4.2 redirect 重定向
只需要在返回的视图名称前,增加一个前缀:redirect 即可,不做视图解析器,直接重定向
注意,重定向,当前请求处理方法中的模型对象不能带走
@RequestMapping("/testSpringMvcRedirect")
public String testSpringMvcRedirect(){
    //重定向页面跳转
    //return "redirect:/redirect.jsp";
    //重定向 可以重定向到 其他请求中
    return "redirect:/testSpringMvcModel?userEmail=123@qq.com";
}
2.5 @ResponseBody
返回JSON数据;
- 注意:返回不需要手动转换为json字符串,直接返回对象;
 - @ResponseBody 将返回请求处理方法返回的源对象数据,直接转换为json格式字符串,返回,不走视图解析;
 - 注意:必须增加Jackson依赖的jar包,否者报错,且必须要增加注解扫描<mvc:annotation-driven></mvc:annotation-driven> 才可以;
 - 位置:可以写在请求处理方法上或者类上,写在类上,就是对当前类中所有请求处理方法生效,写在方法上,只有对当前方法生效;
 
2.5.1 jar包
<!-- JSON begin -->
<!--jackson-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.4</version>
</dependency>
<!--jackson-->
<!-- JSON end -->
2.5.2 配置
<beans xmlns=
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
    <!-- 开启MVC 的注解扫描 -->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>
2.5.3 测试
@RequestMapping("/testSpringMvcJson")
@ResponseBody
public UserVO testSpringMvcJson(){
    //模拟获取去用户详情对象
    UserVO userVO = new UserVO();
    userVO.setUserId("KH96_01");
    userVO.setUserName("GKC");
    userVO.setUserPwd("123");
    return userVO;
}
测试结果

SpringMvc(二)- 请求处理参数 和 响应数据处理的更多相关文章
- 从零开始设计SOA框架(二):请求/响应参数的设计
		
每个接口都有请求参数.响应参数.其中请求参数分为公共参数和业务参数.响应参数分为两类:正常的响应参数.统一的错误参数 一.请求参数 1.公共参数:每个接口都有的参数,主要包含appkey.时间戳. ...
 - SpringMVC学习(二)———— 参数绑定
		
一.参数绑定 1.1.什么是参数绑定? 客户在浏览器端会提交一些参数到服务器端,比如用户的登录等,就会传username 和 password过来,springmvc则通过参数绑定组件将请求参数的内容 ...
 - SpringMVC请求参数和响应结果全局加密和解密
		
前提 前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景.为了模拟真实的交互场景,先定制一下整个交互流程.第三方传输(包括请求和响应)数据报文包括三个部分: 1.t ...
 - 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器
		
springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...
 - SpringMVC介绍及参数绑定
		
本节内容: SpringMVC介绍 入门程序 SpringMVC架构 SpringMVC整合MyBatis 参数绑定 SpringMVC和Struts2的区别 一.SpringMVC介绍 1. 什么是 ...
 - Spring系列  SpringMVC的请求与数据响应
		
Spring系列 SpringMVC的请求与数据响应 SpringMVC的数据响应 数据响应的方式 y以下案例均部署在Tomcat上,使用浏览器来访问一个简单的success.jsp页面来实现 Suc ...
 - springmvc的初始化参数绑定
		
一.springmvc的初始化参数绑定 此种和我们之前说的类型转换非常相似,可以看作是一种类型转换 在初始化参数绑定时 重要的是参数类型 -------------------单日期的绑定 二. 配 ...
 - Fiddler插件 --- 解密Elong Mapi请求参数及响应内容
		
当前问题: 在我们日常的Web/App测试过程中, Fiddler是一大辅助利器:在我们团队,也经常使用Fiddler进行App抓包测试. 艺龙 App使用的REST(内部称为Mapi)接口,在使用过 ...
 - 使用Typescript重构axios(十二)——增加参数
		
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
 
随机推荐
- MySQL-4-DDL
			
DDL:数据定义语言 创建create 创建库 语法:create database [if not exists]库名 # 创建库 CREATE DATABASE IF NOT EXISTS boo ...
 - Servlet 之 Http协议
			
请求消息数据格式 请求行 请求方式 请求url 请求协议或者版本 (GET /login.html HTTP/1.1) 请求头 请求头名称:请求头值 多个用逗号分隔 请求空行 空行分隔作 ...
 - CentOS7使用LVM缩减/home空间,扩大/空间
			
CentOS7使用LVM缩减/home空间,扩大/空间方法:把/home里的内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/文件系统.新建/home,恢复/home的原内容1.查看默认分区[ ...
 - 关于cpu体系架构的一些有趣的故事分享
			
从排查一次匪夷所思的coredump,引出各种体系架构的差异. 本文中的所有内容来自学习DCC888的学习笔记或者自己理解的整理,如需转载请注明出处.周荣华@燧原科技 1 背景 从全世界有记载的第一台 ...
 - Qt+ECharts开发笔记(三):ECharts的柱状图介绍、基础使用和Qt封装Demo
			
前言 上一篇成功是EChart随着Qt窗口变化而变化,本篇将开始正式介绍柱状图介绍.基础使用,并将其封装一层Qt. 本篇的demo实现了隐藏js代码的方式,实现了一个条形图的基本交互方式,即Qt ...
 - NFS介绍与搭建
			
一.NFS的介绍 1.1.什么是NFS NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布. NFS在文件传 ...
 - java面试题(2022最新)
			
1.String是基本数据类型么?不是基本数据类型,byte int char long flout duable boolem short 2.int 和integer区别int是基本数据类型,in ...
 - 5-7 分页查询PageHelper
			
1. PageHelper实现分页查询 Day08 1.1 PH作用: PageHelper框架可以实现我们提供页码和每页条数, 自动实现分页效果,收集分页信息 1.2 PH原理: PageHelpe ...
 - 没错,请求DNS服务器还可以使用UDP协议
			
目录 简介 搭建netty客户端 在netty中发送DNS查询请求 DNS消息的处理 总结 简介 之前我们讲到了如何在netty中构建client向DNS服务器进行域名解析请求.使用的是最常见的TCP ...
 - React + Antd Menu组件实现菜单树
			
准备好两个变量,一个用来保存平级菜单列表,一个用来保存遍历后的菜单树. 推荐后端返回平级菜单树,假如菜单比较多,可以直接结合find方法找到菜单,做搜索功能很省事. const [menuList, ...