第五章 响应数据传出
springmvc前端控制器是一个servlet 不是一个filter
request 用完就销毁了 效率高
提供了以下几种途径输出模型数据:
可以在方法处传入Map 或者Model或者ModelMap 给这些参数里面保存的所有数据都会放在域中,可以在页面获取
研究为什么会放在request中
Map、Model、ModelMap 最终都是BindingAwareModelMap在工作 相当于给BindingAwareModelMap中保存的东西保存放在请求域中
Map(interface(jdk))
Model 独立spring接口
ModelMap(class) <----是Map下面的class
BindingAwareModelMap
ExtendedModelMap
- Map 及 Model: 入参为 org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。request:${requestScope.msg}《br> session:${sessionScope.msg}《br> Application:${ApplicationScope.msg}《br> pageContext:${pageScope.msg}《br> Map的数据放在request中 @RequestMapping("requ") public String getBook(Map<String,String> map) { map.put("msg","你好"); return "hello"; }
@RequestMapping("requ") public String getBook(Model model) { model.addAttribute("msg","你好"); return "hello"; } 效果同上
@RequestMapping("requ") public String getBook(ModelMap modelmap) { modelmap.addAttribute("msg","你好"); return "hello"; }
ModelAndView : View就是我们要访问的页面 放在请求域中 request
- ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
- 方法的返回值可以变为ModelAndView类型 既包含视图信息(页面地址)也包含模型数据(给页面带的数据)而且数据是放在请求域中
@RequestMapping("requ") public ModelAndView getBook() { ModelAndView modelview = new ModelAndView(); modelview.addObject("msg", "aha"); modelview.setViewName("hello"); return modelview; } ModelAndView modelview = new ModelAndView("hello"); 之前的返回值 我们叫做视图名 视图名解析器是会帮我们最终拼串得到真实的真实地址
@SessionAttributes: 将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性 由springmvc提供 只能标志在类上
@SessionAttributes(只能标在类上),@SessionAttributes(value-"msg") 给BindingAwareModelMap中保存的数据,同时给session中放一份,value指定保存数据是要给session中放的数据的key
后来推荐@SessionAttributes就别用了 ,可能引发异常:给session中放数据使用原生API@SessionAttributes(value= {"msg","hah"},types = {String.class}) //types只要是String类型 通通都放倒里面去 @Controller public class MyController { @RequestMapping("requ") public ModelAndView getBook() { ModelAndView modelview = new ModelAndView(); modelview.addObject("msg", "aha"); modelview.setViewName("hello"); return modelview; } } ${sessionScope.hah} 都是String 通过Types来设置String类型
@ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中 Mybatis后被低落
业务场景 代码:对象的变量存在null 会导致修改到数据库 改值为null mybatis会更新动态sql语句@RequestMapping("requ") /* * 实际上书名是不允许改的 所以前端传过来的书名为null 不存在的字段不要在sql语句中 (但会出现多余的",") * 考虑不是mybatis的动态sql * springMVC 会直接在参数位置来写Book对象 自动粉装 没有带的值为null * * 解决sql都是全字段 但又是对象可能会缺乏某些值 * 先从数据库提取出来数据 ,然后将前端发送过来的数据覆盖到数据库读取的数值上 避免某些字段存在null值 * 这种效果也就是@ModelAttribute */ public String getBook(Book book) { System.out.println(book); String sql = "update bs_book set bookName = ? ,bookValue = ? Where personName = ? "; return "hello"; }
注解的位置:参数、【方法位置:这个方法就会提前于目标方法先运行】 可以提前查出从数据库获取信息《form action="requ"> 《p>西游记《/p> 《input type="text" name="bookValue" value="98.9"> 《input type="text" name="personName" value="陈志男"> 《input type="submit" name="提交"> 《/form> @Controller public class MyController { /* * 实际上书名是不允许改的 所以前端传过来的书名为null 不存在的字段不要在sql语句中 (但会出现多余的",") * 考虑不是mybatis的动态sql * springMVC 会直接在参数位置来写Book对象 自动粉装 没有带的值为null * * 解决sql都是全字段 但又是对象可能会缺乏某些值 * 先从数据库提取出来数据 ,然后将前端发送过来的数据覆盖到数据库读取的数值上 */ @RequestMapping("requ") public String getBook(@ModelAttribute("book") Book book) { // 可以告诉springmvc 不要new 这个 book 我刚才保存了一个book 用我这个book System.out.println(book); String sql = "update bs_book set bookName = ? ,bookValue = ? Where personName = ? "; return "hello"; } @ModelAttribute public void prePro(Map map) { Book book = new Book(); book.setBookName("西游记"); map.put("book", book); System.out.println("ModelAttribute....."); } }
原理@Controller public class MyController { Object a1 ; Object a2 ; @RequestMapping("requ") public String getBook(@ModelAttribute("book") Book book,Model model) { a1 = model; System.out.println("model==map?"+(a1==a2)); return "hello"; } @ModelAttribute public void prePro(Map map) { a2 = map; Book book = new Book(); book.setBookName("西游记"); map.put("book", book); System.out.println("ModelAttribute....."); } }
获取
处理模型数据之 ModelAndView
- 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
- 添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map<String, ?> modelMap) - 设置视图:
void setView(View view)
void setViewName(String viewName)
处理模型数据之 Map
Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据
具体使用步骤
- Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
- 如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。
- 在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据