首页 > 代码库 > SpringMVC:学习笔记(4)——处理模型数据

SpringMVC:学习笔记(4)——处理模型数据

SpringMVC—处理模型数据

说明

  SpringMVC 提供了以下几种途径输出模型数据:
  – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
  – Map及Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 Java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。
  – @SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
  – @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中。

ModelAndView

说明

  一旦Controller处理完客户请求,则返回ModelAndView对象给DispatcherServlet前端控制器。ModelAndView中包含了模型(Model)和视图(View)。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观角度考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型和视图。
  即,控制器处理方法的返回值如果为ModelAndView,则其中既包含视图信息,也包含模型数据信息

示例

  1.创建ModelAndView,并传入模型数据  

  技术分享

  2.编写JSP页面,进行测试

  技术分享

 说明:

  SpringMVC会把ModelAndView中的Model中的数据方法Request域对象中。 

Map及Model

说明: 

  Spring MVC 在内部使用了一个org.springframework.ui.Model 接口存储模型数据。

  Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。

  如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。

示例:

  技术分享

使用MODEL:

  这里传入的Map实际为BindingAwareModelMap,所以我们定义参数用Map即可。  

   技术分享

说明:

  并且在这里我们也是可以使用Model类型的。
  技术分享

 

@SessionAttribute

  若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes,Spring MVC将在模型中对应的属性暂存到 HttpSession 中。

 说明:

    注意这个注解只能放到类的上面

  1.首先使用Map将模型数据存到请求域中,然后在类定义处使用@SessionAttributes,拷贝到Session中。

  技术分享

  2.编写JSP页面及测试

  技术分享

  技术分享

补充

  @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
  – @SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
  – @SessionAttributes(value=http://www.mamicode.com/{“user1”, “user2”})
  – @SessionAttributes(types={User.class, Dept.class})
  – @SessionAttributes(value=http://www.mamicode.com/{“user1”, “user2”},types={Dept.class})

 

@ModelAttribute

说明:

  ModelAttribute在控制器中有两种使用场景。 当作为一个方法参数时,@ModelAttribute用于映射一个模型属性到特定的注解的方法参数(见下面的processSubmit()方法)。 这是控制器获得持有表单数据的对象引用的方法。另外,这个参数也可以被声明为特定类型的表单支持对象,而不是一般的java.lang.Object,这就增加了类型安全性。
@ModelAttribute也用于在方法级别为模型提供引用数据(见下面的populatePetTypes()方法)。 在这种用法中,方法编写可以包含与上面描述的@RequestMapping注解相同的类型。
注意:使用@ModelAttribute注解的方法将会在选定的使用@RequestMapping注解的方法之前执行。 它们有效的使用特定的属性预先填充隐含的模型,这些属性常常来自一个数据库。 这样一个属性也就可以通过在选定的方法中使用@ModelAttribute注解的句柄方法参数来访问了,潜在的可以应用绑定和验证。  

说明:被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。  

基本用法:

  1.在方法上使用@ModelAttribute

  @Controller
  public class UserDao{
    .....
    @ModelAttribute
    public User addUser(User user)
    {
        return new User(201702,"MrSaber");
    }
    .....
  }

说明:

  执行UserDao内带有@RequestMapping的方法之前,都会先执行此addUser方法,并且执行addUser过程中会添加两个对象到model,先将key为"user"的对象(由addUser方法的User user引起的),再添加key为"user1"的对象(由注解@ModelAttribute("user1")引起的).

  2.在方法参数上使用@ModelAttribute.

@RequestMapping("/save")  
public String save(@ModelAttribute User user) {  
    user.setUsername("U love me");  
    userService.save(user);  
    return "result";  
} 

说明:

   此方法会先从model去获取key为"user"的对象,如果获取不到会通过反射实例化一个User对象,再从request里面拿值set到这个对象,然后把这个User对象添加到model(其中key为"user").使用了@ModelAttribute可修改这个key,不一定是"user",此情况下,用与不用@ModelAttribute没有区别.。

  

 

SpringMVC:学习笔记(4)——处理模型数据