Овладяване на Spring framework 5, Част 1: Spring MVC

Spring MVC е традиционната библиотека на Spring framework за изграждане на уеб приложения на Java. Това е една от най-популярните уеб рамки за изграждане на напълно функционални Java уеб приложения и RESTful уеб услуги. В този урок ще получите преглед на Spring MVC и ще научите как да изграждате уеб приложения на Java с помощта на Spring Boot, Spring Initializr и Thymeleaf.

изтегляне Изтегляне на кода Вземете изходния код, например приложения в този урок. Създаден за JavaWorld от Стивън Хейнс

Spring Boot с Spring Initializr

Ще премахнем нашето уеб приложение Spring MVC с помощта на Spring Boot и Spring Initializr. Като даден вход за типа на приложението, което трябва да бъде изградено, Spring Initializr използва най-често срещаните зависимости и настройки по подразбиране за настройка и конфигуриране на основно приложение Spring Boot. Можете също да добавите персонализирани зависимости и Spring Initializr ще ги включва и управлява, осигурявайки съвместимост на версиите както със софтуер на трети страни, така и с Spring. Приложенията Spring Boot се изпълняват самостоятелно, без да изискват от вас да осигурите среда за изпълнение.

В този случай, тъй като изграждаме уеб приложение, Spring Boot автоматично ще включва и конфигурира Tomcat като част от времето на изпълнение на приложението. Също така можем да персонализираме приложението, като добавим драйвер за база данни H2 към нашия Maven POM файл. След това Spring Boot автоматично ще създаде вградена база данни и DataSourceекземпляр в контекста на приложението. След като зависимостите бъдат зададени, Spring Boot ще предостави конфигурации по подразбиране за приложението. Разбира се, ние можем да променим конфигурациите, ако искаме, но благодарение на Spring Boot имаме headstart: напълно конфигурирано, работещо приложение веднага от кутията.

След като сме избрали и конфигурирали нашите зависимости, ще ги предадем на Spring Initializr, който ще предостави ZIP файл с възможност за изтегляне, съдържащ базовия проект на Spring Boot.

Пролетен MVC с H2 механизъм за бази данни

Ще започнем със създаването на основно уеб приложение Spring MVC, което съхранява данни във вградена база данни H2.

Стъпка 1. Инсталирайте и конфигурирайте приложението

Придвижете се до Spring Initializr на start.spring.io и изберете Генериране на проект Maven с Java и Spring Boot 2.0.X , където X е най-новата версия на Spring Boot (2.0.3 към момента на писането). Уверете се, че сте избрали Spring Boot 2.x, за да можете да внедрите Spring Web MVC 5. Spring Boot 1.4 и Spring Boot 1.5 ще внедрят Spring 4.

Въведете име на група с формата, съответстващ на вашия уеб адрес, като например com.geekcap.javaworld, и въведете име на артефакт, като например spring5mvc-example. Фигура 1 показва моята конфигурация.

Стивън Хейнс

За да добавите зависимости към уеб приложението, можете или да въведете списък със зависимости, разделен със запетая, в текстовото поле Търсене на зависимости или да кликнете върху Превключване към пълната версия . Ще поемем по-лесния път, като кликнете върху Превключване към пълната версия . Зависимостите са разделени на групи, като Core, Web и Template Engines. За този пример поставете отметки в квадратчетата за: Web -> Web, Template Engines -> Thymeleaf, SQL -> JPA и SQL -> H2 . Ето какво ще добави всяка от тези селекции към приложението:

  • Web: Spring MVC и Tomcat
  • Thymeleaf: Двигател за уеб шаблони на Thymeleaf
  • JPA: Spring JPA, Hibernate и Spring Data
  • H2: Вградената база данни H2

Когато приключите, щракнете върху бутона Генериране на проект в долната част на страницата. Spring Initializr ще създаде готов ZIP файл с всички необходими източници на проекта, който можете да изтеглите.

Стъпка 2. Импортирайте проекта Spring Initializr във вашата IDE

Извлечете ZIP файла от Spring Initializr, след което импортирайте проекта в любимата си IDE. Например, за да импортирате проекта в IntelliJ, изберете Файл -> Нов проект , както е показано на Фигура 2.

Стивън Хейнс

Стъпка 3. Настройте вашия Maven POM

След това отидете на Импортиране на проект от външен модул , изберете Maven и натиснете Напред . Не забравяйте да изберете SDK за проект на Java 1.8, след което натиснете Finish .

Началното приложение Spring Boot

Сега нека да разгледаме стартовото приложение Spring Boot, което е генерирано от нашите (минимални) усилия досега.

За начало, Листинг 1 показва файла Maven POM.

Листинг 1. Maven pom.xml

   4.0.0 com.geekcap.javaworld spring5mvc-example 0.0.1-SNAPSHOT jar spring5mvc-example Demo project for Spring Boot  org.springframework.boot spring-boot-starter-parent 2.0.3.RELEASE     UTF-8 UTF-8 1.8    org.springframework.boot spring-boot-starter-data-jpa   org.springframework.boot spring-boot-starter-thymeleaf   org.springframework.boot spring-boot-starter-web   com.h2database h2 runtime   org.springframework.boot spring-boot-starter-test test      org.springframework.boot spring-boot-maven-plugin     

