Você está na página 1de 36

JavaServer Faces (JSF) e boas prticas

Rafael Ponte rponte@gmail.com http://www.rponte.com.br

| O que importante saber...

Ciclo de vida de uma requisio JSF Otimizar requisies AJAX e atualizaes parciais de pginas Tudo funcionando em uma nica pgina E Facelets, vai me servir para algo? Integrando JSF e ExtJs, em busca de uma abordagem flexvel

Ciclo de vida de uma requisio JSF

JSF Request lifecycle


Restore View Retrieve component tree from client or session Apply Request Values Decode components (populate w/ String values) Convert Strings to Objects Process Validate Objects Validations Update Model May skip to render phase or abort request

Request

Call setters on managed beans

Response

Invoke bean Invoke method(s) Application Compute navigation Call bean getters to Render populate Response components

| Depurando o ciclo

A primeira chamada Refresh Submetendo o form Adiciona immediate=true para UIInput somente Adiciona immediate=true para UICommand somente Adiciona immediate=true para UIInput e UICommand Erro de converso Erro de validao

| Depurando o ciclo

A primeira chamada 1. Restore view 2. Apply request values * 3. Process validations * 4. Update model values * 5. Invoke application * 6. Render response

A fase pulada pois no houve form submit

Como a UIViewRoot est vazia, no h o que fazer aqui

Os componentes so criados pela primeira vez e armazenados na UIViewRoot e so setados os component bindings.

| Depurando o ciclo

Refresh 1. Restore view 2. Apply request values * 3. Process validations * 4. Update model values * 5. Invoke application * 6. Render response

A fase pulada pois no houve form submit

Os componentes so restaurados do UIViewRoot e so setados os component bindings

Os valores serem exibidos so recuperados atravs dos getters no managed bean, se eles no foram setados ento o valor default ser null

| Depurando o ciclo

Submetendo o form 1. Restore view


Os componentes so restaurados do UIViewRoot e so setados os component bindings

2. Apply request values


Nada demais aqui. Os valores so recuperados do form e setados nos componentes no UIViewRoot

3. Process validations
Os valores so recuperados como objetos dos componentes atravs do mtodo getAsObject() do converter e validados pelo validator. Finalmente o valueChangeListener invocado

[...]

| Depurando o ciclo

Submetendo o form 4. Update model values


Os valores convertidos e validados sero agora setados atravs do setters dos value bindings do managed bean

5. Invoke application
O processamento real da submisso do form acontece aqui

6. Render response
Os valores serem exibidos so recuperados atravs dos getters no managed bean, se um converter definido ento o valor ser obtido atravs do mtodo getAsString() do converter e o valor ser exibido no form

| Depurando o ciclo

Adiciona immediate=true para UIInput 1. Restore view


Os componentes so restaurados do UIViewRoot e so setados os component bindings

2. Apply request values

Os valores so recuperados atravs do mtodo getAsObject() do converter, validados pelo validator e o valueChangeListener invocado. Da os valores convertidos e validados so setados nos componentes relevantes no UIViewRoot. Isso acontece aqui invs da fase Process validations devido ao immediate=true no h:inputText

3. Process validations
Nada aqui. A converso e validao j foram processadas na fase anterior antes de os valores serem setados nos componentes

[...]

| Depurando o ciclo

Adiciona immediate=true para UIInput 4. Update model values


Os valores convertidos e validados sero agora setados atravs do setters dos value bindings do managed bean

5. Invoke application
O processamento real da submisso do form acontece aqui

6. Render response
Os valores serem exibidos so recuperados atravs dos getters no managed bean, se um converter definido ento o valor ser obtido atravs do mtodo getAsString() do converter e o valor ser exibido no form

| Depurando o ciclo

Adiciona immediate=true para UICommand 1. Restore view


Os componentes so restaurados do UIViewRoot e so setados os component bindings

2. Apply request values

O processamento real da submisso do form acontece aqui. Isso acontece nesta fase invs da fase Invoke application devido ao immediate=true no h:commandButton. Os componentes UIInput que no possuem immediate=true setado sero ignorados, e portanto, eles no sero convertidos nem validados

3. Process validations
Esta fase pulada devido ao immediate=true no
h:commandButton [...]

| Depurando o ciclo

Adiciona immediate=true para UICommand 4. Update model values


Esta fase pulada devido ao immediate=true no
h:commandButton

5. Invoke application
Esta fase pulada devido ao immediate=true no
h:commandButton

6. Render response

Os valores serem exibidos so recuperados atravs dos getters no managed bean. Ateno: Como a fase Update model values pulada os value bindings no so setados e o getters dos value bindings retornaro null. Os componentes UIInput que no possuem immediate=true setado sero ignorados e no ser possvel recuperar os valores do componente ou value binding.

| Depurando o ciclo

Adiciona immediate=true para UIInput e UICommand 1. Restore view


