36
JavaServer Faces (JSF) e boas práticas Rafael Ponte [email protected] http://www.rponte.com.br

Boas Práticas com JavaServer Faces (Jsf)

Embed Size (px)

DESCRIPTION

Algumas boas práticas com JavaServer Faces

Citation preview

Page 1: Boas Práticas com JavaServer Faces (Jsf)

JavaServer Faces (JSF) e boas práticas

Rafael [email protected]://www.rponte.com.br

Page 2: Boas Práticas com JavaServer Faces (Jsf)

| O que é importante saber...

● Ciclo de vida de uma requisição JSF● Otimizar requisições AJAX e atualizações

parciais de páginas● Tudo funcionando em uma única página● E Facelets, vai me servir para algo?● Integrando JSF e ExtJs, em busca de

uma abordagem flexível

Page 3: Boas Práticas com JavaServer Faces (Jsf)

Ciclo de vida de uma requisição JSF

Page 4: Boas Práticas com JavaServer Faces (Jsf)

May skip torender phase

or abort request

RestoreView

Apply RequestValues

ProcessValidations

UpdateModel

InvokeApplication

RenderResponse

Request

Response

Retrieve component tree from client or session

Decode components (populate w/ String values) Convert Strings to

ObjectsValidate Objects

Invoke bean method(s)Compute navigation

Call setters on managed beans

Call bean getters to populate components

JSF Request lifecycle

Page 5: Boas Práticas com JavaServer Faces (Jsf)

| 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 conversão

● Erro de validação

Page 6: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● A primeira chamada

1. Restore viewComo a UIViewRoot está vazia, não há o que fazer aqui

2. Apply request values *

3. Process validations *

4. Update model values *

5. Invoke application *

6. Render responseOs componentes são criados pela primeira vez e armazenados na UIViewRoot e são setados os component bindings.

* A fase é “pulada” pois não houve form submit

Page 7: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Refresh

1. Restore viewOs componentes são restaurados do UIViewRoot e são setados os component bindings

2. Apply request values *

3. Process validations *

4. Update model values *

5. Invoke application *

6. Render responseOs valores à serem exibidos são recuperados através dos getters no managed bean, se eles não foram setados então o valor default será null

* A fase é “pulada” pois não houve form submit

Page 8: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Submetendo o form

1. Restore viewOs componentes são restaurados do UIViewRoot e são setados os component bindings

2. Apply request valuesNada demais aqui. Os valores são recuperados do form e setados nos componentes no UIViewRoot

3. Process validationsOs valores são recuperados como objetos dos componentes através do método getAsObject() do converter e validados pelo validator. Finalmente o valueChangeListener é invocado

[...]

Page 9: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Submetendo o form

4. Update model valuesOs valores convertidos e validados serão agora setados através do setters dos value bindings do managed bean

5. Invoke applicationO processamento real da submissão do form acontece aqui

6. Render responseOs valores à serem exibidos são recuperados através dos getters no managed bean, se um converter é definido então o valor será obtido através do método getAsString() do converter e o valor será exibido no form

Page 10: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Adiciona immediate=”true” para UIInput

1. Restore viewOs componentes são restaurados do UIViewRoot e são setados os component bindings

2. Apply request valuesOs valores são recuperados através do método getAsObject() do converter, validados pelo validator e o valueChangeListener é invocado. Daí os valores convertidos e validados são setados nos componentes relevantes no UIViewRoot. Isso acontece aqui invés da fase Process validations devido ao immediate=”true” no h:inputText

3. Process validationsNada aqui. A conversão e validação já foram processadas na fase anterior antes de os valores serem setados nos componentes

[...]

Page 11: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Adiciona immediate=”true” para UIInput

4. Update model valuesOs valores convertidos e validados serão agora setados através do setters dos value bindings do managed bean

5. Invoke applicationO processamento real da submissão do form acontece aqui

