SpringMVC_响应数据传出

SpringMVC除过在方法上传入原生的request和session外还能怎么样把数据带给页面???

1)、可以在方法处传入Map、或者Model或者ModelMap。
给这些参数里面保存的所有数据都会放在请求域中。可以在页面获取
关系:
Map,Model,ModelMap:最终都是BindingAwareModelMap(隐含模型)在工作;
相当于给BindingAwareModelMap中保存的东西都会被放在请求域中;

Map(interface(jdk))      Model(interface(spring))
	||							//
	||						   //
	\/						  //
ModelMap(clas)			     //
			\\				//
			 \\	           //
			ExtendedModelMap
					||
					\/
			BindingAwareModelMap
 

2)、方法的返回值可以变为ModelAndView类型;
既包含视图信息(页面地址)也包含模型数据(给页面带的数据);
而且数据是放在请求域中;
request、session、application;

3)、SpringMVC提供了一种可以临时给Session域中保存数据的方式;
使用一个注解 @SessionAttributes(只能标在类上)
@SessionAttributes(value=“msg”):
给BindingAwareModelMap中保存的数据,或者ModelAndView中的数据,
同时给session中放一份;
value指定保存数据时要给session中放的数据的key;

value={"msg"}:只要保存的是这种key的数据,给Session中放一份
types={String.class}:只要保存的是这种类型的数据,给Session中也放一份

后来推荐@SessionAttributes就别用了,可能会引发异常;
给session中放数据请使用原生API;

代码实现:

@SessionAttributes(value={"msg"},types={String.class})
@Controller
public class ModelTest {
    @RequestMapping("/hello01")
    public String hello04(Model model, HttpServletRequest request){
    model.addAttribute("msg", "你好!");
        request.getServletContext().setAttribute("msg1", "永久的哦");

        return "success";


    }
    @RequestMapping(value = "/hello02")
    public String hello05(ModelMap modelMap){
        modelMap.addAttribute("msg", "你好噢!");
        return "success";
    }
    @RequestMapping("/hello03")
    public String hello06(Map<String,Object> map){
        map.put("msg", "你好棒哦");
        System.out.println(map.getClass());
        return "success";
    }


    /**
     * 返回值是ModelAndView;可以为页面携带数据
     * @return
     */
    @RequestMapping("/hello04")
    public ModelAndView hello07(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "你真的好棒噢");
        System.out.println("hello07正在处理......");
        mv.setViewName("success");
        return mv;

    }



}


@ModelAttribute注解:
package com.czl.controller;

/**
 * 测试ModelAttribute注解;
 * 使用场景:书城的图书修改为例;
 * 1)页面端;
 * 		显示要修改的图书的信息,图书的所有字段都在
 * 2)servlet收到修改请求,调用dao;
 * 		String sql="update bs_book set title=?,
 * 					author=?,price=?,
 * 					sales=?,stock=?,img_path=? 
 * 				where id=?";
 * 3)实际场景?
 * 		并不是全字段修改;只会修改部分字段,以修改用户信息为例;
 * 		username  password  address;
 * 		1)、不修改的字段可以在页面进行展示但是不要提供修改输入框;
 * 		2)、为了简单,Controller直接在参数位置来写Book对象
 * 		3)、SpringMVC为我们自动封装book;(没有带的值是null)
 * 		4)、如果接下来调用了一个全字段更新的dao操作;会将其他的字段可能变为null;
 * 			sql = "update bs_book set"
 * 			if(book.getBookName()){
 * 				sql +="bookName=?,"
 * 			}
 * 			if(book.getPrice()){
 * 				sql +="price=?"
 * 			}
 * 
 * 4)、如何能保证全字段更新的时候,只更新了页面携带的数据;
 * 		1)、修改dao;代价大?
 * 		2)、Book对象是如何封装的?
 * 			1)、SpringMVC创建一个book对象,每个属性都有默认值,bookName就是null;
 * 				1、让SpringMVC别创建book对象,直接从数据库中先取出一个id=100的book对象的信息
 * 				2、Book [id=100, bookName=西游记, author=张三, stock=12, sales=32, price=98.98]
 * 
 * 			2)、将请求中所有与book对应的属性一一设置过来;
 * 				3、使用刚才从数据库取出的book对象,给它 的里面设置值;(请求参数带了哪些值就覆盖之前的值)
 * 				4、带了的字段就改为携带的值,没带的字段就保持之前的值
 * 			3)、调用全字段更新就有问题;
 * 				5、将之前从数据库中查到的对象,并且封装了请求参数的对象。进行保存;
 * 
 * @author lfy
 */
/*@SessionAttributes("haha")
*  最好不要使用:
*           1)为了避免可能引发的异常
*                       保证两点:
*                               1、要么隐含模型中有@SessionAttributes标注的属性;
*                               2、如果隐含模型中没有,而sessionAttributes还标注有,就会抛异常
* */
@Controller
public class ModelAttributeTestController {
	
	private Object o1;
	private Object o2;
	
	private Object b1;
	private Object b2;
	
	//bookDao.update(book);
	//Book [id=100, bookName=null, author=张三, stock=12, sales=32, price=98.98]
	/**
	 *		String sql="update bs_book set bookName=?,
					author=?,price=?,
					sales=?,stock=?,img_path=? 
				where id=?";
	 */
	/**
	 * 可以告诉SpringMVC不要new这个book了我刚才保存了一个book;
	 * 哪个就是从数据库中查询出来的;用我这个book?
	 * 
	 *  
	 * 同都是BindingAwareModelMap
	 * @param book
	 * @return
	 */
	@RequestMapping("/updateBook")
	public String updateBook(@RequestParam(value="author")String author,
			Map<String, Object> model,
			HttpServletRequest request,
			@ModelAttribute("haha") Book book
			){
		o2 = model;
		b2  = book;
		Object haha = model.get("haha");
		//System.out.println("传入的model:"+model.getClass());
		System.out.println("o1==o2?"+(o1 == o2));
		System.out.println("b1==b2?"+(b1 == b2)+"-->"+(b2 == haha));
		
		System.out.println("页面要提交过来的图书信息:"+book);
		return "success";
	}
	
	/**
	 * 1)、SpringMVC要封装请求参数的Book对象不应该是自己new出来的。
	 * 		而应该是【从数据库中】拿到的准备好的对象
	 * 2)、再来使用这个对象封装请求参数
	 * 
	 * @ModelAttribute:
	 * 		参数:取出刚才保存的数据
	 * 		方法位置:这个方法就会提前于目标方法先运行;
	 * 			1)我们可以在这里提前查出数据库中图书的信息
	 * 			2)将这个图书信息保存起来(方便下一个方法还能使用)
	 * 
	 * 参数的map:BindingAwareModelMap
	 */


    /**
     * 	@ModelAttribute 标注的方法会提前运行并把方法的运行结果放在隐含模型中,
     * 	                放的时候会使用一个key;
     * 	                    如果 @ModelAttribute("book")指定了,就用指定的book;
     * 	                    如果没有指定就用返回值的首字母小写作为key
     * @param map
     * @return
     */

//	@ModelAttribute("haha")
    @ModelAttribute
	public Book hahaMyModelAttribute(Map<String, Object> map){
		
		Book book = new Book(100, "西游记", "吴承恩", 98, 10, 98.98);
		System.out.println("数据库中查到的图书信息是:"+book);
		map.put("book", book);
		b1 = book;
		o1 = map;
		System.out.println("modelAttribute方法...查询了图书并给你保存起来了...他用的map的类型:"+map.getClass());
	    return book;
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值