本文共 7107 字,大约阅读时间需要 23 分钟。
Spring MVC 通过分析处理方法的签名,HTTP请求信息绑定到处理方法的相应人参中。
Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。
必要时可以对方法及方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader 等)、
Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。
在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法
value:参数名
required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
defaultValue: 默认值,当没有传递参数时使用该值
① 增加控制器方法
/** * @RequestParam 注解用于映射请求参数 * value 用于映射请求参数名称 * required 用于设置请求参数是否必须的 * defaultValue 设置默认值,当没有传递参数时使用该值 */@RequestMapping(value="/testRequestParam")public String testRequestParam(@RequestParam(value="username") String username,@RequestParam(value="age",required=false,defaultValue="0") int age){ System.out.println("testRequestParam - username="+username +",age="+age); return "success";}
②增加页面链接
testRequestParam
使用 @RequestHeader 绑定请求报头的属性值
请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中
//了解: 映射请求头信息 用法同 @RequestParam@RequestMapping(value="/testRequestHeader")public String testRequestHeader(@RequestHeader(value="Accept-Language") String al){ System.out.println("testRequestHeader - Accept-Language:"+al); return "success";}
testRequestHeader
使用 @CookieValue 绑定请求中的 Cookie 值
@CookieValue 可让处理方法入参绑定某个 Cookie 值
①增加控制器方法
//了解:@CookieValue: 映射一个 Cookie 值. 属性同 @RequestParam@RequestMapping("/testCookieValue")public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) { System.out.println("testCookieValue: sessionId: " + sessionId); return "success";}
②增加页面链接
testCookieValue
使用 POJO 对象绑定请求参数值
Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel 等
增加控制器方法
/** * Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。 * 支持级联属性 * 如:dept.deptId、dept.address.tel 等 */@RequestMapping("/testPOJO")public String testPojo(User user) { System.out.println("testPojo: " + user); return "success";}
表单页面
②增加实体类
③执行结果
④如果中文有乱码,需要配置字符编码过滤器,且配置其他过滤器之前,如(HiddenHttpMethodFilter),否则不起作用。(思考method=”get”请求的乱码问题怎么解决的)
encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter /*
HttpServletRequest HttpServletResponse HttpSession **java.security.Principal** **Locale** **InputStream** **OutputStream** **Reader** **Writer**
/*** * SpringMVC可以直接在参数上写原生API * * HttpServletRequest * HttpServletResponse * HttpSession * * java.security.Principal * Locale:国际化有关的区域信息对象 * InputStream : * httpServletRequest.getInputStream(); * OutputStream : * httpServletResponse.getOutputStream(); * Reader : * httpServletRequest.getReader(); * Writer : * httpServletResponse.getWriter(); * */ @RequestMapping("/handle03") public String handle03 (HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ httpServletRequest.setAttribute("reqParam","我是请求域中的"); httpSession.setAttribute("sessionParam","我是session域中的"); return "success"; }
提供了以下几种途径输出模型数据:
ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
Map及Model: 入参为 org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
@SessionAttributes: 将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性
@ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中
① 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
② 添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map<String, ?> modelMap)
③ 设置视图:
void setView(View view)
void setViewName(String viewName)
增加控制器方法:
//返回值是ModelAndView,可以为页面携带数据 @RequestMapping("/handle04") public ModelAndView handle04(){ //之前的返回值我们就叫视图名;视图名视图解析器是会帮我们最终拼串得到页面真实地址// ModelAndView mv = new ModelAndView("success0"); ModelAndView mv = new ModelAndView(); mv.setViewName("success0"); mv.addObject("msg","嗨起来"); return mv; }
页面链接:
handle04
成功页面,显示数据
requestScope:${requestScope.msg}
**Spring MVC** **在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器**。
**如果方法的入参为 Map** **或 Model** **类型**,Spring MVC 会将隐含模型的引用传递给这些入参。
3) 在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据
控制器方法
//目标方法的返回类型也可以是一个Map类型参数(也可以是Model,或ModelMap类型)@RequestMapping("/testMap")public String testMap(Mapmap){ //【重点】 System.out.println(map.getClass().getName()); //org.springframework.validation.support.BindingAwareModelMap map.put("names", Arrays.asList("Tom","Jerry","Kite")); return "success";}
页面链接
testMap
显示结果
names: ${requestScope.names }
结果截图
测试参数类型:
//目标方法的返回类型也可以是一个Map类型参数(也可以是Model,或ModelMap类型)@RequestMapping("/testMap2")public String testMap2(Mapmap,Model model,ModelMap modelMap){ System.out.println(map.getClass().getName());map.put("names", Arrays.asList("Tom","Jerry","Kite"));model.addAttribute("model", "org.springframework.ui.Model");modelMap.put("modelMap", "org.springframework.ui.ModelMap"); System.out.println(map == model);System.out.println(map == modelMap);System.out.println(model == modelMap); System.out.println(map.getClass().getName());System.out.println(model.getClass().getName());System.out.println(modelMap.getClass().getName()); /*truetruetrueorg.springframework.validation.support.BindingAwareModelMaporg.springframework.validation.support.BindingAwareModelMaporg.springframework.validation.support.BindingAwareModelMap */ return "success";}
Map、Model、ModelMap、BindingAwareModelMap之间的关系:
推荐使用Map,便于框架移植
若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes, Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。
@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
如果满足类型或者value值,则会在session域中也存放一份设置的键值对
例如:
① @SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
② @SessionAttributes(value={“user1”, “user2”})
③ @SessionAttributes(types={User.class, Dept.class})
④ @SessionAttributes(value={“user1”, “user2”}, types={Dept.class})
@Controller//@SessionAttributes("user")@SessionAttributes(value={ "user"},types={ String.class})public class SpringMVCController { /** * @SessionAttributes * 除了可以通过属性名指定需要放到会话中的属性外(实际上是通过value指定key值), * 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上是通过types指定类型) * 注意:只能放在类的上面,不能修饰方法 */@RequestMapping("/testSessionAttributes")public String testSessionAttributes(Mapmap){ User user = new User("Tom","123","tom@atguigu.com",22); map.put("user", user); map.put("school", "atguigu"); //默认是被存放到request 域,如果设置了@SessionAttribute注解,就同时存放到session域中 return "success"; }}
testSessionAttributes
转载地址:http://ucoq.baihongyu.com/