March 20, 2018

Getting Started with JSF 2.2 (Java EE 7) in JBoss EAP 7

Introduction

Here is a simple guide to get started with JSF 2.2 development with JBoss EAP 7.

Maven

Lets start with maven war pom for Java EE 7. See also Minimalistic POM for Java EE 7

<?xml version="1.0" encoding="UTF-8"?>
<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>se.magnuskkarlsson.netbeans.examples</groupId>
    <artifactId>example-ee7-web</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.build.outputEncoding>UTF-8</project.build.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
 
        <!-- Test Support -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <finalName>${project.artifactId}</finalName>
    </build>
</project>

Java EE 7 Deployment Descriptors

The deployment descriptors used here are. See also Java EE 7 Deployment Descriptors:

  • src/main/webapp/WEB-INF/web.xml - Not required, but will probably later be used. EMPTY
  • src/main/webapp/WEB-INF/faces-config.xml - Is required for JSF to work in EAP. EMPTY
  • src/main/webapp/WEB-INF/beans.xml - Is required for CDI to work. EMPTY

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_1.xsd"
         version="3.1">

</web-app>

src/main/webapp/WEB-INF/faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config 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-facesconfig_2_2.xsd"
              version="2.2">

</faces-config>

src/main/webapp/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"
       version="1.1" bean-discovery-mode="all">

</beans>

JSF Managed Bean

Do not use JSF @javax.faces.bean.ManagedBean, instead use standard CDI. It's more generic and you only need to learn one technique.

src/main/java/se/magnuskkarlsson/netbeans/example/ee7/web/Person.java

package se.magnuskkarlsson.netbeans.example.ee7.web;

import java.util.Date;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

@Named
@RequestScoped
public class Person {

    @Size(min = 1, max = 256)
    private String firstName;
    @Size(min = 1, max = 256)
    private String lastName;
    @Min(12)
    @Max(100)
    private int age;
    @NotNull
    @Past
    private Date birthdate;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthdate() {
        return birthdate;
    }

    public void setBirthdate(Date birthdate) {
        this.birthdate = birthdate;
    }
}

JavaServer Faces/JSF Page

src/main/webapp/person.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:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <!-- <h:messages style="color:red;" showDetail="true" showSummary="true" /> -->
            <h:panelGrid columns="3">
                <h:outputLabel for="firstName" value="First Name: " />
                <h:inputText id="firstName" value="#{person.firstName}" />
                <h:message for="firstName" style="color: red;" />

                <h:outputLabel for="lastName" value="Last Name: " />
                <h:inputText id="lastName" value="#{person.lastName}" />
                <h:message for="lastName" style="color: red;" />

                <h:outputLabel for="age" value="Age: "/>
                <h:inputText id="age" value="#{person.age}" />
                <h:message for="age" style="color: red;" />
    
                <h:outputLabel for="birthdate" value="Birthdate: " />
                <h:inputText id="birthdate" value="#{person.birthdate}" label="birthdate">
                    <f:convertDateTime pattern="yyyy-MM-dd" />
                </h:inputText>
                <h:message for="birthdate" style="color: red;" />
            </h:panelGrid>
            <h:commandButton value="Save" action="confirmation" />
        </h:form>
    </h:body>
</html>

Test

Now lets test standard $JBOSS_HOME/bin/standalone.sh

You can access the jsf page from two URL: http://localhost:8080/example-ee7-web/person.jsf and http://localhost:8080/example-ee7-web/faces/person.xhtml