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.