1. 简介

Primefaces 是一个用于 Java Server Faces (JSF) 应用的开源 UI 组件库

本教程将带你快速入门 Primefaces,演示如何配置它并使用其核心功能。

2. 概述

2.1 Java Server Faces

Java Server Faces 是一个面向组件的 Java Web 应用 UI 框架。JSF 规范通过 Java Community Process 正式化,是一种标准化的显示技术。

更多关于 Spring 环境中的 JSF 内容可参考这里

2.2 Primefaces

Primefaces 构建于 JSF 之上,通过提供预构建的 UI 组件支持快速应用开发,这些组件可直接集成到任何项目中。

除了核心库,还有Primefaces Extensions项目。这个社区驱动的开源项目提供了标准组件之外的扩展组件。

3. 应用搭建

为了演示 Primefaces 组件,我们用 Maven 创建一个简单的 Web 应用。

3.1 Maven 配置

Primefaces 配置非常轻量,只需一个 JAR 包。在 pom.xml 中添加依赖:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.2</version>
</dependency>

最新版本可在这里查看。

3.2 控制器 – Named Bean

创建组件对应的 Bean 类:

@Named("helloPFBean")
public class HelloPFBean {
}

必须使用 @Named 注解将控制器绑定到视图组件。

3.3 视图

.xhtml 文件中声明 Primefaces 命名空间:

<html xmlns:p="http://primefaces.org/ui">

4. 组件示例

启动服务器并访问以下地址渲染页面:

http://localhost:8080/jsf/pf_intro.xhtml

4.1 PanelGrid

使用 PanelGrid 作为标准 JSF panelGrid 的扩展

<p:panelGrid columns="2">
    <h:outputText value="#{helloPFBean.firstName}"/>
    <h:outputText value="#{helloPFBean.lastName}" />
</p:panelGrid>

这里定义了一个两列的 panelGrid,通过 JSF facelets 的 outputText 显示命名 Bean 的数据。

outputText 的值对应 @Named Bean 中的属性:

private String firstName;
private String lastName;

效果如下:

panel grid

4.2 SelectOneRadio

使用 selectOneRadio 组件实现单选按钮功能

<h:panelGrid columns="2">
    <p:outputLabel for="jsfCompSuite" value="Component Suite" />
    <p:selectOneRadio id="jsfCompSuite" value="#{helloPFBean.componentSuite}">
        <f:selectItem itemLabel="ICEfaces" itemValue="ICEfaces" />
        <f:selectItem itemLabel="RichFaces" itemValue="Richfaces" />
    </p:selectOneRadio>
</h:panelGrid>

在后台 Bean 中声明变量存储单选值:

private String componentSuite;

这将生成一个绑定到 componentSuite 属性的双选项单选按钮:

selectOneRadioPF

4.3 数据表格

使用 dataTable 组件以表格形式展示数据

<p:dataTable var="technology" value="#{helloPFBean.technologies}">
    <p:column headerText="Name">
        <h:outputText value="#{technology.name}" />
    </p:column>

    <p:column headerText="Version">
        <h:outputText value="#{technology.currentVersion}" />
    </p:column>
</p:dataTable>

在 Bean 中提供表格数据源:

private List<Technology> technologies;

效果展示多种技术及其版本:

datatablePF

4.4 带 Ajax 的 InputText

使用 p:ajax 为组件添加 Ajax 功能

例如实现失焦事件:

<h:panelGrid columns="3">
    <h:outputText value="Blur event " />
    <p:inputText id="inputTextId" value="#{helloPFBean.inputText}}">
        <p:ajax event="blur" update="outputTextId"
      listener="#{helloPFBean.onBlurEvent}" />
    </p:inputText>
    <h:outputText id="outputTextId" 
      value="#{helloPFBean.outputText}" />
</h:panelGrid>

在 Bean 中提供属性:

private String inputText;
private String outputText;

并添加 Ajax 事件监听方法:

public void onBlurEvent() {
    outputText = inputText.toUpperCase();
}

这里简单将文本转为大写演示机制:

blurPF

4.5 按钮

使用 p:commandButton 作为标准 h:commandButton 的扩展

示例:

<p:commandButton value="Open Dialog" 
  icon="ui-icon-note" 
  onclick="PF('exDialog').show();">
</p:commandButton>

配置后得到一个通过 onclick 触发对话框的按钮:

commandButton

4.6 对话框

使用 p:dialog 组件实现对话框功能

结合上例的按钮实现点击打开:

<p:dialog header="Example dialog" widgetVar="exDialog" minHeight="40">
    <h:outputText value="Hello Baeldung!" />
</p:dialog>

基础配置的对话框可通过前述 commandButton 触发:

dialog

5. Primefaces Mobile

Primefaces Mobile (PFM) 提供用于移动设备的 Primefaces UI 工具包

PFM 支持针对移动设备优化的响应式设计。

5.1 配置

faces-config.xml 中启用移动导航支持:

<navigation-handler>
    org.primefaces.mobile.application.MobileNavigationHandler
</navigation-handler>

5.2 命名空间

.xhtml 文件中引入 PFM 命名空间:

xmlns:pm="http://primefaces.org/mobile"

除标准 Primefaces JAR 外无需额外依赖。

5.3 RenderKit

提供 RenderKit 用于移动环境组件渲染

单页应用可在页面内定义:

<f:view renderKitId="PRIMEFACES_MOBILE" />

完整 PFM 应用可在 faces-config.xml 中定义:

<default-render-kit-id>PRIMEFACES_MOBILE</default-render-kit-id>

5.4 示例页面

创建 PFM 示例页面:

<pm:page id="enter">
    <pm:header>
        <p:outputLabel value="Introduction to PFM"></p:outputLabel>
    </pm:header>
    <pm:content>
        <h:form id="enterForm">
            <pm:field>
            <p:outputLabel 
                  value="Enter Magic Word">
                </p:outputLabel>
            <p:inputText id="magicWord" 
                  value="#{helloPFMBean.magicWord}">
                </p:inputText>
        </pm:field>
            <p:commandButton 
              value="Go!" action="#{helloPFMBean.go}">
            </p:commandButton>
    </h:form>
     </pm:content>
</pm:page>

使用 PFM 的 pageheadercontent 组件构建带标题的表单:

pfmIntroBaeldung

后台 Bean 处理输入和导航:

public String go() {
    if(this.magicWord != null 
      && this.magicWord.toUpperCase().equals("BAELDUNG")) {
    return "pm:success";
     }
    
    return "pm:failure";
}

输入正确时跳转:

<pm:page id="success">
    <pm:content>
        <p:outputLabel value="Correct!">
        </p:outputLabel>            
    <p:button value="Back" 
          outcome="pm:enter?transition=flow">
        </p:button>
    </pm:content>
</pm:page>

效果如下:

correctPagePFM

输入错误时跳转:

<pm:page id="failure">
    <pm:content>
        <p:outputLabel value="That is not the magic word">
        </p:outputLabel>
    <p:button value="Back" outcome="pm:enter?transition=flow">
        </p:button>
    </pm:content>
</pm:page>

效果如下:

incorrectWordPFM

⚠️ 注意:PFM 在 6.2 版本已弃用,6.3 版本将被移除,推荐使用响应式标准工具包替代。

6. 总结

本教程介绍了使用 Primefaces JSF 组件库的优势,演示了在 Maven 项目中配置和使用 Primefaces 的方法。

此外还介绍了专为移动设备设计的 Primefaces Mobile UI 工具包。


原始标题:Introduction to Primefaces | Baeldung