Разработка веб-систем — это реальность на современном рынке, а инфраструктура Jakarta Server Faces — это стандартная опция Jakarta EE для решения подобных проблем. Одной из характеристик JSF является работа, ориентированная на компоненты экрана и их события (например, щелчки). Таким образом, мы можем связать эти компоненты с различными аспектами нашей системы, такими как выполнение бизнес-операций, преобразование значений, проверка полей и т. Д. В этой статье мы поговорим об этом JSF и о том, как переместить это приложение в Облако с Platform.sh.
Чтобы отпраздновать новый год, давайте создадим небольшой список пожеланий на Java с использованием технологий Jakarta EE. Во внешнем интерфейсе мы будем использовать Java Server Faces (JSF) , среду веб-приложений на основе Java, которая упрощает разработку и интеграцию пользовательских интерфейсов на основе веб-интерфейса с несколькими уже созданными компонентами. Для хранения списка воспользуемся MongoDB.
Jakarta Server Faces определяет инфраструктуру MVC для создания пользовательских интерфейсов для веб-приложений, включая компоненты пользовательского интерфейса, управление состоянием, обработку событий, проверку ввода, навигацию по страницам и поддержку интернационализации и доступности. Это MVC легко.
Как и в любом проекте Maven, первым шагом является определение зависимостей, которые требуются приложению. В этом приложении JSF и MongoDB в стеке Jakarta EE мы будем использовать JSF, Jakarta NoSQL и Primefaces. Primefaces — это библиотека компонентов с открытым исходным кодом (UI) для приложений на основе JSF.
XML
xxxxxxxxxx
1
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4
<modelVersion>4.0.0</modelVersion>
5
<groupId>sh.platform.template</groupId>
6
<artifactId>microprofile-thorntail</artifactId>
7
<version>1.0.0-SNAPSHOT</version>
8
<packaging>war</packaging>
9
10
<properties>
11
<version.thorntail>2.6.0.Final</version.thorntail>
12
<maven.compiler.source>1.8</maven.compiler.source>
13
<maven.compiler.target>1.8</maven.compiler.target>
14
<failOnMissingWebXml>false</failOnMissingWebXml>
15
<platform.sh.version>2.2.3</platform.sh.version>
16
<jakarta.nosql.version>1.0.0-b1</jakarta.nosql.version>
17
<junit.version>5.5.2</junit.version>
18
<maven.surefire.plugin.version>2.22.2</maven.surefire.plugin.version>
19
<test.containers.version>1.12.0</test.containers.version>
20
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
21
</properties>
22
<dependencyManagement>
23
<dependencies>
24
<dependency>
25
<groupId>io.thorntail</groupId>
26
<artifactId>bom-all</artifactId>
27
<version>${version.thorntail}</version>
28
<scope>import</scope>
29
<type>pom</type>
30
</dependency>
31
</dependencies>
32
</dependencyManagement>
33
34
<dependencies>
35
<dependency>
36
<groupId>io.thorntail</groupId>
37
<artifactId>jsf</artifactId>
38
</dependency>
39
<dependency>
40
<groupId>io.thorntail</groupId>
41
<artifactId>cdi</artifactId>
42
</dependency>
43
<dependency>
44
<groupId>sh.platform</groupId>
45
<artifactId>config</artifactId>
46
<version>${platform.sh.version}</version>
47
</dependency>
48
<dependency>
49
<groupId>org.eclipse.jnosql.artemis</groupId>
50
<artifactId>artemis-document</artifactId>
51
<version>${jakarta.nosql.version}</version>
52
</dependency>
53
<dependency>
54
<groupId>org.eclipse.jnosql.diana</groupId>
55
<artifactId>mongodb-driver</artifactId>
56
<version>${jakarta.nosql.version}</version>
57
</dependency>
58
<dependency>
59
<groupId>org.primefaces</groupId>
60
<artifactId>primefaces</artifactId>
61
<version>7.0</version>
62
</dependency>
63
<dependency>
64
<groupId>org.junit.jupiter</groupId>
65
<artifactId>junit-jupiter-engine</artifactId>
66
<version>${junit.version}</version>
67
<scope>test</scope>
68
</dependency>
69
<dependency>
70
<groupId>org.junit.jupiter</groupId>
71
<artifactId>junit-jupiter-params</artifactId>
72
<version>${junit.version}</version>
73
<scope>test</scope>
74
</dependency>
75
<dependency>
76
<groupId>org.testcontainers</groupId>
77
<artifactId>testcontainers</artifactId>
78
<version>${test.containers.version}</version>
79
<scope>test</scope>
80
</dependency>
81
</dependencies>
82
83
<build>
84
<finalName>wish</finalName>
85
<plugins>
86
<plugin>
87
<groupId>io.thorntail</groupId>
88
<artifactId>thorntail-maven-plugin</artifactId>
89
<version>${version.thorntail}</version>
90
</plugin>
91
<plugin>
92
<groupId>org.apache.maven.plugins</groupId>
93
<artifactId>maven-surefire-plugin</artifactId>
94
<version>${maven.surefire.plugin.version}</version>
95
</plugin>
96
</plugins>
97
</build>
98
99
</project>
100
Следующий шаг — интеграция с MongoDB; мы не будем идти дальше, потому что у нас есть две статьи о введении в Jakarta NoSQL, одна об API, а вторая о Jakarta NoSQL и о нативном облаке .
Джава
xxxxxxxxxx
1
import jakarta.nosql.mapping.Column;
2
import jakarta.nosql.mapping.Convert;
3
import jakarta.nosql.mapping.Entity;
4
import jakarta.nosql.mapping.Id;
5
6
import java.util.Objects;
7
8
9
public class Wish {
10
11
12
ObjectIdConverter.class) (
13
private String id;
14
15
16
private String dream;
17
18
//getter and setter
19
}
20
21
public interface WishRepository extends Repository<Wish, String> {
22
23
List<Wish> findAll();
24
25
}
26
Интеграция сущности и базы данных завершена. Следующим шагом является контроллер. JSF имеет управляемый компонент, который является обычным классом Java Bean, зарегистрированным в JSF. Другими словами, управляемый компонент — это компонент Java, управляемый средой JSF. Управляемый компонент содержит методы получения и установки, бизнес-логику или даже вспомогательный компонент (компонент содержит все значение формы HTML).
Джава
xxxxxxxxxx
1
import javax.enterprise.inject.Model;
2
import javax.inject.Inject;
3
import java.util.List;
4
5
6
public class WishBean {
7
8
9
private WishRepository repository;
10
11
private String wish = "";
12
13
public String getWish() {
14
return wish;
15
}
16
17
public void setWish(String wish) {
18
this.wish = wish;
19
}
20
21
public void add() {
22
repository.save(Wish.of(wish));
23
this.wish = "";
24
}
25
26
public List<Wish> getWishes() {
27
return repository.findAll();
28
}
29
30
public void remove(String id) {
31
repository.deleteById(id);
32
}
33
}
34
Бин имеет @Model
аннотацию для сопоставления этой карты с готовностью к использованию на странице JSF и имеет область запроса. Это позволит нам использовать этот класс как wishBean
. JSF имеет несколько областей применения в управляемых bean-компонентах, таких как:
-
@RequestScoped : Бин живет до тех пор, пока живет HTTP-запрос-ответ. Он создается по запросу HTTP и уничтожается, когда заканчивается ответ HTTP, связанный с запросом HTTP.
-
@ViewScoped : Бин живет до тех пор, пока пользователь взаимодействует с тем же представлением JSF в окне / вкладке браузера. Он создается по HTTP-запросу и уничтожается, когда пользователь выполняет обратную передачу в другое представление.
- @SessionScoped : Бин живет столько же, сколько и HTTP-сеанс. Он создается при первом HTTP-запросе с участием этого компонента в сеансе и уничтожается при аннулировании сеанса HTTP.
- @ApplicationScoped : Бин живет столько, сколько живет веб-приложение. Он создается при первом HTTP-запросе с участием этого компонента в приложении (или когда веб-приложение запускается, а в @ManagedBean устанавливается атрибут eager = true) и уничтожается при закрытии веб-приложения.
HTML
xxxxxxxxxx
1
2
3
4
<html xmlns="http://www.w3.org/1999/xhtml"
5
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
6
xmlns:h="http://xmlns.jcp.org/jsf/html"
7
xmlns:p="http://primefaces.org/ui">
8
<h:head>
9
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
10
<title>Wish List to the new year</title>
11
</h:head>
12
13
<h:body>
14
15
<h:form id="form">
16
17
<p:panel header="Put your dreams to the next year">
18
<p:panelGrid columns="2" layout="grid" cellpadding="4">
19
<p:inputText id="dream" value="${wishBean.wish}" label="Wish" placeholder="Wish"></p:inputText>
20
<p:commandButton id="btn" action="#{wishBean.add}" update="form" icon="ui-icon-disk"></p:commandButton>
21
</p:panelGrid>
22
</p:panel>
23
<p:dataTable id="table" var="wish" value="#{wishBean.wishes}">
24
<p:column headerText="Wish">
25
<h:outputText value="#{wish.dream}"></h:outputText>
26
</p:column>
27
<p:column>
28
<p:commandButton action="#{wishBean.remove(wish.id)}" icon="ui-icon-trash" update="form"></p:commandButton>
29
</p:column>
30
</p:dataTable>
31
</h:form>
32
33
</h:body>
34
</html>
35
Страница XHML показывает, как легко интегрировать действия с Ajax, используя Java-классы, отображаемые аннотациями JSF / CDI. В JSF у нас изначально есть Ajax, поэтому мы можем использовать атрибут update без значительных усилий во внешнем интерфейсе (например, для перечисления элементов есть место, #{wishBean.wishes}
где он вызывает метод getWishes
в классе WishBean
.
Структура Platform.sh
Приложение Java готово к работе! Следующим шагом является установка файлов Platform.sh, необходимых для управления и развертывания приложения. В нашем первом сообщении о Java мы подробно рассмотрели каждую из этих трех файлов:
-
Один маршрутизатор (.platform / rout.yaml). Platform.sh позволяет вам определять маршруты .
-
Ноль или более служебных контейнеров (.platform / services.yaml). Platform.sh позволяет вам полностью определить и настроить топологию и сервисы, которые вы хотите использовать в своем проекте.
-
Один или несколько контейнеров приложений (.platform.app.yaml). Вы управляете своим приложением и тем, как оно будет построено и развернуто на Platform.sh через один файл конфигурации .
Мы изменим services.yaml, чтобы добавить MongoDB.
YAML
xxxxxxxxxx
1
mongodb
2
type mongodb3.6
3
disk512
4
Мы установим файл заявки.
YAML
xxxxxxxxxx
1
# This file describes an application. You can have multiple applications
2
# in the same project.
3
#
4
# See https://docs.platform.sh/user_guide/reference/platform-app-yaml.html
5
6
# The name of this app. Must be unique within a project.
7
name app
8
9
# The runtime the application uses.
10
type"java:11"
11
12
disk1024
13
14
# The hooks executed at various points in the lifecycle of the application.
15
hooks
16
build mvn -DskipTests clean package thorntail package
17
18
# The relationships of the application with services or other applications.
19
#
20
# The left-hand side is the name of the relationship as it will be exposed
21
# to the application in the PLATFORM_RELATIONSHIPS variable. The right-hand
22
# side is in the form `<service name>:<endpoint name>`.
23
relationships
24
mongodb'mongodb:mongodb'
25
26
# The configuration of app when it is exposed to the web.
27
web
28
commands
29
start java -jar -Xmx2048m -Dswarm.http.port=$PORT -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true target/wish-thorntail.jar
Переместить проект в репозиторий Github
Мы создадим Git-репозиторий и учетную запись Platform.sh в три простых шага:
Эта интеграция позволяет нам, как только мы отправим код в основную ветку в репозитории Github, Platform.sh автоматически сгенерирует приложение для нас.
В этой статье мы обсудили JSF и то, как легко интегрировать приложения Java в Jakarta EE. Программное обеспечение с CI / CD имеет отличную гарантию качества, является лучшей практикой и делает Platform.sh идеально подходящим для вашего следующего облачного проекта.
Источник : https://github.com/soujava/wishlist .