Упражнение. Создание веб-приложения JavaServer Faces на Tomcat

Завершено

Вас попросили создать веб-приложение JavaServer Faces (JSF) для отправки форм. Вы создадите веб-приложение и развернете его локально на сервере Tomcat.

Создание простого веб-приложения JSF на Tomcat

В этом упражнении мы создадим проект Maven для веб-приложения Java. После создания проекта нужно будет настроить три конфигурации. В первой в файл pom.xml добавляются библиотеки зависимостей. Во второй для использования внедрения контекстов и зависимостей (CDI) создается файл конфигурации CDI в виде beans.xml. В третьей настраивается JSF для файла web.xml. После настройки конфигураций можно создать веб-страницу JSF и класс backing bean для внутренней операции на стороне сервера. В конечном итоге мы выполним ее оценку в локальной среде Tomcat.

Создание проекта Maven

Выполните следующую команду архетипа Maven. Эта команда создаст проект Maven для веб-приложения Java.

mvn archetype:generate \
-DgroupId=com.microsoft.azure.samples \
-DartifactId=azure-javaweb-app \
-DarchetypeArtifactId=maven-archetype-webapp \
-Dversion=1.0-SNAPSHOT \
-DinteractiveMode=false

Вы увидите следующие выходные данные:

[INFO] Parameter: package, Value: com.microsoft.azure.samples
[INFO] Parameter: groupId, Value: com.microsoft.azure.samples
[INFO] Parameter: artifactId, Value: azure-javaweb-app
[INFO] Parameter: packageName, Value: com.microsoft.azure.samples
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /private/tmp/TMP/azure-javaweb-app
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.416 s
[INFO] Finished at: 2020-11-02T11:12:58+09:00
[INFO] ------------------------------------------------------------------------

Вам доступны следующие файлы и каталоги.

├── pom.xml
└── src
 └── main
     ├── resources
     └── webapp
         ├── WEB-INF
         │   └── web.xml
         └── index.jsp

Изменение файла Maven pom.xml

Чтобы использовать библиотеки JSF, необходимо добавить следующие библиотеки зависимостей в pom.xml.

Замените содержимое pom.xml следующим кодом:

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.microsoft.azure.samples</groupId>
<artifactId>azure-javaweb-app</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>azure-javaweb-app Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
 <maven.compiler.source>8</maven.compiler.source>
 <maven.compiler.target>8</maven.compiler.target>
 <failOnMissingWebXml>false</failOnMissingWebXml>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
 <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>4.0.1</version>
   <scope>provided</scope>
 </dependency>
 <dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.faces</artifactId>
   <version>2.4.0</version>
 </dependency>
 <dependency>
   <groupId>org.primefaces</groupId>
   <artifactId>primefaces</artifactId>
   <version>8.0</version>
 </dependency>
 <dependency>
   <groupId>org.jboss.weld.servlet</groupId>
   <artifactId>weld-servlet</artifactId>
   <version>2.4.8.Final</version>
 </dependency>
 <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.12</version>
   <scope>provided</scope>
 </dependency>
 <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
 </dependency>
 <dependency>
   <groupId>org.mockito</groupId>
   <artifactId>mockito-core</artifactId>
   <version>2.23.0</version>
   <scope>test</scope>
 </dependency>
</dependencies>
<build>
 <finalName>azure-javaweb-app</finalName>
</build>
</project>

Если необходимо использовать Java SE 11 вместо Java 8, измените следующую запись pom.xml:

 <maven.compiler.source>11</maven.compiler.source>
 <maven.compiler.target>11</maven.compiler.target>

Включение внедрения контекстов и зависимостей

Затем предоставьте CDI для веб-приложения. Создайте файл beans.xml в каталоге src/main/WEB-INF и опишите следующее содержимое:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>

Включение JSF

Затем, чтобы распознать все файлы с расширением xhtml как JSF Facelets, внесите следующие изменения в web.xml в каталоге WEB-INF.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">

<servlet>
 <servlet-name>Faces Servlet</servlet-name>
 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>

<context-param>
 <param-name>primefaces.THEME</param-name>
 <param-value>nova-light</param-value>
</context-param>

<servlet-mapping>
 <servlet-name>Faces Servlet</servlet-name>
 <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<welcome-file-list>
 <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
</web-app>

Изменение имени index.jsp

Теперь, когда параметры среды для запуска JSF готовы, пришло время создать страницу JSF. Веб-страницы JSF записываются в формате XHTML-файла вместо JSP, как указано для web.xml в предыдущем примере. Поэтому измените имя файла index.jsp, который был автоматически создан при создании проекта для index.xhtml.

mv index.jsp index.xhtml

Создание базовой веб-страницы для JSF

Удалите все содержимое, описанное в index.xhtml, и скопируйте следующий код:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html
 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui">
<h:head>
 <title>Input Value Counter Sample</title>
</h:head>
<h:body>
 <h:form>
     <p:outputLabel value="Basic" /><br />
     <p:inputText value="#{indexcontroller.inputValue}" /><br />
     <p:commandButton update="ajaxUpdateText" value="Submit" action="#{indexcontroller.submitButtonAction()}" />
     <br />
     <p:outputLabel id="ajaxUpdateText" value="Input Value: #{indexcontroller.inputValue}" /><br />
 </h:form>
</h:body>
</html>

Создание класса backing bean JSF

Затем создайте класс backing bean для реализации внутренней обработки на стороне сервера. Создайте новый каталог для пакета Java, который будет использоваться для создания резервной части под каталогом src/main .

mkdir src/main/java
mkdir src/main/java/com
mkdir src/main/java/com/microsoft
mkdir src/main/java/com/microsoft/azure
mkdir src/main/java/com/microsoft/azure/samples

Затем создайте файл IndexController.java, после чего скопируйте и вставьте следующий код класса backing bean JSF:

package com.microsoft.azure.samples;
import java.io.Serializable;

import javax.faces.view.ViewScoped;
import javax.inject.Named;
import lombok.Getter;
import lombok.Setter;

@Named("indexcontroller")
@ViewScoped
public class IndexController implements Serializable{

    private static final long serialVersionUID = 8485377386286855408L;

    @Setter @Getter
    private String inputValue;

    private int counter;

    public void submitButtonAction(){
        inputValue = inputValue + " : " + counter;
        counter++;
    }
}

Это последний штрих. Структура каталогов после реализации программы выглядит следующим образом:

├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── microsoft
        │           └── azure
        │               └── samples
        │                   └── IndexController.java
        ├── resources
        └── webapp
            ├── WEB-INF
            │   ├── beans.xml
            │   └── web.xml
            └── index.xhtml

Запуск в локальной среде Tomcat

Если вы установили Tomcat 9.0.x в локальной среде, перейдите к следующему шагу. В противном случае перейдите к следующему разделу.

Скомпилируйте исходный код и запустите его в локально установленной среде Tomcat. Выполните следующую команду .

Компиляция и упаковка проекта Java

Выполните следующую команду, чтобы скомпилировать код:

mvn clean package

Копирование артефакта в каталог развертывания в Tomcat

Скопируйте файл войны артефакта в каталог в Tomcat"

cp target/azure-javaweb-app.war /$INSTALL_DIR/apache-tomcat-9.0.39/webapps/

Запуск сервера Tomcat

Запустите сервер Tomcat.

$INSTALL_DIR/apache-tomcat-9.0.39/bin/startup.sh

После запуска Tomcat перейдите по адресу http://localhost:8080/azure-javaweb-app/, где вы увидите следующий экран:

JSF HelloWorld Page.

Вы успешно запустили веб-приложение JSF в локальной среде Tomcat.