Escolar Documentos
Profissional Documentos
Cultura Documentos
AJAXcomJavaServerFaces
FaaumaaplicaoJSFcomAJAXsemmistrios
FRANCISCOCALAAXAVIER AtualmentemuitosetemfaladosobreoAJAXeJSF.Pretendemosnesteartigoapresentarao leitorousodatecnologiaJSFcomosbenefciosdoAJAX. Com JSF (JavaServer Faces) possvel construir interfaces grficas apenas utilizando componentes, o que permite uma efetiva reutilizao de software. Se voc necessitar de um calendrio,susarumcomponentequefazotrabalhodeumcalendrio.Outracoisapossvelcom oJSFapossibilidadedeconstruodeaplicaeswebdeformatotalmentevisual,comdragand dropdecomponentes. JoAJAX(AsynchronousJavaScriptAndXML)possibilitaaconstruodeaplicaesWEBcom ascaractersticasdasaplicaesDesktop.Apesardecontinuarexistindooconceitoderequisioe respostaemumaaplicaoqueutilizaAJAX,estesetornamenosperceptvelparaousurioda aplicao.Observequesuapropostajustamenteaproximarasvantagensdeconectividadedaweb comainteratividadedoambientedesktop.Istopossvelporque,noAJAX,umcdigoJavaScript responsvelporrealizaraatualizaodosdadosnoservidor.Suponhaumaaplicaoemqueao escolherumestadodopasapresentadaumacaixadeopescomascidadesdesteestado.Com AJAXnonecessrioatualizartodaapginaapenasparadescobrirquaiscidadespertencemao estadoselecionado,porexemplo.Eousurionotemmaisaimpressodelentidoquandoclicano botoConsultarouquandoumitemselecionadoemumcombobox.Issoporquenomais necessriorealizarumarequisiocompletaparaapenasatualizarumcampoouumaregioda pgina.possveliraoservidorebuscarapenasainformaonecessria. O nosso objetivo neste artigo fazer, inicialmente, um projeto utilizando o JSF sem AJAX. Apresentando ao leitor menos experiente esta tecnologia. Depois vamos acrescentar suporte a AJAXnestaaplicaoapresentandoassimasdiferenas.
2/9
.
Figura1.TeladonossoexemplosemousodoAJAXemexecuo
Paraconstruirnossoexemplo,seronecessriasasseguintesAPIs: 1. AimplementaoderefernciadoJSF.Vocpodeobtlaem java.sun.com/javaee/javaserverfaces/download.html.NesteexemploutilizaremosoJSF1.1, masnadaimpedequesejautilizadooJSF1.2,lembrandoapenasqueestenecessitade containeresquedemsuporteaoJSP2.1. 2. AJakartataglibs,necessriaparaalgunscomponentesJSF.possvelobtlaem jakarta.apache.org/taglibs/doc/standarddoc/intro.html.Nesteexemploestamosutilizando JSTL1.1. NaListagem1apresentadaaclassequerepresentaofuncionrio.NaListagem2estocdigo doManagedBeandaaplicao:aclasseFuncionarioMBean,ondeficaalgicadenegcio. VejaoquadroOquesoManagedBeansparamaisdetalhes.Quandoestaclasseforinstanciada, serpreenchidaumalistadefuncionriosfictcios.(Numaaplicaoreal,estalistapoderiaserlida deumbancodedados.)OmtodogetDepartamentos()retornaumalistacontendotodosos departamentos. Os mtodos selecionarFuncionario() e selecionarDepartamento() tratam eventos de mudana de valores na pgina so executadosquandoousurioselecionaumfuncionrioouumdepartamento.Orestantesogetters esetters. Observe os atributos da classe FuncionarioMBean. O atributo funcionario ter a instnciadofuncionrioselecionado; listaFuncisarmazenaalistadetodososfuncionrios;e funcionariosDepconterapenasalistadosfuncionriosdodepartamentoselecionado. Na Listagem3,temosaconfiguraodoFacesServlet(ocoraodoJSF)ena Listagem4 a configuraodoManagedBeanno facesconfig.xml.Vocsterquefazerestasconfiguraes quandoestiverprogramandosemapoiodeferramentas.EmIDEscomooNetBeanseoEclipse (comWTP)estesarquivosseropreenchidoscomasconfiguraesbsicasautomaticamente. Na Listagem 5 temos a pgina JSP (sem AJAX). Observe que nas tags <h:selectOneMenu> configuramos o evento onchange com submit. Desta forma, quandoousurioalterarovalordestascomboboxes,serfeitaumarequisioparaoservidoreser processado o mtodo selecionarFuncionario() ou selecionarDepartamento().
3/9
Uma vez escolhido o funcionrio, so apresentados os valores de seus atributos dentro da tag <h:panelGrid>. Observequequandoselecionadoumdepartamento,geradaumarequisioparaoservidor.O servidorentorespondecomosfuncionriosdodepartamentoescolhido.Tambmpercebemosuma piscada da tela, pois toda ela atualizada. Temos uma tpica aplicao web com requisio/resposta(eesperas).AdicionaremosagorarecursosAJAXeveremosasdiferenas.
Entra o AJAX
Agora acrescentaremos benefcios doAJAX.ParausalocomJSF existem vrias tecnologias. Entreelaspodemosdestacarduas:oICEfaces,queumaimplementaodoJSFequeutiliza AJAXemseuscomponenteseoAjax4jsf,queadicionarecursosAJAXimplementaodoJSF sendousada(MyFaces,ADFFacesetc.). NesteartigoutilizaremosoAjax4jsf.
O Ajax4jsf
O Ajax4jsf permite de forma simples, a unio dos benefcios do JSF, como ciclo de vida, validaes, converses e outros recursos, com as vantagens de maior interatividade do AJAX. UsandooAjaz4jsf,oleitorverquenohmistrioemadicionarsuporteaAJAXasuaaplicao baseada em JSF.A Figura2 apresenta ociclo devidadoAjax4jsf.Observequeocliente se comunicacomoservidorpormeiodeumEngineAJAX,queimplementadoemJavaScript,no ciente.OJavaScriptsecomunicacomoservidorpormeiodeumfiltro,queveremosmaisadiante qual.Estefiltrorecebeasrequisiesdoclienteerealizaasatividadespertinentesjuntoaociclo devidadoJSF.EsteporsuavezdevolveainformaosolicitadaaoFiltro,quedevolveaoEngine Ajaxefinalmenteatualizaocomponentenapgina.
JSF
FasesdoJSF
4/9
Figura2.CiclodevidadoAjax4jsf
Concluses
NesteartigovimoscomoutilizaroAjax4jsfparaadicionarrecursosAJAXaaplicaesbaseadas no JSF, e como configurar umambiente inicial para desenvolvimento. J existem projetos em ambiente de produo utilizando estas tecnologias e estes tm demonstrado um bom grau de maturidadedoAjax4jsf.
Listagem 1. Classe Funcionario
p a c k a g e javamagazine.exemplo;
5/9
6/9
Listagem 5. funcionariosSemAjax.jsp
<%@tagliburi="http://java.sun.com/jsf/core"prefix="f"%> <%@tagliburi="http://java.sun.com/jsf/html"prefix="h"%> <html> <head> <linkhref="estilo.css"rel="stylesheet"type="text/css"/> </head> <bodybgcolor="#ffffff"> <f:view> <h:form> <h:panelGridcolumns="2"> <f:facetname="header"> <h:outputTextvalue="Funcionarios:"/> </f:facet> <h:outputTextvalue="Departamento:"/> <h:selectOneMenuonchange="submit()" valueChangeListener="#{funcionarioMBean.selecionarDepartamento}"> <f:selectItemsvalue="#{funcionarioMBean.departamentos}"/> </h:selectOneMenu> <h:outputTextvalue="Funcionrio:"/> <h:selectOneMenuonchange="submit()" valueChangeListener="#{funcionarioMBean.selecionarFuncionario}" id="func"> <f:selectItemsvalue="#{funcionarioMBean.funcionariosDep}"/> </h:selectOneMenu> </h:panelGrid> <h:panelGridid="dados"columns="2"> <h:outputTextvalue="Nome:"/> <h:outputTextvalue="#{funcionarioMBean.funcionario.nome}"/> <h:outputTextvalue="Endereo:"/>
7/9
<h:outputTextvalue="#{funcionarioMBean.funcionario.endereco}"/> <h:outputTextvalue="Salrio:"/> <h:outputTextvalue="#{funcionarioMBean.funcionario.salario}"/> <h:outputTextvalue="Departamento:"/> <h:outputTextvalue="#{funcionarioMBean.funcionario.departamento}"/> </h:panelGrid> </h:form> </f:view> </body> </html>
Listagem 7. funcionariosComAjax.jsp
<%@tagliburi="https://ajax4jsf.dev.java.net/ajax"prefix="a4j"%> <%@tagliburi="http://java.sun.com/jsf/core"prefix="f"%> <%@tagliburi="http://java.sun.com/jsf/html"prefix="h"%> <html> <head> <linkhref="estilo.css"rel="stylesheet"type="text/css"/> </head> <bodybgcolor="#ffffff"> <f:view> <h:form> <h:panelGridcolumns="2"> <f:facetname="header"> <h:outputTextvalue="Funcionarios:"/> </f:facet> <h:outputTextvalue="Departamento:"/> <h:selectOneMenu valueChangeListener="#{funcionarioMBean.selecionarDepartamento}"> <f:selectItemsvalue="#{funcionarioMBean.departamentos}"/> a4j:supportevent="onchange"reRender="func"/> < </h:selectOneMenu> <h:outputTextvalue="Funcionrio:"/> <h:selectOneMenu valueChangeListener="#{funcionarioMBean.selecionarFuncionario}" id="func"> <f:selectItemsvalue="#{funcionarioMBean.funcionariosDep}"/> <a4j:supportevent="onchange"reRender="dados"/> </h:selectOneMenu> </h:panelGrid> <h:panelGridid="dados"columns="2">
8/9
<h:outputTextvalue="Nome:"/> <h:outputTextvalue="#{funcionarioMBean.funcionario.nome}"/> <h:outputTextvalue="Endereo:"/> <h:outputTextvalue="#{funcionarioMBean.funcionario.endereco}"/> <h:outputTextvalue="Salrio:"/> <h:outputTextvalue="#{funcionarioMBean.funcionario.salario}"/> <h:outputTextvalue="Departamento:"/> <h:outputTextvalue="#{funcionarioMBean.funcionario.departamento}"/> </h:panelGrid> </h:form> </f:view> </body> </html>
Estatagpermitefazerrequisiesperidicasparaoservidoreatualizarapginade formaautomtica.Vejaumexemplo:
<h:form id="form1"> <a4j:poll interval="5000" reRender="campo1, campo2 /> </h:form>
Neste exemplo os campos campo1 e campo2 sero atualizados a cada 5000 ms (5 segundos). Observamos este comportamento no gmail, quando recebemos um novo emailnonecessrioatualizarapgina,poisestadetemposemtemposatualizase automaticamente.
a4j:log
Esta tag abre uma janela popup no lado do cliente com informaes de debug das requisiesAjax.Muitotilparaverificaodeerrosnapgina.Ex.:
<a4j:log/> <!- j suficiente para a exibio das informaes do debug. -- >
9/9
comunicaoentreocdigojavaeojsp.Sosimplespoisdiferentementedosservlets nopossuemaobrigatoriedadeemherdardeumaclasseespecifca. AsinstanciasdosManagedBeanssorealizadaspeloprprioJSF.Odesenvolvedor noprecisasepreocupareminstancilos. Costumamos utilizar o arquivo facesconfig.xml (localizado no diretrio WEBINF da aplicao)paradeclararosManagedBeans.Ex.:
<managed-bean> <managed-bean-name>funcionarioMBean</managed-bean-name> <managed-bean-class>javamagazine.exemplo.FuncionarioMBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
Observeautilizaode#{}.Estecdigoquerdizerqueatagh:outputTextmostraro contedodoatributovalordomanagedBean.
Links
ajax4jsf.dev.java.net Pginaoficialdoprojetoajax4jsf java.sun.com/javaee/javaserverfaces/download.html PginadedownloaddoJSF jakarta.apache.org/taglibs/doc/standarddoc/intro.html PginadaJakartataglib
Livros
CoreJavaServerFaces,DavidGearyeCayHorstmann ApresentaoJavaServerFaces