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");
}
//获取申请形式
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");
}</pre>
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;
}
测试后果
发表回复