4.ssm配置 数据输出

控制器方法处理请求后,结果如何带给另外一个页面?

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方法");
		
		  
	  }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值