Вступление
Поскольку спецификация 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
|
@Configurationpublic 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.sqlDROP 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.sqlINSERT 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
|
@Datapublic 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
|
@Servicepublic 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
|
@Configurationpublic 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> <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, являются их собственными. |