Объект передачи данных (DTO) в Spring MVC с примером

Опубликовано: 5 Октября, 2022

В Spring Framework объект передачи данных ( DTO ) — это объект, который переносит данные между процессами. Когда вы работаете с удаленным интерфейсом, каждый вызов стоит дорого. В результате нужно сократить количество звонков. Решение состоит в том, чтобы создать объект передачи данных, который может содержать все данные для вызова. Он должен быть сериализуемым, чтобы пройти через соединение. Итак, в этой статье мы собираемся обсудить концепцию DTO, а также обсудим реализацию DTO на примере проекта в Spring MVC.

Пример проекта

Мы собираемся использовать Spring Tool Suite 4 IDE для этого проекта. Пожалуйста, обратитесь к этой статье, чтобы установить STS на свой локальный компьютер. Как загрузить и установить среду IDE Spring Tool Suite (Spring Tools 4 для Eclipse)? Перейдите в среду IDE STS, затем создайте новый проект maven, выберите «Файл» > «Создать» > «Проект Maven» и выберите следующий архетип, как показано на изображении ниже, следующим образом:

Добавьте следующие зависимости maven и подключаемый модуль в файл yourpom.xml.

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.18</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

<!-- plugin -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

Ниже приведен полный код файла pom.xml после добавления этих зависимостей.

Файл: pom.xml

XML




    <modelVersion>4.0.0</modelVersion>
    <groupId>com.geeksforgeeks</groupId>
    <artifactId>simple-calculator</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>simple-calculator Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.18</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>simple-calculator</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Настройка диспетчерского сервлета

Прежде чем перейти к части кодирования, давайте посмотрим на структуру файла на изображении ниже.

Итак, сначала создайте папку src/main/java и внутри этой папки создайте класс с именем CalculatorAppIntilizer и поместите его в пакет com.geeksforgeeks.calculator.config и расширите класс AbstractAnnotationConfigDispatcherServletInitializer . Обратитесь к изображению ниже.

И всякий раз, когда вы расширяете этот класс, у него есть некоторые предабстрактные методы, которые нам нужны для реализации. Теперь внутри этого класса нам нужно просто написать две строки кода для настройки сервлета Dispatcher. Перед этим мы должны создать еще один класс для файла конфигурации Spring. Итак, перейдите в папку src/main/java и внутри этой папки создайте класс с именем CalculatorAppConfig и поместите его в пакет com.geeksforgeeks.calculator.config . Ниже приведен код файла CalculatorAppConfig.java .

Файл: CalculatorAppConfig.java

Java




package com.geeksforgeeks.calculator.config;
  
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
  
@Configuration
@ComponentScan(basePackages = "com.geeksforgeeks.calculator.controllers")
public class CalculatorAppConfig {
  
}

Ниже приведен полный код файла CalculatorAppIntilizer.java . Комментарии добавляются внутри кода, чтобы понять код более подробно.

Файл: CalculatorAppIntilizer.java

Java




package com.geeksforgeeks.calculator.config;
  
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  
public class CalculatorAppIntilizer extends AbstractAnnotationConfigDispatcherServletInitializer {
  
    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }
  
    // Registering the Spring config file
    @Override
    protected Class<?>[] getServletConfigClasses() {
        Class aClass[] = { CalculatorAppConfig.class };
        return aClass;
    }
  
    // Add mapping url
    @Override
    protected String[] getServletMappings() {
        String arr[] = { "/geeksforgeeks.org/*" };
        return arr;
    }
  
}

Настройка ViewResolver

Spring MVC — это Web MVC Framework для создания веб-приложений. В общем, все фреймворки MVC предоставляют способ работы с представлениями. Spring делает это с помощью ViewResolvers, что позволяет отображать модели в браузере, не привязывая реализацию к конкретной технологии представления. Подробнее читайте здесь: ViewResolver в Spring MVC. Итак, для настройки ViewResolver перейдите в файл CalculatorAppConfig.java и запишите код следующим образом.

@Bean
public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/view/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

А ниже обновленный код файла CalculatorAppConfig.java после написания кода для настройки ViewResolver.

Файл: Обновленный CalculatorAppConfig.java

Java




package com.geeksforgeeks.calculator.config;
  
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
  
