Статьи

Как развернуть приложение Spring без web.xml в Tomcat

Вступление

Поскольку спецификация Servlet 3 web.xml больше не требуется для настройки вашего веб-приложения и была заменена аннотациями. В этой статье мы рассмотрим, как развернуть простое приложение на основе Spring без web.xml в Tomcat 8.5. *.

Создание пустого приложения

Используйте следующую команду для создания пустого веб-приложения с использованием архетипа maven webapp:

1
2
mvn archetype:generate -DgroupId=info.sanaulla -DartifactId=spring-tomcat-sample
   -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-webapp

Удалите web.xml созданный в src\main\webapp\WEB-INF и затем нам нужно обновить maven-war-plugin чтобы он не web.xml если отсутствует web.xml , это можно сделать, обновив информацию о плагине в build отметьте как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <id>default-war</id>
      <phase>prepare-package</phase>
      <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
      </configuration>
    </execution>
  </executions>
</plugin>

Настройка зависимостей

Нам понадобятся следующие зависимости, добавленные в pom.xml :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.thymeleaf</groupId>
  <artifactId>thymeleaf-spring5</artifactId>
  <version>${thymeleaf.version}</version>
</dependency>
<dependency>
  <groupId>nz.net.ultraq.thymeleaf</groupId>
  <artifactId>thymeleaf-layout-dialect</artifactId>
  <version>${thymeleaf-layout-dialect.version}</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>${jackson.version}</version>
</dependency>
<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>${h2.version}</version>
</dependency>
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
  <version>${lombok.version}</version>
</dependency>

И соответствующие им свойства версии приведены ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
<properties>
  <maven.compiler.target>1.8</maven.compiler.target>
  <maven.compiler.source>1.8</maven.compiler.source>
  <java.version>1.8</java.version>
 
  <apache.commons.version>3.6</apache.commons.version>
  <h2.version>1.4.196</h2.version>
  <jackson.version>2.9.2</jackson.version>
  <lombok.version>1.16.18</lombok.version>
  <spring.version>5.0.0.RELEASE</spring.version>
  <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
  <thymeleaf-layout-dialect.version>2.2.1</thymeleaf-layout-dialect.version>
</properties>

Настройка H2 Embedded DB

Давайте создадим компонент конфигурации для настройки нашего источника данных, который является Embedded H2, и создания компонента типа NamedParameterJdbcTemplate :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
public class DBConfiguration {
 
  @Bean
  public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
      .generateUniqueName(false)
      .setName("testdb")
      .setType(EmbeddedDatabaseType.H2)
      .addDefaultScripts()
      .setScriptEncoding("UTF-8")
      .ignoreFailedDrops(true)
      .build();
  }
 
  @Bean
  public NamedParameterJdbcTemplate namedParamJdbcTemplate() {
    NamedParameterJdbcTemplate namedParamJdbcTemplate =
      new NamedParameterJdbcTemplate(dataSource());
    return namedParamJdbcTemplate;
  }
}

Затем нам понадобится сценарий SQL schema.sql который будет настраивать таблицы, а data.sql будет data.sql их данными при каждом запуске приложения. Давайте создадим соответствующие файлы в src/main/resources :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
-- schema.sql
DROP TABLE IF EXISTS person;
 
CREATE TABLE person(
  id NUMERIC IDENTITY PRIMARY KEY,
  first_name VARCHAR(512) NOT NULL,
  last_name VARCHAR(512) NOT NULL,
  date_of_birth TIMESTAMP NOT NULL,
  place_of_birth VARCHAR(512)
);
 
-- data.sql
INSERT INTO person(first_name, last_name, date_of_birth, place_of_birth)
VALUES ('First', 'Last', DATE '1990-02-21', 'Bangalore');
INSERT INTO person(first_name, last_name, date_of_birth, place_of_birth)
VALUES ('First2', 'Last2', DATE '1987-02-21', 'Mumbai');
INSERT INTO person(first_name, last_name, date_of_birth, place_of_birth)
VALUES ('First3', 'Last3', DATE '1996-02-21', 'Chennai');
INSERT INTO person(first_name, last_name, date_of_birth, place_of_birth)
VALUES ('First4', 'Last4', DATE '1978-02-21', 'Delhi');

Создание API-контроллера

Позволяет нам создать модельный класс Person :

1
2
3
4
5
6
7
8
@Data
public class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private Date dateOfBirth;
  private String placeOfBirth;
}

И соответствующий класс DAO PersonDAO :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@Service
public class PersonDAO {
 
  @Autowired NamedParameterJdbcTemplate jdbcTemplate;
 
