Пример простой системы заказа товара. Часть 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
Бизнес часто имеет дело с иностранными поставщиками и/или покупателями. Не стоит пренебрегать интернационализацией. Даже не все крупные ВЕБ-магазины могут похвастаться интернационализацией подобной той, что реализована в ВЕБ-магазине Беижсофт ЕИС.
Заключение
Это простейший пример. ИТОГО нужно заполнять вручную. В дальнейшем мы доработаем приложение для автоматического расчета итогов.