SpringMVC:模型数据解析

SpringMVC框架作为一个MVC框架,很重要的一项工作是在控制器获取模型数据并返回给客户端,即在JSP页面展示模型数据,使用的技术是通过EL表达式从域对象中取值。

在Servlet中,我们可以直接调用web资源给域对象传值,在SpringMVC框架中,如何完成这个操作?今天我们就来学习SpringMVC框架的模型数据绑定。

首先来理解这句话,模型数据的绑定,指将模型数据绑定给JSP域对象,回顾一下域对象有哪些?

JSP四大作用域对应的四个内置对象分别是

pageContext,request,session,application。

模型数据的绑定是由ViewResolver来完成的,开发时,我们先添加模型数据,再交给ViewResolver来绑定。

所以我们学习的重点在于如何添加模型数据。

SpringMVC提供了以下几种方式添加模型数据:

Map

Model

ModelAndView

@SessionAttributes

@ModelAttribute

开发中经常用到的域对象是request和session,所以针对这两个域对象进行讲解,pageContext和application可以通过获取原生Servlet资源的方式进行绑定,实际开发中使用不多。

模型数据绑定到request域对象

1.Map

SpringMVC在内部使用Model接口存储模型数据,在调用业务方法前会创建一个隐含对象作为模型数据的存储容器。

设置业务方法的入参为Map类型,SpringMVC会将隐含对象的引用传递给入参。在方法体中,开发者可以通过入参对象访问到模型中的所有数据,也可以向模型中添加新数据。

即只需要在业务方法添加Map类型的入参,方法体中便可通过对入参的操作来完成模型数据的添加。

    @RequestMapping("/mapTest")
    public String mapTest(Map<String,Object> map){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        map.put("user", user);
        return "index";
    }

业务方法完成,返回模型数据和视图信息给DispatcherServlet,DispatcherServlet通过ViewResolver对视图信息进行解析,逻辑视图映射到物理视图,同时将模型数据绑定到JSP的request域对象中,在JSP页面,可直接通过EL表达式取值。

 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${user.name }
</body>
</html>

启动tomcat,运行。

2.Model

Model与Map类似,业务方法通过入参来完成模型数据的绑定。

    @RequestMapping("/modelTest")
    public String modelTest(Model model){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        model.addAttribute("user", user);
        return "index";
    }

3.ModelAndView

与Map或者Model不同的是,ModelAndView不但包含模型数据,同时也包含了视图信息,所以使用ModelAndView来处理模型数据,业务方法的返回值必须是ModelAndView。

业务方法中对ModelAndView进行两个操作:1.填充模型数据。2.绑定视图信息。

关于ModelAndView的使用有8种方式。

    @RequestMapping("/modelAndViewTest1")
    public ModelAndView modelAndViewTest1(){
        ModelAndView modelAndView = new ModelAndView();
        User user = new User();
        user.setId(1);
        user.setName("张三");
        modelAndView.addObject("user", user);
        modelAndView.setViewName("index");
        return modelAndView;
    }

    @RequestMapping("/modelAndViewTest2")
    public ModelAndView modelAndViewTest2(){
        ModelAndView modelAndView = new ModelAndView();
        User user = new User();
        user.setId(1);
        user.setName("张三");
        modelAndView.addObject("user", user);
        View view = new InternalResourceView("/index.jsp");
        modelAndView.setView(view);
        return modelAndView;
    }

    @RequestMapping("/modelAndViewTest3")
    public ModelAndView modelAndViewTest3(){
        ModelAndView modelAndView = new ModelAndView("index");
        User user = new User();
        user.setId(1);
        user.setName("张三");
        modelAndView.addObject("user", user);
        return modelAndView;
    }

    @RequestMapping("/modelAndViewTest4")
    public ModelAndView modelAndViewTest4(){
        View view = new InternalResourceView("/index.jsp");
        ModelAndView modelAndView = new ModelAndView(view);
        User user = new User();
        user.setId(1);
        user.setName("张三");
        modelAndView.addObject("user", user);
        return modelAndView;
    }

    @RequestMapping("/modelAndViewTest5")
    public ModelAndView modelAndViewTest5(){
        Map<String,Object> map = new HashMap<String,Object>();
        User user = new User();
        user.setId(1);
        user.setName("张三");
        map.put("user", user);
        ModelAndView modelAndView = new ModelAndView("index", map);
        return modelAndView;
    }

    @RequestMapping("/modelAndViewTest6")
    public ModelAndView modelAndViewTest6(){
        Map<String,Object> map = new HashMap<String,Object>();
        User user = new User();
        user.setId(1);
        user.setName("张三");
        map.put("user", user);
        View view = new InternalResourceView("/index.jsp");
        ModelAndView modelAndView = new ModelAndView(view, map);
        return modelAndView;
    }

    @RequestMapping("/modelAndViewTest7")
    public ModelAndView modelAndViewTest7(){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        ModelAndView modelAndView = new ModelAndView("index", "user", user);
        return modelAndView;
    }

    @RequestMapping("/modelAndViewTest8")
    public ModelAndView modelAndViewTest8(){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        View view = new InternalResourceView("/index.jsp");
        ModelAndView modelAndView = new ModelAndView(view, "user", user);
        return modelAndView;
    }

4.HttpServletRequest

SpringMVC可以在业务方法直接获取到Servlet原生web资源,只需在方法定义时添加HttpServletRequest入参即可,在方法体中,可直接对request对象进行操作。

    @RequestMapping("requestTest")
    public String requestTest(HttpServletRequest request){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        request.setAttribute("user", user);
        return "index";
    }

