控制器方法处理请求后,结果如何带给另外一个页面?
1.控制器方法的参数 传入 Map,或者Model或者ModelMap |
---|
2. 控制器方法的返回值,不一定是String类型,可以是ModelAndView类型。包含视图信息,还有模型数据 |
3. @SessionAttributes(value=“msg”) 给BindingAwareModelMap中保存的数据, 或者ModelAndView中的数据,同时给session中放一份 |
4. @ModeAttribute 注解标注的方法,会提前于目标方法运行 |
5.控制器方法的参数 传入 原生API session。 |
给BindingAwareModelMap中保存的数据 ,都会被放在请求域中 于是带给另外一个页面。 |
---|
可以往ModelAndView里面添加数据。数据会放在请求域中。 |
在另一个页面,验证结果放在哪个域。
(方法处理请求后的结果,都放在请求域中)
@RequestMapping("/hello")
public String handler01(Map<String,String> map){
map.put("msg", "你好");
return "sucess";
}
@RequestMapping("/hello1")
public String handler02(Model model){
model.addAttribute("msg", "你好");
return "sucess";
}
@RequestMapping("/hello2")
public String handler03(ModelMap modelMap){
modelMap.addAttribute("msg", "你好");
return "sucess";
}
不管是map,model,modelmap
最后都是BindingAwareModelMap在工作
相当于给BindingAwareModelMap中保存的数据
都会被放在请求域中
于是带给另外一个页面。
class org.springframework.validation.support.BindingAwareModelMap
class org.springframework.validation.support.BindingAwareModelMap
class org.springframework.validation.support.BindingAwareModelMap
Map | 是jdk的一个集合接口(interface) |
---|---|
Model | 是spring的一个接口(interface) |
ModelMap | 是一个类,继承于LinkedHashMap,Map接口旗下的实现类。 |
ExtendedModelMap继承ModelMap,实现Model
BindingAwareModelMap继承于ExtendedModelMap
方法2:控制器方法的返回值,
不一定是String类型,
可以是ModelAndView类型。
当然要先new一个ModelAndView ,传入的参数就是视图名。
视图解析器会对这个视图名拼串。
new ModelAndView("sucess");
@RequestMapping("/hello3")
public ModelAndView handler04(){
ModelAndView mv= new ModelAndView("sucess");
addObject添加数据
mv.addObject("msg", "hello");
return mv;
}
可以往ModelAndView里面添加数据。数据会放在请求域中。
方法 3 给session域中放数据
@Target({ElementType.TYPE})
这个注解是标记在类上的
@SessionAttributes(value="msg",type={String.class})
给BindingAwareModelMap中保存的数据,
或者ModelAndView中的数据
同时给session中放一份
value属性指定要往session中放的数据key
type属性指定要往session中放的数据类型
方法 @ModeAttribute
应用场景
1.并不是全部字段更新,而是部分字段更新 |
---|
表单
<form action="updateBook" method="post"></form>
隐藏id
<input type="hidden" name="id" value="100">
不修改的字段,不要提供修改输入框
bookName:西游记<br/>
作者:<input type="text" name="author"/><br/>
价格:<input type="text" name="price"/><br/>
库存:<input type="text" name="stock"/><br/>
销量:<input type="text" name="sales"/><br/>
<input type="submit" value="修改图书"/>
@RequestMapping("/updateBook")
public String updateBook(Book book){
System.out.println("页面的图书信息"+book);
bookDao.update(book);
String sql="update bs_book set bookName=?,
author=?,price=?,
sales=?,stock=?
where id=?"
return "sucess";
}
页面的图书信息Book [id=100, bookName=null, author=hhh, price=7774.0, stock=44, sales=11]
如何只修改部分字段?要看Book对象是如何封装的 |
---|
1. 如果我们请求参数是一个实体类对象的话,控制器方法的参数,直接写这个实体类的对象。 SpringMVC创建一个book对象,实体类对象的全部属性默认是null |
2.springmvc就会将实体类对象的属性,尝试从请求参数中获得值。 |
3.如果调用dao操作,是一个全字段更新,会将没有更新的字段变为null |
1.现在不让springmvc创建一个book对象,直接从数据库中先取出id=100的book对象,属性就不是null了 |
---|
2.springmvc会将取出的实体类对象的属性,尝试从请求参数中获得。请求参数有啥覆盖啥 |
3.将这个从数据库中取,又封装了请求参数的实体类对象,进行保存在map中。 |
@ModeAttribute
- 注解标注的方法,会提前于目标方法运行
- 还可以用在方法参数里,用来取出刚刚在map保存的数据库实体类对象。
ModelAttribute方法
页面的图书信息Book [id=100, bookName=null, author=, price=88.0, stock=null, sales=null]
1.可以提前从数据库中先取出id=100的实体类对象,属性就不是null了 |
---|
2.把这个取出的实体类对象保存起来。保存在map中 |
@RequestMapping("/update")
public String updateBook(@ModelAttribute("book")Book book){
System.out.println("页面的图书信息"+book);
//bookDao.update(book);
//String sql="update bs_book set bookName=?,
//author=?,price=?
//sales=?.stock=?
//where id=?"
return "sucess";
}
@ModelAttribute
public void testModelAttribute(Map<String,Object> map){
Book book = new Book(100,"西游记","孙",98,10,98.98);
System.out.println("数据库中查到的信息是:"+book);
map.put("book",book);
System.out.println("ModelAttribute方法");
}
}