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

Заключение

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