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