Пример простой системы заказа товара. Часть 2, облачная WAR версия.

Создание WAR Мавен проекта.

Создайте папку проекта "myappweb" и файл pom.xml в ней:

<?xml version="1.0"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>


<groupId>org.myapp</groupId>

<version>1.0-SNAPSHOT</version>

<artifactId>ordering-web</artifactId>

<packaging>war</packaging>


<name>My ordering WEB-application.</name>

<inceptionYear>2019</inceptionYear>


<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<java.version>1.7</java.version>

</properties>


<dependencies>

<dependency>

<groupId>org.myapp</groupId>

<artifactId>ordering</artifactId>

<version>1.0-SNAPSHOT</version>

</dependency>

<dependency>

<groupId>org.beigesoft</groupId>

<artifactId>beige-web-jar</artifactId>

<version>1.0</version>

<exclusions>

<exclusion>

<groupId>org.beigesoft</groupId>

<artifactId>beige-blc</artifactId>

</exclusion>

</exclusions>

</dependency>

<dependency>

<groupId>org.apache.taglibs</groupId>

<artifactId>taglibs-standard-spec</artifactId>

<version>1.2.5</version>

</dependency>

<dependency>

<groupId>org.apache.taglibs</groupId>

<artifactId>taglibs-standard-impl</artifactId>

<version>1.2.5</version>

</dependency>

<dependency>

<groupId>org.beigesoft</groupId>

<artifactId>beige-web</artifactId>

<version>1.0</version>

<type>war</type>

<scope>runtime</scope>

</dependency>

</dependencies>


<build>

<finalName>${project.artifactId}</finalName>

<resources>

<!--Apache Tomcat7 loads jars ordered by name, so beige-blc.jar

is loaded first. Placing ordered resources

to the WEB-INF/classes folder resolves this problem:-->

<resource>

<directory>..${file.separator}myapp${file.separator}src${file.separator}main${file.separator}resources</directory>

</resource>

</resources>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-install-plugin</artifactId>

<version>2.5.2</version>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-deploy-plugin</artifactId>

<version>2.8.2</version>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-resources-plugin</artifactId>

<version>2.7</version>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.22.1</version>

<configuration>

<useSystemClassLoader>false</useSystemClassLoader>

<useFile>false</useFile>

<trimStackTrace>false</trimStackTrace>

</configuration>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.1</version>

<configuration>

<source>${java.version}</source>

<target>${java.version}</target>

<compilerArgs>

<arg>-Xlint:all,-options,-path</arg>

</compilerArgs>

</configuration>

</plugin>

<plugin>

<artifactId>maven-war-plugin</artifactId>

<version>3.1.0</version>

<configuration>

<overlays>

<overlay />

<overlay>

<groupId>org.beigesoft</groupId>

<artifactId>beige-web</artifactId>

<excludes>

<exclude>META-INF${file.separator}BEIGESOF.RSA</exclude>

<exclude>META-INF${file.separator}BEIGESOF.SF</exclude>

</excludes>

</overlay>

</overlays>

</configuration>

</plugin>

</plugins>

</build>

</project>

* Это будет WAR архив ВЕБ-приложения по стандарту Джава Интерпрайз Едишин. И WAR и JAR в действительности ZIP архивы.

Создайте папки для исходного кода:

myappweb - src - main - java - org - myapp - ordering

myappweb - src - main - webapp - WEB-INF - jsp

myappweb - src - main - webapp - META-INF

Добавление ИС моделей в меню ВЕБ-интерфейса

Скопируйте dsk.jsp из базовой библиотеки beige-web в "myappweb - src - main - webapp - WEB-INF - jsp" и добавьте HTML DIV элемент класса "dropdown" содержащий модели аналогично существующему меню:

...

<div class="navbar">

<div class="dropdown">

<a href="#" class="dropdown-btn">${i18n.getMsg("Ordering", rvs.upf.lng.iid)}</a>

<div class="dropdown-content">

<a href="#" onclick="bsGtAjx('GET', 'srv?act=lst&rnd=lhj&ent=Customer&pg=1');">${i18n.getMsg("Customers", rvs.upf.lng.iid)}</a>

<a href="#" onclick="bsGtAjx('GET', 'srv?act=lst&rnd=lhj&ent=Merchandise&pg=1');">${i18n.getMsg("Merchandises", rvs.upf.lng.iid)}</a>

<a href="#" onclick="bsGtAjx('GET', 'srv?act=lst&rnd=lhj&ent=COrder&pg=1');">${i18n.getMsg("Orders", rvs.upf.lng.iid)}</a>

</div>

</div>

<div class="dropdown">

...

Сделайте тоже для Мобильного вида - mbl.jsp.

web.xml

Скопируйте web-sqlite.xml из исходного кода beige-web в папку "myappweb - src - main - webapp - WEB-INF", переименуйте его в "web.xml" и измените класс фабрики приложения:

...

<context-param>

<param-name>fctAppCls</param-name>

<param-value>org.myapp.ordering.FctAppSqlt</param-value>

</context-param>

...

web.xml это главный файл описывающий ВЕБ-приложение по стандарту JEE.

Создание фабрики приложения для WAR версии.

Фабрика приложения это класс создающий все сервисы (в том числе вложенные фабрики) данного приложения в режиме "инициализация по запросу". Например сервис создающий PDF отчет будет создан когда пользователь нажмет "печать заказа в ПДФ". Фабрики для разных платформ (ОС) отличаются. На данный момент просто скопируйте файл org.beigesoft.war.FctAppSqlt.java из "beige-web" в "myappweb - src - main - java - org - myapp - ordering" и измените путь его "Пакета" (package).

Авторизация через базу данных (JEE JDBC authentication).

* На данный момент браузеры могут блокировать JEE "JSESSIONID" куки при незашифрованном HTTP соединении! Так делает Хром. В итоге Вы получите "HTTP Status 408 – Request Timeout on http://localhost:8080/myappweb/sec/j_security_check". Т.е. Вам нужно либо установить HTTPS, смотрите: Import an EIS database by using WEB-service, или отключить JEE аутентификацию в web.xml! Авторизация без шифрованного соединения конечно-же бесполезна.

Для Томкэт стандарта нужно скопировать context-sqlt.xml из beige-web в "myappweb - src - main - webapp - META-INF" и переименовать его в "context.xml", затем изменить путь к базе данных:

...

connectionURL="jdbc:sqlite:../webapps/ordering-web/myordering.sqlite"

...


Первый запуск.

Используя терминал (Power Shell) запустите команду "mvn clean install" в корне папок обоих проектов (где pom.xml), конечно сперва в myapp затем в myappweb. Скомпилированные библиотеки ordering.jar и ordering-web.war будут в папке "target". Запустите Томкэт дважды щелкнув файл "startup.bat" для Виндоус или "startup.sh" для Юникс-подобной ОС в папке Томкэта "bin". Скопируйте ordering-web.war в папку Томкэта "webapps". Томкэт развернет и запустит приложения, приложение создаст и заполнит СКЛайт (SQLite) базу данных "ordering-web/myordering.sqlite"

Вы должны были установить базу данных Эйч2 (H2) описанную во третьей статье. Запустите утилиту Эйч2 консоль (H2 console): в папке "bin" запустите "h2.bat" (Виндоус) или "h2.sh" (Юникс подобная ОС). Браузер откроет интерфейс данной утилиты, выберите "Сохранить настройки"-"Generic SQLite" и напишите путь к базе данных в JDBC URL, например "jdbc:sqlite:C:\programmer\java\apache-tomcat-7.0.96\webapps\ordering-web\myordering.sqlite", пользователь и пароль не важны:

Нажмите "Соединиться", Эйч2 консоль покажет все созданные таблицы, для авторизации нужно добавить пользователей и их пароли, скопируйте следующие команды в окно консоли и исполните их:

insert into USTMC (USR, PWD, VER) values ('admin', 'admin', 1);

insert into USTMC (USR, PWD, VER) values ('user', 'user', 1);

insert into USRLTMC (USR, ROL, VER) values ('admin', 'admin', 1);

insert into USRLTMC (USR, ROL, VER) values ('user', 'user', 1);

* Смотрите конец web.xml где описаны роли и пути требующие авторизации.

После этого вы можете авторизоваться для работы с заказами (пользователь/пароль admin/admin), наберите в браузере "http://localhost:8080/ordering-web":

Списки ИС моделей, формы их редактирования и их подборщик будут сгенерированы автоматически.

Здесь браузер не блокировал JEE "JSESSIONID" куки при незашифрованном HTTP соединении!

Интернационализация.

Для интернационализации используйте ${i18n.getMsg("COrder", rvs.upf.lng.iid)} в странице JSP. Нужно добавить все сообщения по Русски в Msgs_ru_RU-UTF8.properties и по Английски в Msgs_en_US.properties. Скопируйте эти файлы из beige-blc/src/main/resources и измените. После нужно перекодировать UTF8 в ASCII кодировку:

native2ascii -encoding UTF-8 Msgs_ru_RU-UTF8.properties Msgs_ru_RU.properties

Бизнес часто имеет дело с иностранными поставщиками и/или покупателями. Не стоит пренебрегать интернационализацией. Даже не все крупные ВЕБ-магазины могут похвастаться интернационализацией подобной той, что реализована в ВЕБ-магазине Беижсофт ЕИС.

Заключение

Это простейший пример. ИТОГО нужно заполнять вручную. В дальнейшем мы доработаем приложение для автоматического расчета итогов.