練習 - 在 Tomcat 上建立 JavaServer Faces Web 應用程式

已完成

您的主管要求您建立可處理表單提交的 JavaServer Faces (JSF) Web 應用程式。 您將建置 Web 應用程式,並部署到 Tomcat 伺服器本機。

在 Tomcat 上建立簡單的 JSF Web 應用程式

在此練習中,我們將建立適用於您 Java Web 應用程式的 Maven 專案。 建立專案之後,您必須設定三個設定。 第一個是將相依性程式庫新增至 pom.xml 檔案。 第二個是將 CDI 設定檔建立為 beans.xml,以使用內容和相依性插入 (CDI)。 第三個是在 web.xml 檔案上設定 JSF。 設定後,我們就可以建立 JSF 網頁,並建立用於伺服器端後端作業的支援 Bean。 最後,我們會在本機 Tomcat 環境上加以評估。

建立 Maven 專案

執行下列 Maven 原型命令。 此命令會建立適用於您 Java Web 應用程式的 Maven 專案。

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 提供給您的 Web 應用程式。 在 src/main/WEB-INF 目錄下建立 beans.xml 檔案,並描述下列內容:

<?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 Facelet,對 WEB-INF 目錄下的 web.xml 進行下列變更。

<?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.xhtml 中建立專案時會自動產生的 index.jsp 檔案名稱。

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>

建立 JSF 支援 Bean

接下來,建立支援 Bean 以實作伺服器端後端處理。 建立 Java 套件的新目錄,用以在 src/main 目錄下建立支援 Bean。

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 檔案,再複製並貼上以下 JSF 支援 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++;
    }
}

這最後一個動作會完成您的程式。 實作程式之後的目錄結構如下所示:

├── 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 的部署目錄

將成品 war 檔案複製到 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.

您已在本機 Tomcat 環境中成功執行您的 JSF Web 應用程式。