@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.geeksforgeeks.calculator.controllers")
public class CalculatorAppConfig {
  
    // setup ViewResolver
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/view/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
  
}

Создать контроллер

Перейдите в папку src/main/java и внутри этой папки создайте класс с именем AppController и поместите его в пакет com.geeksforgeeks.calculator.controllers . Ниже приведен код файла AppController.java .

Файл: Файл AppController.java

Java




package com.geeksforgeeks.calculator.controllers;
  
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
  
@Controller
public class AppController {
      
    @RequestMapping("/home")
    public String showHomePage() {
        return "welcome-page";
    }
  
}

Создать вид

Теперь нам нужно создать представление с именем « welcome-page » внутри папки WEB-INF/view с расширением .jsp . Итак, перейдите в src > main > webapp > WEB-INF и создайте представление папки, а внутри этой папки создайте файл jsp с именем welcome-page . Итак, ниже приведен код файла welcome-page.jsp .

Файл: welcome-page.jsp

HTML




<html>
<head>
</head>
<body>
    <h1 align="center">Data Transfer Object (DTO) in Spring MVC with Example</h1>
      
    <hr/>
  
    <form action="process-homepage" method="get">
  
        <div align="center">
              
<p>
                <label for="num1">Enter First Number : </label> <input type="text"
                    id="num1" name="number1" />
            </p>
  
              
<p>
                <label for="num2">Enter Second Number : </label> <input type="text"
                    id="num2" name="number2" />
            </p>
  
  
            <input type="submit" value="Capture" />
  
        </div>
  
    </form>
</body>
</html>

Вид выглядит так

Итак, здесь мы хотим поместить некоторые значения внутри метки и мы хотим зафиксировать это значение, чтобы мы могли отобразить это значение на нашей следующей странице после нажатия кнопки «Захват». Итак, как это сделать? Мы можем сделать это разными способами, и в нашей предыдущей статье мы обсуждали, как это сделать, используя аннотацию @RequestParam. Вы можете обратиться к этой статье за полным объяснением: Как собирать данные с помощью аннотации @RequestParam в Spring . Но в этой статье мы собираемся обсудить другой подход к этому. Мы собираемся использовать концепцию DTO.

Передача данных в Spring с использованием DTO (объект передачи данных)

Сначала нам нужно создать класс DTO. Итак, перейдите в папку src/main/java и внутри этой папки создайте класс с именем NumberInfoDTO и поместите его в пакет com.geeksforgeeks.calculator.dto . Ниже приведен код файла NumberInfoDTO.java . Комментарии добавляются внутри кода, чтобы понять код более подробно.

Файл: NumberInfoDTO.java

Java




package com.geeksforgeeks.calculator.dto;
  
public class NumberInfoDTO {
  
    // Declare the number of variable
    // you want to capture the value
    private String number1;
    private String number2;
  
    // Generate the getter, 
    // setter and toString method
    public String getNumber1() {
        return number1;
    }
  
    public void setNumber1(String number1) {
        this.number1 = number1;
    }
  
    public String getNumber2() {
        return number2;
    }
  
    public void setNumber2(String number2) {
        this.number2 = number2;
    }
  
    @Override
    public String toString() {
        return "NumberInfoDTO [number1=" + number1 + ", number2=" + number2 + "]";
    }
  
}

Поскольку мы написали эту строку внутри файла welcome-page.jsp

<form action="process-homepage" method="get">

Поэтому нам нужно создать контроллер с конечной точкой «process-homepage». Теперь снова вернитесь к файлу AppController.java и запишите в этот файл следующий код.

@RequestMapping("/process-homepage")
public String showResultPage(NumberInfoDTO numberInfoDTO, Model model) {

        // writing the value to the properties
        // by fetching from the URL
        model.addAttribute("numberInfo", numberInfoDTO);

        return "result-page";
}

Related Article Link: How to Create Your First Model in Spring MVC 

Ниже приведен обновленный код файла AppController.java .

Файл: обновленный файл AppController.java

Java




package com.geeksforgeeks.calculator.controllers;
  
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
  
import com.geeksforgeeks.calculator.dto.NumberInfoDTO;
  
@Controller
public class AppController {
  
    @RequestMapping("/home")
    public String showHomePage() {
        return "welcome-page";