6. Render responseOs valores à serem exibidos são recuperados através dos getters no managed bean, se um converter é definido então o valor será obtido através do método getAsString() do converter e o valor será exibido no form

Page 12: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Adiciona immediate=”true” para UICommand

1. Restore viewOs componentes são restaurados do UIViewRoot e são setados os component bindings

2. Apply request valuesO processamento real da submissão do form acontece aqui. Isso acontece nesta fase invés da fase Invoke application devido ao immediate=”true” no h:commandButton. Os componentes UIInput que não possuem immediate=”true” setado serão ignorados, e portanto, eles não serão convertidos nem validados

3. Process validationsEsta fase é “pulada” devido ao immediate=”true” no h:commandButton

[...]

Page 13: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Adiciona immediate=”true” para UICommand

4. Update model valuesEsta fase é “pulada” devido ao immediate=”true” no h:commandButton

5. Invoke applicationEsta fase é “pulada” devido ao immediate=”true” no h:commandButton

6. Render responseOs valores à serem exibidos são recuperados através dos getters no managed bean. Atenção: Como a fase Update model values é “pulada” os value bindings não são setados e o getters dos value bindings retornarão null. Os componentes UIInput que não possuem immediate=”true” setado serão ignorados e não será possível recuperar os valores do componente ou value binding.

Page 14: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Adiciona immediate=”true” para UIInput e

UICommand

1. Restore viewOs componentes são restaurados do UIViewRoot e são setados os component bindings

2. Apply request valuesOs valores são recuperados através do método getAsObject() do converter, validados pelo validator e o valueChangeListener é invocado e os valores convertidos e validados são setados no componentes relevantes no UIViewRoot. Isso acontece aqui invés da fase Process validations devido ao immediate=”true” no h:inputText. Finalmente o processamento real da submissão do form acontece aqui. Isso acontece nesta fase ao invés da fase Invoke application devido ao immediate=”true” no h:commandButton.

3. Process validationsEsta fase é “pulada” devido ao immediate=”true” no h:commandButton [...]

Page 15: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Adiciona immediate=”true” para UIInput e

UICommand

4. Update model valuesEsta fase é “pulada” devido ao immediate=”true” no h:commandButton

5. Invoke applicationEsta fase é “pulada” devido ao immediate=”true” no h:commandButton

6. Render responseOs valores à serem exibidos são recuperados através dos getters no managed bean. Atenção: Como a fase Update model values é “pulada” os value bindings não são setados e o getters dos value bindings retornarão null. Mas os valores ainda estão avaliados por component bindings que foram setados na fase Apply request values, assim você poderá recuperar o valor do input com inputBinding.getValue() no método action(). O novo valor do input será também avaliado pelo ValueChangeEvent no método inputChanged()

Page 16: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Erro de conversão

1. Restore viewOs componentes são restaurados do UIViewRoot e são setados os component bindings

2. Apply request valuesNada demais aqui. Os valores são recuperados do form e setados nos componentes no UIViewRoot

3. Process validationsOs valores são recuperados como objetos dos componentes através do método getAsObject() do converter onde um ConverterException é lançado. O validator e o valueChangeListener são “pulados”. O ciclo de vida “pulará” imediatamente para a fase Render response

[...]

Page 17: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Erro de conversão

4. Update model valuesEsta fase é pulada devido ao ConverterException

5. Invoke applicationEsta fase é pulada devido ao ConverterException

6. Render responseOs valores à serem exibidos são recuperados através dos getters no managed bean, explicitando os valores para qual os ConverterException tem ocorrido

Page 18: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Erro de validação

1. Restore viewOs componentes são restaurados do UIViewRoot e são setados os component bindings

2. Apply request valuesNada demais aqui. Os valores são recuperados do form e setados nos componentes no UIViewRoot

3. Process validationsOs valores são recuperados como objetos dos componentes através do método getAsObject() do converter e validados pelo validator, onde um ValidatorException é lançado. O valueChangeListener é “pulado”. O ciclo de vida “pulará” imediatamente para a fase Render response

