SpringMVC 8. 处理数据模型 ModelAndView、Map 及 Model、@SessionAttributes
处理模型数据
1 SpringMVC 提供了以下几种途径输出模型数据:
- ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
- Map 及 Model: 入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。
- @SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
- @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中
2 ModelAndView
2.1 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map<String, ?> modelMap)
设置视图:
void setView(View view)
void setViewName(String viewName)
controller类:
@RequestMapping("/springmvc")
@Controller
public class DataProcessingModel{
public static final String SUCCESS = "success" ;
@RequestMapping("/testModelAndView")
/* 目标方法的返回值可以是 ModelAndView 类型。 其中可以包含视图和模型信息 SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中. */
public ModelAndView testModelAndView(){
String viewName = SUCCESS ;
//转到success.jsp页面
ModelAndView modelAndView = new ModelAndView(viewName) ;
modelAndView.addObject("time",new Date()) ;
return modelAndView ;
}
jsp页面:
<a href="/springmvc/testModelAndView">testModelAndView page</a>
success.jsp页面
<%-- 显示--%>
time:${requestScope.time}
3 Map 及 Model
Spring MVC 在内部使用了一个org.springframework.ui.Model 接口存储模型数据
具体步骤
- Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
- 如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据
cotroller类中加入:
//目标方法可以添加 Map 类型(实际上也可以是 Model 类型或 ModelMap 类型)的参数.
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map){
System.out.println(map.getClass().getName());//org.springframework.validation.support.BindingAwareModelMap
map.put("names", Arrays.asList("Tom","jerry","Mike")) ;
return SUCCESS ;
}
jsp页面:
<a href="/springmvc/testMap">testMap page</a>
success.jsp页面
<%-- 显示--%>
names:${requestScope.names}
4 @SessionAttributes
若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes, Spring MVC将在模型中对应的属性暂存到 HttpSession 中。
@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
- @SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
- @SessionAttributes(value={“user1”, “user2”})
- @SessionAttributes(types={User.class, Dept.class})
- @SessionAttributes(value={“user1”, “user2”},types={Dept.class})
在controller类中加入以下方法,并在类上加入注解:@SessionAttributes(value = {"user"},types = {String.class})
//注意:需要在Cotroller类上添加注解:@SessionAttributes(value = {"user"},types = {String.class})
/** @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 性值), 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值) 注意: 该注解只能放在类的上面. 而不能修饰放方法. */
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String,Object> map){
User user = new User("大王","12334",11,"12231233@qq.com") ;
map.put("user",user) ;
map.put("likeColor","red") ;
return SUCCESS ;
}
User类:
public class User {
private Integer id ;
private String username;
private String password;
private Integer age;
private String email;
private Address address;
public User(Integer id, String username, String password, Integer age, String email) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", email='" + email + '\'' +
", address=" + address +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public User() {
}
public User(String username, String password, Integer age, String email) {
this.username = username;
this.password = password;
this.age = age;
this.email = email;
}
}
jsp页面:
<a href="/springmvc/testSessionAttributes">testSessionAttributes page</a>
success.jsp
request user :${requestScope.user}
<br><br>
session user :${sessionScope.user}
<br><br>
request likeColor :${requestScope.likeColor}
<br><br>
session likeColor :${sessionScope.likeColor}
上一篇:SpringMVC 7. 使用 Servlet API 作为入参
下一篇:SpringMVC 9. ModelAttribute注解