[email protected]

SpringMVC还可以通过@ModelAttribute注解的方式添加模型数据,如何使用呢?

1.定义一个方法,该方法用来返回要填充到模型数据中的对象。

2.给该方法添加@ModelAttribute注解。

注意,该方法并不是响应请求的业务方法。

    @RequestMapping("/modelAttributeTest")
    public String modelAttributeTest(){
        return "index";
    }

    @ModelAttribute
    public User getUser(){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }

添加@ModelAttribute注解的方法,会在SpringMVC在调用任何一个业务方法之前被自动调用。

所以在执行modelAttributeTest业务方法之前,会首先调用getUser方法,获取返回值user对象,SpringMVC框架会自动将该对象填充到模型数据中,进而绑定到域对象中。

我们知道域对象中的数据都是以键值对(key-value)的形式保存的,那么此时的key是什么呢?默认取模型数据对应类的类名首字母小写,即User类首字母小写"user",所以JSP页面中,可以直接通过"user"取值。

若getUser没有放回值,则必须手动在该方法中填充模型数据,使用Map或者Model。

    @ModelAttribute
    public void getUser2(Map<String,Object> map){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        map.put("user", user);
    }

    @ModelAttribute
    public void getUser3(Model model){
        User user = new User();
        user.setId(1);
        user.setName("张三");
        model.addAttribute("user", user);
    }

模型数据绑定到session域对象

以上的方式全部是将模型数据绑定到request对象中,如果需要将模型数据绑定到session对象中,只需要在类定义处添加@SessionAttributes(value="user")注解即可。

@Controller
@SessionAttributes(value="user")
public class HelloHandler {

此时,无论通过上述哪种方式执行业务代码,将模型数据绑定到request对象中的同时,也会将模型数据绑定到session对象中,request和session对象中同时存在模型数据。

@SessionAttributes除了可以通过key值绑定,还可以通过模型数据的数据类型绑定。

@Controller
@SessionAttributes(types=User.class)
public class HelloHandler {

@SessionAttributes可同时绑定多个模型数据。

@Controller
@SessionAttributes(value={"user","address"})
public class HelloHandler {
@Controller
@SessionAttributes(types={User.class,Address.class})
public class HelloHandler {

原文地址:https://www.cnblogs.com/starsyh/p/8507529.html

时间: 2024-10-06 13:07:46

SpringMVC:模型数据解析的相关文章

SpringMVC 学习笔记(四) 处理模型数据

Spring MVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据 – Map及Model:入参为org.springframework.ui.Model.org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中. – @SessionAttributes: 将模型中的某个属性暂存到HttpSessio

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

SpringMVC-处理模型数据 说明 SpringMVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据 – Map及Model:入参为org.springframework.ui.Model.org.springframework.ui.ModelMap 或 Java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中. – @SessionAttributes: 将模型

SpringMVC(十五) RequestMapping map模型数据

控制器中使用map模型数据,传送数据给视图. 控制器参考代码: package com.tiekui.springmvc.handlers; import java.util.Arrays; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.sun.xml.

SpringMVC基础学习(二)&mdash;模型数据

一.处理模型数据 1.处理模型数据的途径      SpringMVC提供以下几种途径输出模型数据:      (1)ModelAndView: 处理方法返回值类型为ModelAndView,方法体即可通过该对象添加模型数据.      (2)Map及Model: 入参为Map和Model,处理方法返回时,Map中的数据会自动添加到模型中.      (3)@SessionAttributes: 将模型中的某个属性暂存到HttpSession中,以便多个轻轻能共享这个属性.      (4)@M

SpringMVC处理模型数据

1. 所谓处理模型数据:把 action 方法中返回的对象,集合如何放入到域对象中. 1). 域对象:pageContext, request, session, application 2. Spring MVC 提供了以下几种途径输出模型数据: 1)ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据 @RequestMapping("/testModelAndView" ) public ModelAndView te

springmvc学习(五)——处理模型数据

Spring MVC 提供了以下几种途径输出模型数据: ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据Map 及 Model: 入参为org.springframework.ui.Model.org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中.@SessionAttributes: 将模型中的某个属性暂存到HttpSession 中

springmvc之处理模型数据ModelAndView

springmvc提供了以下几种途径来输出模型数据: (1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据. (2)Map及Model:入参为org.springframework.ui.Model.org.springframework.ui.ModelMap或java.uti.Map时,处理方法返回时,Map中的数据会自动添加到模型中. (3)@SessionAttributes:将模型中的某个数据自动添加到模型中. (4)Mode

学习SpringMVC——说说视图解析器

各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~) 相信大家在昨天那篇如何获取请求参数篇中都已经领略到了spring mvc注解的魅力和套路了.搭上@RequestMapping的便车,我们可以去到我们想去的地方(方法)去,借助@RequestParam.@PathVariable等我们可以得到请求中想要的参数值,最终还能够通过神奇的“return SUCCESS”到达我们的目的地.今天主要就来说说在达到目的地的路上,我们

第一个SpringMVC实例和解析(HelloSpringMVC)

1. 开发步骤: (1)增加Spring支持 下载Spring安装包和其依赖的commons-logging.jar,复制到项目Web应用的lib文件夹(WebRoot/WEB-INF/lib): Spring文件夹内容介绍:     dccs: Spring相关文档,包括开发指南.API参考文档: libs: jar包.分为:1)Spring框架calss文件的JAR包:2)Spring框架源文件的压缩包,文件名以-source结尾: 3)Spring框架API文档的压缩包,文件名以-java