Забележете, че файлът POM използва специален родител POM: spring-boot-starter-parent. Ще използваме родителския POM, за да управляваме версиите на всички наши зависимости и да гарантираме, че версиите са съвместими. Хранилищата в края на POM файла се отнасят до хранилищата на пролетната снимка и етапа . Нуждаем се от тях, защото Spring Boot 2.x все още е важен момент по време на писането.

Зависимостите са съвсем минимални и повечето са предшествани с spring-boot-starter:

  • spring-boot-starter-data-jpa
  • spring-boot-starter-thymeleaf
  • spring-boot-starter-web
  • spring-boot-starter-test

Всяка от тези стартерни зависимости носи всички необходими подзависимости. Фигура 3 показва частично разширения изглед на зависимостта в IntelliJ.

Стивън Хейнс

POM файлът включва следните зависимости:

  • spring-boot-starter-data-jpa включва Hibernate и Spring Data.
  • spring-boot-starter-thymeleaf включва механизма за шаблони на Thymeleaf.
  • spring-boot-starter-webвключва spring-boot-starter-tomcat, вградена версия на Apache Tomcat.
  • spring-boot-starter-json включва библиотеките на Jackson JSON.
  • spring-web and spring-webmvc включва Spring MVC.
  • spring-boot-starter-test включва библиотеки за тестване като JUnit и Mockito.

Когато Spring Boot вижда тези зависимости в CLASSPATH, той инициира автоматична конфигурация. Например, когато намери spring-boot-starter-web, той създава вградена версия на Tomcat, а когато намери H2 и spring-boot-starter-jpaсъздава H2 вградена база данни и хибернация EntityManager. След това свързва данните EntityManagerв Spring Data.

Spring Boot също създава един клас, който може да се използва за стартиране на приложението. Класът за примерното приложение е показан в Листинг 2.

Листинг 2. Spring5mvcExampleApplication.java

 package com.geekcap.javaworld.spring5mvcexample; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Spring5mvcExampleApplication { public static void main(String[] args) { SpringApplication.run(Spring5mvcExampleApplication.class, args); } } 

This class leverages the SpringApplication.run() method, passing in the class to run (Spring5mvcExampleApplication in this example). The @SpringBootApplication annotation includes the following annotations:

  • @Configuration informs Spring that the Spring5mvcExampleApplication class contains configuration information. (This annotation can be used to create beans that will get registered with the Spring context.)
  • @EnableAutoConfiguration tells Spring to automatically configure resources from dependencies found in the CLASSPATH, such as H2 and Tomcat.
  • @ComponentScan tells Spring to scan packages in the CLASSPATH under the current package (com.geekcap.javaworld.spring5mvcexample) for Spring-annotated components such as @Service and @Controller.

Spring scans the CLASSPATH and automatically creates components such as the embedded Tomcat server and H2 database. It then populates the Spring context with the application components found in the package scan. In essence, Spring Boot makes it very easy to select and configure the services, components, controllers, entities, and so forth that you need for your application. Once you've done that, Spring will automatically find them, make them available in the Spring context, and autowire everything together.

We've got our Spring Boot starter project setup and ready to go. In the next section we'll create the Spring MVC components for our Java web application.

What is the Spring context?

The Spring context is a registry of all available Spring beans. Classes are identified as Spring beans by annotating them with specific Spring annotations. Examples include @Service, which identifies a business service, @Controller, which identifies a Spring MVC controller (i.e., handles web requests), and @Entity, which is a JPA annotation used to identify classes that are mapped to database tables.

Once these beans are annotated they need to be registered with the Spring context, which Spring Boot does by performing a package scan of all classes in packages in your project. As the Spring context is being built, it implements the inversion-of-control (IoC) design pattern through dependency injection: when a Spring bean needs a dependency, such as a service or repository, the bean can either define a constructor that accepts the dependent bean or it can leverage the @Autowired annotation to tell Spring that it needs that dependency. Spring resolves all dependencies and "autowires" the application together.

Dependency Injection is a powerful design pattern because, rather than creating and managing dependencies inside your code--which can be messy and leads to tightly coupled classes--you can instead delegate control to the Spring container. Your class simply tells the container what dependencies it needs to run and the container provides the appropriate dependencies to your class at runtime.

About Spring MVC 5

Spring MVC implements the popular Model-View-Controller pattern, which you've probably seen in other web frameworks. The Model-View-Controller pattern separates concerns into three categories:

  • Model represents your domain objects.
  • View renders your model to a view, such as to an HTML page.
  • Controller sits between your view and model and translates change requests in the view into changes in the model, and vice versa. In practical terms, the controller accepts incoming requests, potentially updates the model, and sends your model objects to a "view" to render back to the client.

In Spring MVC, controllers are identified by the @Controller annotation and accompanied by a @RequestMapping annotation. The annotation defines the HTTP verb (standard HTTP commands like GET, POST, PUT, and DELETE) and URI for which the request-mapping method will be applied. Spring 4 introduced shortcut request mappings, which make things even easier. We'll use these mappings--@GetMapping, @PostMapping, @PutMapping, @PatchMapping, and @DeleteMapping--for our example application.

The model in Spring MVC

За нашето приложение ще дефинираме прост обект на модел, а Widget, ще го съхраним във вградена база данни H2 и ще изградим контролер за управление на джаджи. Нека започнем с Widgetкласа, който е показан в Листинг 3.