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