Os componentes so restaurados do UIViewRoot e so setados os component bindings Os valores so recuperados atravs do mtodo getAsObject() do converter, validados pelo validator e o valueChangeListener invocado e os valores convertidos e validados so setados no componentes relevantes no UIViewRoot. Isso acontece aqui invs da fase Process validations devido ao immediate=true no h:inputText. Finalmente o processamento real da submisso do form acontece aqui. Isso acontece nesta fase ao invs da fase Invoke application devido ao immediate=true no h:commandButton.

2. Apply request values

3. Process validations

Esta fase pulada devido ao immediate=true no h:commandButton

[...]

| Depurando o ciclo

Adiciona immediate=true para UIInput e UICommand 4. Update model values 5. Invoke application
Esta fase pulada devido ao immediate=true no h:commandButton Esta fase pulada devido ao immediate=true no h:commandButton

6. Render response

Os valores serem exibidos so recuperados atravs dos getters no managed bean. Ateno: Como a fase Update model values pulada os value bindings no so setados e o getters dos value bindings retornaro null. Mas os valores ainda esto avaliados por component bindings que foram setados na fase Apply request values, assim voc poder recuperar o valor do input com inputBinding.getValue() no mtodo action(). O novo valor do input ser tambm avaliado pelo ValueChangeEvent no mtodo inputChanged()

| Depurando o ciclo

Erro de converso 1. Restore view


Os componentes so restaurados do UIViewRoot e so setados os component bindings

2. Apply request values


Nada demais aqui. Os valores so recuperados do form e setados nos componentes no UIViewRoot

3. Process validations
Os valores so recuperados como objetos dos componentes atravs do mtodo getAsObject() do converter onde um ConverterException lanado. O validator e o valueChangeListener so pulados. O ciclo de vida pular imediatamente para a fase Render response
[...]

| Depurando o ciclo

Erro de converso 4. Update model values


Esta fase pulada devido ao ConverterException

5. Invoke application
Esta fase pulada devido ao ConverterException

6. Render response
Os valores serem exibidos so recuperados atravs dos getters no managed bean, explicitando os valores para qual os ConverterException tem ocorrido

| Depurando o ciclo

Erro de validao 1. Restore view


Os componentes so restaurados do UIViewRoot e so setados os component bindings

2. Apply request values


Nada demais aqui. Os valores so recuperados do form e setados nos componentes no UIViewRoot

3. Process validations
Os valores so recuperados como objetos dos componentes atravs do mtodo getAsObject() do converter e validados pelo validator, onde um ValidatorException lanado. O valueChangeListener pulado. O ciclo de vida pular imediatamente para a fase Render response
[...]

| Depurando o ciclo

Erro de validao 4. Update model values


Esta fase pulada devido ao ValidatorException

5. Invoke application
Esta fase pulada devido ao ValidatorException

6. Render response
Os valores serem exibidos so recuperados atravs dos getters no managed bean, explicitando os valores para qual os ValidatorException tem ocorrido

Otimizando AJAX requests

| Richfaces?

Projeto da JBoss Insere funcionalidades AJAX em aplicaes JSF existentes J inclui Ajax4jsf, claro! Excelente compatibilidade com diversos conjuntos de componentes Possui diversos componentes ricos

| Richfaces?

| Richfaces? Ajax4jsf insere funcionalidades AJAX em aplicaes JSF j existentes

| Richfaces?

Ajax4jsf

| Ajax4jsf?
Antes de enviar uma requisio AJAX..

Decida o que enviar!

| Ajax4jsf?

Limitando regies com a4j:region Diminuindo o trafgo na rede com eventsQueue e requestDelay ajaxSingle=true, o lobo solitrio Ningum gosta de esperar, mas com a4j:status as coisas at melhoram

| Ajax4jsf?
Antes de enviar uma requisio AJAX..

Tambm decida o que mudar!

| Ajax4jsf?

Otimizando o atributo reRender Limitando-se a regio, renderRegionOnly=true e selfRendered=true Limitando a lista de id's tambm ajuda, limitToList=true Definindo reas atualizavis, a4j:outputPanel

Tudo funcionando em uma nica pgina

| nica pgina?

Menos configuraes para regras de navegao Menos arquivos (jsp, xhtml) para manuteno Renderizao mais rpida Menos overhead no servidor Sem reload de pgina, lgico!

Facelets, aproveite o que a vida te oferece de melhor

| Facelets?

Desenvolvido especialmente para JSF Rpido templating de componentes e pginas De 30% 50% mais rpido que JSP No est preso a Web Container JBoss Seam usa e abusa

| Facelets?

Compatvel com JSF 1.1 e JSF 1.2 Excelente depurao de erros Ser integrado ao JSF 2.0 Utiliza-se de XHTML nas pginas (alguns seres no gostam disso o.O) Compatvel com a maioria (se no todos) os conjuntos de componentes

| Facelets?

Eu disse de 30% 50% mais rpido que JSP

| Facelets?

Ser integrado ao JSF 2.0, tu entedestes o que eu disse?

JSF+ExtJs Em busca de uma abordagem flexvel

Você também pode gostar