Antes de darmos inicio a esse artigo, é importante saber o que é o Primefaces. Para quem veio do jQuery, fica fácil de entender, pois o Primefaces é nada mais do que um “container” para o jQuery, ou seja, ele encapsula todo o poder e recurso que o jQuery nos oferece, mas que antes tínhamos que por a mão na massa e programar o recurso desejado através de um javascript mais apresentável.

Com o primefaces tudo se resumo a tags inseridas na página xhtml, ou seja, o que você precisava antes para criar um dialog no jQuery através de código massante, você usa o fornecido pelo primefaces e tudo está resolvido.

Não queremos de forma alguma desmerecer o uso do jQuery, que por sinal é uma poderosa e indispensável ferramenta, e ainda se faz necessária quando não há recursos suficientes no Primefaces, queremos apenas mostrar o quão fácil tornou-se criar componentes com Primefaces, abstraindo totalmente os códigos massantes em javascript. E como nós sempre destacamos aqui, quanto mais ferramentas possíveis para ajudar o profissional a focar na criação das regras de negócio, melhor.

Configurando Primefaces

Neste artigo iremos utilizar o Maven para gerenciar nossas dependências, então iremos colocar o primefaces no arquivo pom.xml, assim como mostrado na listagem 1.

<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>br.com.meuprojeto</groupId>
	<artifactId>MeuProjeto</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>MeuProjeto App</name>
	<url>http://maven.apache.org</url>
	<properties>
		<org.springframework.version>3.0.6.RELEASE
		</org.springframework.version>
	</properties>
	<dependencies>

		<dependency>
			<groupId>org.primefaces.extensions</groupId>
			<artifactId>primefaces-extensions</artifactId>
			<version>0.7.1</version>
		</dependency>


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

		<dependency>
			<groupId>org.primefaces.themes</groupId>
			<artifactId>afterwork</artifactId>
			<version>1.0.9</version>
		</dependency>

	</dependencies>

	<repositories>
		<repository>
			<id>prime-repo</id>
			<name>PrimeFaces Maven Repository</name>
			<url>http://repository.primefaces.org</url>
			<layout>default</layout>
		</repository>
	</repositories>

	<build>
		<finalName>MeuProjeto</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-pmd-plugin</artifactId>
				<version>2.5</version>
				<configuration>
					<targetJdk>1.6</targetJdk>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
Listagem 1. Configurando primefaces no pom.xml

O que você pode perceber acima é que colocamos o repositório apontando para repository.primefaces.org e colocamos também as dependências necessárias, em nosso caso colocamos o primefaces padrão e o primefaces-extension (para nos dar alguns componentes extras), além disso ainda colocamos um tema padrão chamado de “afterwork”.

A configuração, como você pode ter notado, não tem nenhum mistério, o Maven já baixa automaticamente as dependências necessárias e coloca no seu projeto, agora iremos ver como utilizar o primefaces em nossa página xhtml.

Utilizando Primefaces e Primefaces-extension

Para utilizar o primefaces vamos exemplificar em uma página de listagem de funcionários de uma empresa. Essa página irá mostrar todos os funcionários através de um componente chamado presente no primefaces.

<!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://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:pe=”http://primefaces.org/ui/extensions”>

<h:head>

