SpringMvc-|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"; }

测试 请求不带参数
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

测试 请求带参数
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

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 = "https://www.it610.com/article/uname",required = false,defaultValue = "https://www.it610.com/article/KH96-mvc") String userName, @RequestParam String userPwd){System.out.println(String.format("------ 请求参数:uid :%s ,uname:%s,uPwd:%s------",userId,userName,userPwd)); return "success";

测试结果
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

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

测试结果
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

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"; }

测试结果:
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

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

测试结果
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

1.5 原生servlet的API接口作为请求参数
用法和javaWeb截断学习的用法完全一致;
@RequestMapping("testSpringMvcServletAPI") publicvoid 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");

}
//获取请求方式 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 对象 returnmav; }

测试结果
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

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

测试结果
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

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

测试结果
SpringMvc-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

2.4 forward: 转发 和 redirect: 重定向
2.4.1forward 转发 只需要在返回的视图名称前,增加一个前缀:forward 即可,直接转发到目标资源;
当前请求处理方法中的模型对象可以带走;
@RequestMapping("/testSpringMvcForward") public String testSpringMvcForward(Map 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包 ,否者报错,且必须要增加注解扫描 才可以;
  • 位置:可以写在请求处理方法上或者类上,写在 类上 ,就是对当前类中 所有请求处理方法生效 ,写在方法上,只有对 当前方法生效 ;
2.5.1 jar包
com.fasterxml.jackson.core jackson-core 2.8.4 com.fasterxml.jackson.core jackson-databind 2.8.4 com.fasterxml.jackson.core jackson-annotations 2.8.4

2.5.2 配置

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-|SpringMvc- 请求处理参数 和 响应数据处理
文章图片

    推荐阅读