  public List<Person> getPersons(){
    return jdbcTemplate.query("SELECT * FROM person",
      (ResultSet rs, int rowNum) -> {
        Person p = new Person();
        p.setId(rs.getInt("id"));
        p.setFirstName(rs.getString("first_name"));
        p.setLastName(rs.getString("last_name"));
        p.setDateOfBirth(rs.getDate("date_of_birth"));
        p.setPlaceOfBirth(rs.getString("place_of_birth"));
        return p;
    });
  }
}

Контроллер API выглядит так:

01
02
03
04
05
06
07
08
09
10
11
@RestController
@RequestMapping("/api/persons")
public class ApiController {
 
  @Autowired PersonDAO personDao;
 
  @GetMapping
  public ResponseEntity<?> getPersons(){
    return ResponseEntity.ok(personDao.getPersons());
  }
}

Развертывание приложения в Tomcat

Я предполагаю, что вы скачали Tomcat и распаковали его в свою файловую систему. В целях разработки я предпочитаю обновить server.xml чтобы настроить контекст и указать на разнесенный каталог war, как показано ниже:

1
2
<Context path="/sample" reloadable="true"
  docBase="G:\samples\spring-tomcat-sample\target\spring-tomcat-sample" />

Для развертываний, связанных с производством, вы можете загрузить войну на сервер.

Поэтому после запуска сервера вы можете проверить правильность развертывания приложения, посетив URL-адрес API http: // localhost: 8080 / sample / api / people в браузере, чтобы получить данные, как показано ниже:

Настройка Thymeleaf

Теперь давайте настроим Thymeleaf как наш шаблонизатор для обслуживания пользовательского интерфейса для нашего приложения. Для его настройки требуются следующие определения компонентов:
— Техника для разрешения шаблонов. Есть много возможностей, и мы будем использовать распознаватель шаблонов на основе Classpath
— Создайте экземпляр SpringTemplateEngine и установите технику распознавания шаблонов.
— Настройте ViewResolver Spring для использования SpringTemplateEngine

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Configuration
public class ViewConfiguration {
 
  @Bean
  public ClassLoaderTemplateResolver templateResolver() {
    ClassLoaderTemplateResolver templateResolver =
      new ClassLoaderTemplateResolver();
    templateResolver.setPrefix("templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode(TemplateMode.HTML);
    templateResolver.setCacheable(false);
    return templateResolver;
  }
 
  @Bean
  public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine =
      new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());
    templateEngine.addDialect(new LayoutDialect());
    return templateEngine;
  }
 
  @Bean
  public ViewResolver viewResolver() {
    ThymeleafViewResolver viewResolver =
      new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setCharacterEncoding("UTF-8");
    return viewResolver;
  }
 
}

Создание View Controller

Давайте создадим простой контроллер, который будет обслуживать наши шаблоны пользовательского интерфейса:

01
02
03
04
05
06
07
08
09
10
11
12
@Controller
@RequestMapping("/")
public class ViewController {
 
  @Autowired PersonDAO personDao;
 
  @GetMapping
  public String index(Model model) {
    model.addAttribute("persons", personDao.getPersons());
    return "index";
  }
}

Создание шаблона на основе Thymeleaf

Нам нужно создать шаблон index.html который возвращается из вышеприведенного контроллера:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
  xmlns:th="http://www.thymeleaf.org">
  <head>
    <link rel="stylesheet"
  </head>
  <body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
      <a class="navbar-brand" href="#">Spring on Tomcat</a>
    </nav>
    <div class="container">
      <div class="page-header"><h1>Spring on Tomcat</h1></div>
      <div class="row">
        <div class="col">
          <ul class="list-group">
            <li class="list-group-item" th:each="p : ${persons}">
            [[${p.firstName}]] [[${p.lastName}]],
            Date Of Birth: [[${#dates.format(p.dateOfBirth, 'dd/MMM/yyyy')}]]
            Place: [[${p.placeOfBirth}]]
            </li>
          </ul>
        </div>
      </div>
    </div>
  </body>
</html>

Вывод

В этой статье мы рассмотрели настройку простого приложения на основе Spring MVC без web.xml (без использования Spring Boot) и его развертывание в Tomcat. Мы также настроили Thymeleaf для отображения наших шаблонов пользовательского интерфейса. Полный код для этого можно найти здесь

Опубликовано на Java Code Geeks с разрешения Мохамеда Санауллы, партнера нашей программы JCG . См. Оригинальную статью здесь: Как развернуть приложение Spring без web.xml на Tomcat

Мнения, высказанные участниками Java Code Geeks, являются их собственными.