Spring MVC 是 Spring 系列 Java 项目中流行的项目之一。在本文中,我们将探讨Model、ModelMap和ModelAndView在 Spring MVC 中如何工作。
Spring MVC 遵循模型-视图-控制器(MVC) 模式,将应用程序分解为三个单独的组件,称为 MVC。Model、ModelMap和ModelAndView在 MVC 模式中创建来自模型和视图的数据流。
Model:
Model是com.springframework.ui下spring核心包中的一个接口,用于将数据或属性从我们的业务逻辑传输到渲染视图页面。它的主要用途是向模型添加属性,并且可以像java.util.Map接口一样简单地查看和访问。
Spring允许我们在接受请求的方法中直接使用Model对象作为参数,框架将为我们从请求对象注入Model模型。
// Controller layer for Login Page // Using Model
package com.example.springmodelsdemo.controller;
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView;
// 使用 // Spring Web 注释的简单控制器 ; @Controller public class LoginController { // 返回登录 jsp // 在web根目录 @GetMapping("/") public String home(){ return "login.jsp"; } // 映射"/login "请求 // requestparam 用于从获取请求参数中获取值 //从获取请求参数中获取值 @GetMapping("/login") public String loginActionUsingModel( @RequestParam("name") String name, @RequestParam("password") String pass, Model model ){ // 将请求传递的属性添加到模型对象中; model.addAttribute("userName", name); model.addAttribute("password", pass); // 返回视图 return "result.jsp"; } }
|
步骤如下:
- 使用@Controller注解在创建一个名为 LoginController 的简单 Controller。如上面代码
- 创建一个方法loginActionUsingModel来将其映射为登录请求并向其传递一个 Model 对象,这样 Spring 就会为我们提供它。
- addAttribute(String name, Object obj) 用于将对象添加到 Model 对象。
- 返回视图,以便视图在渲染时可以访问此模型对象,因为我们已经添加了渲染视图可以使用它来显示此模型中的数据的属性。
返回视图要求指定目录存放:
- 在src/main父目录下创建一个 web app文件夹来存储 . jsp和项目的静态资源。
- 在resources/static/css/下添加以下样式,文件名为style.css
- 在Web应用程序文件夹下创建一个login.jsp文件来托管表单以将一些数据传递到Spring MVC
login.jsp<%@ page language="java" contentType="text/html"%>
<!DOCTYPE html> <head> <title>Welcome</title> <link rel="stylesheet" href="/css/style.css"> </head> <body> <div class="container"> <form action="login"> <div class="row"> <label for="name">Enter your username:</label> <input type="text" id="name" name="name"> </div> <div class="row"> <label for="pass">Enter your Password:</label> <input type="password" id="pass" name="password"> </div> <div class="row"> <button class="btn">Submit</button> </div> </form> </div> </body> </html>
|
结果result.jsp
<%@ page language="java" contentType="text/html"%> <!DOCTYPE html> <head> <title>Welcome</title> <link rel="stylesheet" href="/css/style.css" /> </head> <body> <div class="container"> <div class="row">Your Username is: ${userName}</div> <div class="row">Your Password is: ${password}</div> </div> </body> </html>
|
ModelMap
ModelMap是com.springframework.ui下的spring核心包中的一个类,用于将数据或属性从我们的业务逻辑传输到渲染视图页面。它是 Model 接口的扩展,因为它还实现了 java.util.Map以提供类似 Map 的结构来通过键值对方式访问属性。
它与 Model 对象完全兼容,并且还具有从 Map 接口实现的附加方法。
// Controller layer for Login Page // Using ModelMap
package com.example.springmodelsdemo.controller;
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView;
// A simple controller using spring // web annotations @Controller public class LoginController { // returning the login jsp // for root of the webpage @GetMapping("/") public String home(){ return "login.jsp"; }
// mapping the /login request // requestparam is used to get the value // from get request parameters @GetMapping("/login") public String loginActionUsingModelMap( @RequestParam("name") String name, @RequestParam("password") String pass, ModelMap model ){ model.addAttribute("userName", name); // 支持使用 java.util.Map 接口的 put 方法 ; model.put("password", pass); return "result.jsp"; } }
|
代码与之前Model类似:
- 使用@Controller注解创建一个名为 LoginController 的简单 Controller
- 创建一个方法来映射它以用于登录请求,并将 ModelMap 对象传递给它,这样 Spring 就会为我们提供它。
- addAttribute(String name, Object obj)用于将对象添加到 Model 对象。
- 使用put(String name, Object obj)方法可以轻松地以键值对方式添加属性。
- 返回视图,以便视图在渲染时可以访问此 ModelMap 对象,因为我们已经添加了渲染视图可以使用它来显示此模型中的数据的属性。
ModelAndView
在上面的类中,我们有模型对象并在方法中单独返回视图名称,但是 ModelAndView 类的做法略有不同。在此,我们将借助构造函数或通过此类的 setViewName() 方法将视图和数据组合在单个对象中。因此,使用 ModelAndView 我们可以在单个对象中返回视图和模型。
// Controller layer for Login Page // Using ModelAndView
package com.example.springmodelsdemo.controller;
import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView;
// A simple controller using spring // web annotations @Controller public class LoginController { // returning the login jsp // for root of the webpage @GetMapping("/") public String home(){ return "login.jsp"; }
// mapping the /login request // requestparam is used to get the value // from get request parameters // returns ModelAndView @GetMapping("/login") public ModelAndView loginActionUsingModelAndView( @RequestParam("name") String name, @RequestParam("password") String pass, ModelAndView model ){ model.addObject("userName", name); model.addObject("password", pass); model.setViewName("result.jsp"); return model; } }
|
- 使用@Controller注解创建一个名为 LoginController 的简单 Controller
- 创建一个方法来将其映射为登录请求,并将 ModelAndView 对象传递给它,这样 Spring 就会为我们提供它。
- 要么在构造函数中传递视图名称,要么通过setViewName()设置它;
- addObject(String name, Object obj)用于将对象添加到 Model 对象。
- 返回 ModelAndView 对象以在该对象中呈现提到的视图。
结论
我们已经讨论了 Spring MVC 中使用 Model、ModelMap、ModelAndView 来表示模型数据的所有方法,每种方法都可以帮助我们轻松地将数据传输到视图,每种方法完成相同的任务但有所不同,请根据您的需求进行选择使您的应用程序代码更具可读性且易于维护。