📜  Spring MVC – 模型接口

📅  最后修改于: 2022-05-13 01:55:35.131000             🧑  作者: Mango

Spring MVC – 模型接口

Spring Web 模型-视图-控制器 (MVC) 是一个用于构建 J2EE Web 应用程序的开源框架。它基于 Model-View-Controller 设计模式,实现了一个核心 spring 框架的基本特性——依赖注入。它是围绕一个“DispatcherServlet”设计的,它将请求分派给处理程序,具有可配置的处理程序映射、视图分辨率、语言环境和主题分辨率以及对上传文件的支持。在 MVC 框架中,M 代表模型——用于处理数据,V 代表视图——用于向用户呈现数据,C 代表控制器——包含处理用户输入的实际业务逻辑。

Spring Framework 提供了一个名为Model(I)的接口来处理数据。它为模型属性定义了一个占位符,主要用于向模型添加属性。它还用于在 Spring MVC 应用程序的视图和控制器之间传输数据。模型接口在org.springframework.ui包中可用。它充当包含应用程序数据的数据容器。存储的数据可以是任何形式,例如字符串、对象、数据库中的数据等。

模型(I)中可用的方法

以下是 Model(I) 中可用的方法。

1) 添加属性

它在提供的名称下添加指定的属性。

Model addAttribute(String attributeName,

                   @Nullable

                   Object attributeValue)
                   
attributeName - the name of the model attribute - can never be null
attributeValue - the model attribute value - can be null

2) 添加属性

它使用生成的名称将指定的属性添加到此 Map。

Model addAttribute(Object attributeValue)

attributeValue - the model attribute value - can never be null

3) 添加所有属性

将指定 Collection 中的所有属性复制到此 Map 中,使用每个元素的属性名称生成。

Model addAllAttributes(Collection attributeValues)

attributeValues - the model attribute values

4) 添加所有属性

将提供的地图中的所有属性复制到此地图中。

Model addAllAttributes(Map attributes)

5) 合并属性

将提供的 Map 中的所有属性复制到此 Map 中,优先使用相同名称的现有对象,也就是说,它们不会被替换。

Model mergeAttributes(Map attributes)

6) 包含属性

检查此模型是否包含给定名称的属性?

boolean containsAttribute(String attributeName)

attributeName - the name of the model attribute - not null
It returns the value true/false.

7) 获取属性

返回指定名称的属性值(如果存在)。

@Nullable

Object getAttribute(String attributeName)

attributeName - the name of the model attribute - not null
It returns the corresponding attribute value. If not, it returns null.

8) asMap

它以 Map 的形式返回当前的模型属性集。

Map asMap()

Spring MVC 应用程序

我们将在 Spring Tool Suite (STS) 中创建一个简单的 Spring MVC 应用程序,了解如何使用模型对象来保存表单数据。

创建应用程序的步骤:

  1. 在 Spring Tool Suite 中创建一个 Spring MVC 项目。
  2. 在 STS 中,根据开发人员选择创建项目时,它将下载所有必需的 maven 依赖项、*.jar、lib 文件,并提供嵌入式服务器。
  3. 我们可以在“pom.xml”文件中看到所有需要的依赖项。
  4. 创建 Bean 类、Controller 类和 JSP 视图页面。
  5. 下面是 Spring MVC 项目创建后的最终项目结构 *. Java和 *.jsp 文件。
项目结构

项目结构

执行:

要创建的文件如下:

  1. 细节。 Java – Bean 类 – 定义字段属性和属性的 getter/setter 方法。
  2. 详细信息控制器。 Java – 控制器类 – 处理用户请求并生成输出。
  3. details.jsp – 与用户交互以进行输入的 JSP 文件。
  4. detailsSummary.jsp – 处理输入后向用户显示输出的 JSP 文件。

1) 细节。 Java文件:

Java
package com.geeks.app;
  
public class Details {
      
    private String name;
    private String lang;
    private String ide;
  
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLang() {
        return lang;
    }
    public void setLang(String lang) {
        this.lang = lang;
    }
    public String getIde() {
        return ide;
    }
    public void setIde(String ide) {
        this.ide = ide;
    }
      
}


Java
package com.geeks.app;
  
import java.util.Arrays;
import java.util.List;
  
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
  
@Controller
public class DetailsController {
      