</h:head>
<h:body>
    <ui:composition template="/templates/template.xhtml">

        <ui:define name="content">
            <h:form id="formFuncionarios">

                <p:growl autoUpdate="true" id="messages" />

                <p:toolbar>
                    <p:toolbarGroup align="left">
                        <p:commandButton icon="ui-icon-plus" value="Novo"
                            id="commandButtonCadastrar"
                            oncomplete="varDialogManterFuncionario.show()"
                            actionListener="#{funcionarioMB.novo}"
                            update=":formManterFuncionario:dialogManterFuncionario" />

                        <p:commandButton disabled="#{funcionarioMB.funcionario == null}"
                            id="commandButtonAlterar" value="Alterar" icon="ui-icon-pencil"
                            oncomplete="varDialogManterFuncionario.show()"
                            update=":formManterFuncionario:dialogManterFuncionario" />

                        <p:commandButton disabled="#{funcionarioMB.funcionario == null}"
                            id="commandButtonRemover" value="Remover" icon="ui-icon-trash"
                            onclick="varConfirmRemover.show()" />

                        <p:confirmDialog id="confirmRemover" message="Deseja Remover ?"
                            showEffect="fade" hideEffect="fade" header="Remover"
                            severity="alert" widgetVar="varConfirmRemover">
                            <p:commandButton value="Sim"
                                oncomplete="varConfirmRemover.hide()"
                                actionListener="#{funcionarioMB.deletar}"
                                update=":formFuncionarios:dataTableFuncionarios" />
                            <p:commandButton value="Não" onclick="varConfirmRemover.hide()"
                                type="button" />
                        </p:confirmDialog>
                    </p:toolbarGroup>

                </p:toolbar>

                <p:dataTable rowKey="#{funcionario.id}" var="funcionario"
                    value="#{funcionarioMB.funcionarios}" paginator="true"
                    emptyMessage="Não foi encontrado nenhum registro" rows="10"
                    id="dataTableFuncionarios" selection="#{funcionarioMB.funcionario}"
                    selectionMode="single" rowIndexVar="rowIndex"
                    rowStyleClass="#{(rowIndex mod 2) eq 0 ? 'first-row' : 'second-row'}"
                    paginatorTemplate="Página {CurrentPageReport}  {FirstPageLink}
					{PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}
					Registros por Página {RowsPerPageDropdown}"
					                    rowsPerPageTemplate="10,15,30">

                    <p:ajax event="rowSelect"
                        update=":formFuncionarios:commandButtonAlterar,
					:formFuncionarios:commandButtonRemover" />
                    <p:ajax event="rowUnselect"
                        update=":formFuncionarios:commandButtonAlterar,
					:formFuncionarios:commandButtonRemover" />

                    <f:facet name="header">Lista de Funcionários</f:facet>
                    <p:column headerText="Nome"
                        sortBy="#{funcionario.pessoaFisica.nome}"
                        filterBy="#{funcionario.pessoaFisica.nome}" id="nome"
                        filterMatchMode="contains">
                        <h:outputText value="#{funcionario.pessoaFisica.nome}" />
                    </p:column>

                    <p:column headerText="Função" sortBy="#{funcionario.funcao}"
                        filterBy="#{funcionario.funcao}" id="funcao"
                        filterMatchMode="contains">
                        <h:outputText value="#{funcionario.funcao}" />
                    </p:column>

                    <p:column headerText="Salário" sortBy="#{funcionario.salario}"
                        filterBy="#{funcionario.salario}" id="salario"
                        filterMatchMode="contains">
                        <h:outputText value="R$ #{funcionario.salario}" />
                    </p:column>

                    <p:column headerText="Data Admissão"
                        sortBy="#{funcionario.dataAdmissao}"
                        filterBy="#{funcionario.dataAdmissao}" id="dataAdmissao"
                        filterMatchMode="contains">
                        <h:outputText value="#{funcionario.dataAdmissao}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Situação"
                        sortBy="#{funcionario.pessoaFisica.situacao.descricao}"
                        filterBy="#{funcionario.pessoaFisica.situacao.descricao}"
                        filterOptions="#{funcionarioMB.situacoesPessoaAsItem}"
                        filterMatchMode="exact" id="situacao">
                        <h:outputText
                            value="#{funcionario.pessoaFisica.situacao.descricao}" />
                    </p:column>

                    <p:column headerText="Estado Civil"
                        sortBy="#{funcionario.pessoaFisica.estadoCivil.descricao}"
                        filterBy="#{funcionario.pessoaFisica.estadoCivil.descricao}"
                        filterOptions="#{funcionarioMB.estadosCivisAsSelectItem}"
                        filterMatchMode="exact" id="estadoCivil">
                        <h:outputText
                            value="#{funcionario.pessoaFisica.estadoCivil.descricao}" />
                    </p:column>


                </p:dataTable>
            </h:form>

            <ui:include
                src="/tabelas/funcionario/dialog_manter_funcionario.xhtml" />


        </ui:define>
    </ui:composition>


</h:body>
</html>
Listagem 2. Listando funcionários de uma empresa com o Primefaces

O nosso foco aqui não é mostrar a ligação do JSF com ManagedBean e dentre outros recursos, mas sim mostrar o uso do Primefaces. Logo nas primeiras linhas temos o trecho:

xmlns:p="http://primefaces.org/ui"
xmlns:pe=”http://primefaces.org/ui/extensions”

Esse trecho de código é o que faz funcionar o primefaces e o primefaces-extension em sua essência. Em todas as áreas na páginas utilizamos sempre a tag “<p:...” seguido do nome componente, ou seja, <p:datatable="">, <p:column>, <p:confirmdialog> e assim por diante. Essa letra “p” foi uma opção nossa, mas você poderia mudar para qualquer outra letra que desejasse, mas essa é a mais utilizada normalmente. Por outro lado, temos também a letra “pe” que faz referência ao <em>primefaces.org/ui/extensions, que é o local onde encontraremos as extensões do primefaces.

Extensões essas tais como: que é um componente próprio para inserção de valores numéricos, tal componente você não encontra de forma nativa no primefaces padrão (referenciado pela letra 'p') em nosso exemplo.

Conclusão

O primefaces é uma poderoso recurso, que é indispensável no desenvolvimento de aplicações que utilizam JSF, isso porque ele torna toda complexidade no desenvolvimento de componente e botões transparente ao desenvolvedor.