自动放入request域中
springmvc 会自动把获取的 model 模型,放入到 request 域中
验证代码
后端获取了master对象,这时就自动的把对象传到request域中了,为了验证这个猜想,我们需要从前端的jsp中看是否可以在request中取到master。
//验证自动放入request域
@RequestMapping("/master2")
public String javaBean2(Master master){
return "request";
}
前端jsp,利用el表达式取到master
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
id:${requestScope.master.id}<br>
name:${requestScope.master.name}<br>
petname:${requestScope.master.pet.name}<br>
petage:${requestScope.master.pet.age}<br>
</body>
</html>
默认存放在requset中的属性名为类的类型名 首字母小写
验证
改名传入类的变量名,看看是否会改变。若改变后,前端将无法使用master拿到值了,则与变量名有关,反之若可以拿到,就与类的类型名有关。
// 验证requset属性名为类的类型名首字母小写
@RequestMapping("/master1")
public String javaBean1(Master master100){
System.out.println(master100);
return "request";
}
前端
id:${requestScope.master.id}<br>
name:${requestScope.master.name}<br>
petname:${requestScope.master.pet.name}<br>
petage:${requestScope.master.pet.age}<br>
HttpServletRequest添加属性到request域中
利用之前说到的servletApi知识点获取HttpServletRequest对象放入属性和属性值
//验证HttpServletRequest存requset域中:
@RequestMapping("/master3")
public String javaBean3(Master master, HttpServletRequest request){
request.setAttribute("myname","ayou");
return "request";
}
前端
myname:${requestScope.myname}
把Map中的数据添加到request域中
springMVC会把map中的k-v遍历存在request域中,若存放的是名称和springMVC自动放入的对象名称(默认存放在requset中的属性名为类的类型名 首字母小写)一样就会代替
// map的k-v放入到request域对象中
@RequestMapping("/master4")
public String javaBean4(Master master, Map<String,Object> map){
map.put("myname","hahaha");
map.put("master",null);//把默认的master置空
return "request";
}
ModelAndView添加到request域中
和map的机制类似
- 从本质看,请求响应的方法 return "xx", 是返回了一个字符串,其实本质是返回了一个
ModelAndView 对象,只是默认被封装起来的. - ModelAndView 即可以包含 model 数据,也可以包含视图信息
- ModelAndView 对象的 addObject 方法可以添加 key-val 数据,默认在 request 域中
- ModelAndView 对象 setView 方法可以指定视图名称
//返回ModelAndView对象,将数据放入到Request域中
@RequestMapping("/master5")
public ModelAndView javaBean5(Master master100, ModelAndView modelAndView){
//放入属性到ModelAndView
modelAndView.addObject("myname","geigeili");
//指定跳转到的页面
modelAndView.setViewName("request");
//返回结果
return modelAndView;
}
把数据放入session域中
//把数据放入session域中
@RequestMapping("/master6")
public String javaBean6(Master master100, HttpSession httpSession){
//通过setAttribute放入属性
httpSession.setAttribute("master" ,master100);
httpSession.setAttribute("myname","wuyiwuaa");
return "request";
}
@ModelAttribute
在某个方法上,增加了@ModelAttribute 注解后,那么在调用该 Handler 的任何一个方法时,都会先调用这个方法
//@ModelAttibute
@ModelAttribute
public void prepareData(){
System.out.println("先调用我哦");
}
应用实例
修改用户信息(就是经典的使用这种机制的应用),流程如下:
- 在修改前,在前置方法中从数据库查出这个用户
- 在修改方法(目标方法)中,可以使用前置方法从数据库查询的用户
- 如果表单中对用户的某个属性修改了,则以新的数据为准,如果没有修改,则以数据库的信息为准,比如,用户的某个属性不能修改,就保持原来的值