Dando seguimento ao fork de artigos JSF para Wicket, segue o artigo "Problema do rendered dinâmico com JSF", escrito pelo Rafael Ponte. Mais um artigo para considerarmos o Apache Wicket como alternativa mais produtiva. :-)

No artigo, fala-se a respeito do problema que muitos desenvolvedores sofrem quando querem "Ajaxiar" um componente JSF. Não basta fazer binding. Tem que encapsular em outro componente.

Leu? Então agora você vai aprender como Ajaxiar uma interface Wicket. Vejamos o caso do painel variável de acordo com o tipo de pessoa. Aqui, vai o protótipo HTML (já com o Wicket binding)



E aqui o trecho da classe Java que faz o controle da interface, sem Ajax.



Ok, agora dá pra questionar "Tudo isso de código Java pra controlar uma combo?". A resposta é: trocamos controle de interface via TagLibs por uma classe Java. Entretanto em outras tecnologias é comum ter ambos, por causa dos dados dinâmicos. Aí fica a critério do programador o que ele acha melhor: saber só Java, ou saber Java e TagLibs. :-) (outra vantagem é ter o auxílio das IDEs ao mostrar o Javadoc de métodos e classes - algo não pensado para Taglibs).

O interessante no exemplo acima, é que não é um componente que altera a visibilidade do painel para pessoa física. É o próprio painel que se mostra visível somente caso a propriedade TipoPessoa for FISICA. Inversão de Controle alguém? A lógica de visibilidade está nele.

Entretanto, toda a tela é re-renderizada. Mudar para Ajax não é difícil:
- Remova o método wantOnSelecionChangedNotification
- Adicione um IBehaviour de Ajax
- Diga ao painel para colocar um "placeholder"



Outra forma de ver a diferença, é com o comando diff. Removi diferenças de nome de classe e de chaves {} por causa da formatação do código. Deixei apenas o diff que realmente importa.

diff --normal AjaxRenderedPanels.java RenderedPanels.java 
5,6d4
< import org.apache.wicket.ajax.AjaxRequestTarget;
< import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
19d16
<       painelPessoaFisica.setOutputMarkupPlaceholderTag(true);
39,41c35,36
<       dropDownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
<          protected void onUpdate(AjaxRequestTarget target) {
<             target.addComponent(painelPessoaFisica);
---
>          protected boolean wantOnSelectionChangedNotifications() {
>             return true;

Mencionei que o HTML não precisou ser alterado?

Wicket ainda mais divertido!