请求参数处理,不使用参数注解:
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"; }
测试 请求不带参数
测试 请求带参数
@RequestParam 只能写在请求方法的形参上;
required = false 设置参数不是必传;
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"; }
测试结果
请求头参数@RequestHeader:
测试
@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"; }
测试结果
@CookieValue:
从cookie中获取参数,根据别名或者参数形参名,将请求头对应参数值,绑定到请求处理方法的形参中,直接使用,用法跟@RequestParam,@RequestHeader类似,也可以指定是否必传,默认值;
测试
@RequestMapping("/testSpringMvcCookieValue") public String testSpringMvcCookieValue(@CookieValue("JSESSIONID") String sessionId){ System.out.println(String.format("------ 请求cookie参数:JSESSIONID :%s ------",sessionId)); return "success"; }
测试结果:
请求参数处理 实体参数:
自动将请求参数自动将实体的属性名与形参绑定,原理和单个参数类型一致;
测试
@RequestMapping("/testSpringMvcBeanParam") public String testSpringMvcBeanParam(UserVO userVO){ System.out.println(String.format("------ 请求实体参数:userVO :%s ------",userVO)); return "success"; }
测试结果
用法和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"); }
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; }
测试结果
要求:使用map返回模型数据,必须将map声明在请求处理方法的形参中,定义在方法的内部是无效的;
总结:
测试
@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"; }
测试结果
Model,可以添加模型数据;
必须将 Model 声明在请求处理方法的形参中,定义在方法的内部是无效的,用法跟Map 一致;
测试
@RequestMapping("/testSpringMvcModel") public String testSpringMvcModel(String userEmail, Model model){ //添加模型数据 model.addAttribute("uemail",userEmail); //返回目标视图名称 return "ok"; }
测试结果
只需要在返回的视图名称前,增加一个前缀: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"; }
只需要在返回的视图名称前,增加一个前缀:redirect 即可,不做视图解析器,直接重定向
注意,重定向,当前请求处理方法中的模型对象不能带走
@RequestMapping("/testSpringMvcRedirect") public String testSpringMvcRedirect(){ //重定向页面跳转 //return "redirect:/redirect.jsp"; //重定向 可以重定向到 其他请求中 return "redirect:/testSpringMvcModel?userEmail=123@qq.com"; }
返回JSON数据;
<!-- 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 -->
<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>
@RequestMapping("/testSpringMvcJson") @ResponseBody public UserVO testSpringMvcJson(){ //模拟获取去用户详情对象 UserVO userVO = new UserVO(); userVO.setUserId("KH96_01"); userVO.setUserName("GKC"); userVO.setUserPwd("123"); return userVO; }
测试结果