[...]

Page 19: Boas Práticas com JavaServer Faces (Jsf)

| Depurando o ciclo● Erro de validação

4. Update model valuesEsta fase é pulada devido ao ValidatorException

5. Invoke applicationEsta fase é pulada devido ao ValidatorException

6. Render responseOs valores à serem exibidos são recuperados através dos getters no managed bean, explicitando os valores para qual os ValidatorException tem ocorrido

Page 20: Boas Práticas com JavaServer Faces (Jsf)

Otimizando AJAX requests

Page 21: Boas Práticas com JavaServer Faces (Jsf)

| Richfaces?

● Projeto da JBoss● Insere funcionalidades AJAX em

aplicações JSF existentes● Já inclui Ajax4jsf, é claro!● Excelente compatibilidade com diversos

conjuntos de componentes● Possui diversos componentes ricos

Page 22: Boas Práticas com JavaServer Faces (Jsf)

| Richfaces?

Page 23: Boas Práticas com JavaServer Faces (Jsf)

| Richfaces?

Ajax4jsf insere funcionalidades AJAX em

aplicações JSF já existentes

Page 24: Boas Práticas com JavaServer Faces (Jsf)

| Richfaces?● Ajax4jsf

Page 25: Boas Práticas com JavaServer Faces (Jsf)

| Ajax4jsf?

Decida o que enviar!

Antes de enviar uma requisição AJAX..

Page 26: Boas Práticas com JavaServer Faces (Jsf)

| Ajax4jsf?

● Limitando regiões com a4j:region● Diminuindo o trafégo na rede com

eventsQueue e requestDelay● ajaxSingle=”true”, o lobo solitário● Ninguém gosta de esperar, mas com

a4j:status as coisas até melhoram

Page 27: Boas Práticas com JavaServer Faces (Jsf)

| Ajax4jsf?

Também decida o que mudar!

Antes de enviar uma requisição AJAX..

Page 28: Boas Práticas com JavaServer Faces (Jsf)

| Ajax4jsf?

● Otimizando o atributo reRender● Limitando-se a região,

renderRegionOnly=”true” e selfRendered=”true”

● Limitando a lista de id's também ajuda, limitToList=”true”

● Definindo áreas atualizavéis, a4j:outputPanel

Page 29: Boas Práticas com JavaServer Faces (Jsf)

Tudo funcionando em uma única

página

Page 30: Boas Práticas com JavaServer Faces (Jsf)

| Única página?

● Menos configurações para regras de navegação

● Menos arquivos (jsp, xhtml) para manutenção

● Renderização mais rápida● Menos overhead no servidor● Sem reload de página, lógico!

Page 31: Boas Práticas com JavaServer Faces (Jsf)

Facelets, aproveite o que a vida te oferece de melhor

Page 32: Boas Práticas com JavaServer Faces (Jsf)

| Facelets?

● Desenvolvido especialmente para JSF● Rápido templating de componentes e

páginas● De 30% à 50% mais rápido que JSP● Não está preso a Web Container● JBoss Seam usa e abusa

Page 33: Boas Práticas com JavaServer Faces (Jsf)

| Facelets?

● Compatível com JSF 1.1 e JSF 1.2● Excelente depuração de erros● Será integrado ao JSF 2.0● Utiliza-se de XHTML nas páginas (alguns

seres não gostam disso o.O)● Compatível com a maioria (se não

todos) os conjuntos de componentes

Page 34: Boas Práticas com JavaServer Faces (Jsf)

| Facelets?

Eu disse de 30% à 50% mais

rápido que JSP

Page 35: Boas Práticas com JavaServer Faces (Jsf)

| Facelets?

Será integrado ao JSF 2.0, tu

entedestes o que eu disse?

Page 36: Boas Práticas com JavaServer Faces (Jsf)

JSF+ExtJsEm busca de uma abordagem flexível