Oefening: een JavaServer Faces-web-app maken in een Tomcat-omgeving

Voltooid

U bent gevraagd om een JSF-webtoepassing (JavaServer Faces) te maken die formulierinzendingen kan verwerken. U maakt een webtoepassing en implementeert deze lokaal op een Tomcat-server.

Een eenvoudige JSF-web-app maken in Tomcat

In deze oefening maakt u een Maven-project voor uw Java-webtoepassing. Nadat u het project hebt gemaakt, moet u drie configuraties instellen. De eerste is om de afhankelijkheidsbibliotheken toe te voegen aan het bestand pom.xml. De tweede is om een CDI-configuratiebestand te maken als beans.xml, om de CDI (Contexts and Dependency Injection) te gebruiken. De derde is om JSF te configureren in het bestand web.xml. Na de configuraties kunnen we een JSF-webpagina maken, en de backing bean maken voor back-endverwerking aan serverzijde. Ten slotte evalueren we de app in de lokale Tomcat-omgeving.

Een Maven-project maken

Voer de volgende Maven-archetypeopdracht uit. Met deze opdracht wordt een Maven-project voor uw Java-webtoepassing gemaakt.

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

U ziet de volgende uitvoer:

[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] ------------------------------------------------------------------------

De volgende bestanden en mappen zijn nu beschikbaar.

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

Het Maven-bestand pom.xml wijzigen

Als u de JSF-bibliotheken wilt gebruiken, moet u de volgende afhankelijkheidsbibliotheken toevoegen aan pom.xml.

Vervang de inhoud van pom.xml door de volgende code:

<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>

Als u Java SE 11 wilt gebruiken in plaats van Java 8, wijzigt u de volgende pom.xml-vermelding:

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

Contexts and Dependency Injection inschakelen

Maak vervolgens CDI beschikbaar voor uw webtoepassing. Maak een bestand beans.xml onder de map src/main/WEB-INF en beschrijf de volgende inhoud:

<?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 inschakelen

Breng vervolgens de volgende wijzigingen aan in web.xml onder de map WEB-INF om alle bestanden met de extensie xhtml als JSF Facelets te herkennen.

<?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>

De naam van index.jsp wijzigen

Nu de omgevingsinstellingen voor het uitvoeren van JSF zijn voltooid, is het tijd om de JSF-pagina te maken. JSF-webpagina's worden geschreven in de XHTML-bestandsindeling in plaats van JSP, zoals is ingesteld in web.xml in het vorige voorbeeld. Wijzig daarom de naam van het bestand index.jsp dat automatisch is gegenereerd toen het project werd gemaakt voor index.xhtml.

mv index.jsp index.xhtml

Een eenvoudige webpagina voor JSF maken

Verwijder alle inhoud die wordt beschreven in index.xhtml en kopieer de volgende code:

<?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>

Een JSF-backing bean maken

Maak vervolgens een backing bean om de back-endverwerking aan de serverzijde te implementeren. Maak een nieuwe map voor uw Java-pakket, die u gaat gebruiken om de backing bean onder de src/main map te maken.

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

Maak vervolgens een bestand IndexController.java, en kopieer en plak de volgende code voor de JSF-backing bean:

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++;
    }
}

Met deze laatste actie wordt uw programma voltooid. De mapstructuur na de implementatie van het programma is als volgt:

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

Uitvoeren in een lokale Tomcat-omgeving

Als u Tomcat 9.0.x hebt geïnstalleerd in uw lokale omgeving, gaat u naar de volgende stap. Anders gaat u naar de volgende sectie.

Compileer de broncode en voer deze uit in een lokaal geïnstalleerde Tomcat-omgeving. Voer de volgende opdracht uit.

Het Java-project compileren en in een pakket verpakken

Voer de volgende opdracht uit om de code te compileren:

mvn clean package

Het artefact naar de implementatiemap in de Tomcat-omgeving kopiëren

Kopieer het war-bestand van het artefact naar de map in de Tomcat"

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

De Tomcat-server starten

Start de Tomcat-server.

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

Nadat u Tomcat hebt gestart, bladert u naar http://localhost:8080/azure-javaweb-app/ en ziet u het volgende scherm:

JSF HelloWorld Page.

Het is gelukt om de JSF-webtoepassing uit te voeren in de lokale Tomcat-omgeving.