    @RequestMapping(value = "/")
    public String viewPage(Model model) {
  
        Details detail = new Details();
        model.addAttribute("detail", detail);
          
        List ideNames = Arrays.asList("Eclipse", "IntelliJ", "PyCharm", "Visual Studio", "NetBeans");
        model.addAttribute("ideNames", ideNames);        
          
        return "details";
    }
  
    @RequestMapping(value = "/submit", method = RequestMethod.POST)
    public String submit(@ModelAttribute("detail") Details detail) {
            return "detailsSummary";
    }
  
}


HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>




Welcome Page


  
    

Welcome to GeeksforGeeks!!

    

Please fill in the form

                                                                                                                                                                                                                                                     
Name:
Coding Language:                                          
Select IDE:
Submit
    
  


HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>




Summary page


  
    

Details submitted!

                                                                                                                                                
Name:${detail.name}
Coding Language:${detail.lang}
IDE selected:${detail.ide}
  


'Details' 类具有三个属性:name、lang 和 ide,以及用于获取和设置值的所有属性的 getter/setter 方法。

2) 详细信息控制器。 Java文件:

Java

package com.geeks.app;
  
import java.util.Arrays;
import java.util.List;
  
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
  
@Controller
public class DetailsController {
      
    @RequestMapping(value = "/")
    public String viewPage(Model model) {
  
        Details detail = new Details();
        model.addAttribute("detail", detail);
          
        List ideNames = Arrays.asList("Eclipse", "IntelliJ", "PyCharm", "Visual Studio", "NetBeans");
        model.addAttribute("ideNames", ideNames);        
          
        return "details";
    }
  
    @RequestMapping(value = "/submit", method = RequestMethod.POST)
    public String submit(@ModelAttribute("detail") Details detail) {
            return "detailsSummary";
    }
  
}

这个控制器有一个映射到'/'的GET方法和一个映射到'/submit'的POST方法。

使用的注释:

  • @Controller 向容器传达这个类是 spring 控制器类。要使用这个注解,我们需要导入 org.springframework.stereotype.Controller 包。
  • @RequestMapping,根据提供的值将请求 URL 映射到指定的方法。要使用这个注解,我们需要导入 org.springframework.web.bind.annotation.RequestMapping 包。
  • @ModelAttribute,用于将方法参数或方法返回值绑定到命名模型属性。我们需要导入 org.springframework.web.bind.annotation.ModelAttribute 包。

'viewPage' 方法返回'detail' 表单模板。它包括“detail”模型属性,以便模板可以将表单属性与“detail”对象相关联。此外,它还包括“ideNames”模型属性,用于显示下拉字段中的值,该下拉字段与 JSP 页面上的同名映射。 'submit' 方法有 'Details' 对象,它将浏览器重定向到 POST 请求的 'detailsSummary' 页面。

3) details.jsp 文件:

HTML

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>




Welcome Page


  
    

Welcome to GeeksforGeeks!!

    

Please fill in the form

                                                                                                                                                                                                                                                     
Name:
Coding Language:                                          
Select IDE:
Submit
    
  

该页面包含一个简单的表单,其每个字段都位于表格的单独单元格中。该表格适合发布到“/提交”。它被“details”模型属性和“POST”方法标记为被备份——Web控制器中的“submit”。我们使用 Spring 表单的标签库来显示标签名称、输入字段、下拉列表和单选按钮标签。在下拉字段中,我们使用占位符“${ideNames}”,一旦应用程序运行,此持有者对象将使用控制器类中“ideNames”模型属性中提供的数据进行更新。

4) detailsSummary.jsp 文件:

HTML

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>




Summary page


  
    

Details submitted!

                                                                                                                                                
Name:${detail.name}
Coding Language:${detail.lang}
IDE selected:${detail.ide}
  

这是JSP页面处理输入后在浏览器中显示用户输入值的结果。每个字段将显示在表格的单独单元格中。

运行应用程序:

  • 右键单击项目,运行方式-> 在服务器上运行。
  • 在 localhost 中选择服务器以运行应用程序。
  • 在浏览器中打开 URL: http://localhost:8080/app/以获取以下屏幕。
欢迎页面

欢迎页面

  • 在表格中输入详细信息。
输入

输入

  • 单击提交以获取输出。
输出

输出