JavaServer Faces Rapid Web Application Development em Java Ricardo Cavalcanti [email protected] Jobson Ronan [email protected] O que é? Um framework padrão(Standard) para aplicações webs Define um modelo de programação Componentes Reusáveis Gera HTML a partir dos componentes Validação e conversão Arvore de componentes Objetivos Simplificar o desenvolvimento Suporte por ferramentas Eventos facilmente ligado a código server-side Fácil de estender Gerenciar o estado da UI Padrões e Arquitetura Model-View-Controller (MVC) Baseada em factories Árvore de componentes (Composite) Eventos do lado do servidor Mas o que é mesmo? Uma aplicação JSF é como qualquer outra aplicação web Java Roda dentro de um servlet container, e normalmente é composta de: Simples componentes Java Beans Event Listeners Páginas, como páginas JSP Outras classes como classes de acesso a dados Mas o que é mesmo? Em adição aplicações JSF também contém: Uma tag library para renderizar os componentes gráficos na página Uma tag library para tratamento de eventos, validações e outras acções Backing Beans, que definem propriedades e funções para os componentes gráficos Mas o que é mesmo? Além de: Classes implementando validators, converters, event listeners e event handlers Um descritor de aplicação para configurar o funcionamento da mesma Como usar? Prescisa-se de uma implementação: Implementação de referência MyFaces, do grupo Jakarta Ciclo de vida do Requestresponse Como usar? Declarar o Faces Servlet (Front Controller) web.xml <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/faces-config.xml</param-value> </context-param> Como usar? Características Front Controller MVC (como Struts) Configuravel através de parametros de contexto Simples exemplo Botão “trocar” troca o conteúdo do campo1 pelo do campo2, e viceversa Implementando páginas TagLibraries UIComponent + HTML RenderKit Renderer <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %> Core JavaServer Faces <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %> UIComponent + HTML RenderKit Renderer <h:inputText> Define um campo de entrada de texto Atributos • value: expressão que indica o conteúdo do campo. Possivelmente uma propriedade de um bean <h:inputText id="campo1" value="#{TrocaBean.campo1}"/> UIComponent + HTML RenderKit Renderer <h:commandButton> Define um botão de ação Atributos • action: expressão que indica a ação a ser invocada quando este componente for ativado • actionListener: expressão que indica o método de listener que será notificado quando este componente for ativado UIComponent + HTML RenderKit Renderer <h:commandButton> <h:commandButton id="trocar" action="#{TrocaBean.trocar}" value="Trocar" /> O método “trocar” do bean Trocar, não deve receber parâmetros e deve retornar uma String UIComponent + HTML RenderKit Renderer <h:commandLink> Renderiza um componente “a” HTML que funciona como um botão submit de um form • Uso análogo ao commandButton UIComponent + HTML RenderKit Renderer <h:form> Renderiza um formulário HTML Core JavaServer Faces <f:view> Container para todos os componentes usados na página Todos os componentes JavaServer Faces devem ser aninhados a este Exemplo completo <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <f:view> <h:form> <fieldset> <legend>Troca Exemplo</legend> <label>Campo1: <h:inputText id="campo1" value="#{TrocaBean.campo1}"/> </label><br/> <label>Campo2: <h:inputText id="campo2" value="#{TrocaBean.campo2}"/> </label><br/> <h:commandButton id="trocar" action="#{TrocaBean.trocar}" value="Trocar" /> </fieldset> </h:form> </f:view> </body> </html> Backing Bean Model Que bean “TrocaBean” é este? package pcc; public class Troca { private String campo1; private String campo2; //gets e sets ... public String troca() { String temp = campo1; campo1 = campo2; campo2 = temp; return “sucesso”; } } Backing Bean Model Declarado no faces-config.xml <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <managed-bean> <managed-bean-name>TrocaBean</managed-bean-name> <managed-bean-class>pcc.Troca</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> </faces-config> Backing Bean Model Demostração... Validação Suporte validação de campos de entrada de forma declarativa <f:validateDoubleRange>, <f:validateLengtg>, <f:validateLongRange> e outros validators customizados podem ser aninhados campos de entrada Validação Suporte validação de campos de entrada de forma programática Um método do bean no formato public void xyz(FacesContext faces, UIComponent coponent, Object value) Uma classe que implemente a interface javax.faces.validator.Validator Validação Mensagens de erro podem ser impressas utilizando a tag <h:message> Atributos • for: O id do campo do qual deseja-se mostrar uma mensagem, possivelmente de erro <h:message for="campo1"/> Validação Demostração... O que mais? Navegação definida no facesconfig.xml Condicionada e método do bean Condicionada a retorno do método do bean O que mais? Exemplo (faces-config.xml) <faces-config> <!-- ... --> <navigation-rule> <description></description> <from-view-id>/troca.jsp</from-view-id> <navigation-case> <description></description> <from-outcome>success</from-outcome> <to-view-id>/trocaSucesso.jsp</to-view-id> </navigation-case> </navigation-rule> <!-- ... --> </faces-config> O que mais? Injeção de dependência nos beans Suporte a internacionalização O que mais? Converters para a conversão de entradas em objetos específicos Implementados de formas análogas a validação Listeners de eventos do usuário Implementados de formas análogas a validação e a converters O que mais? Gerênciadores de layout <h:panelGrid> Geração de Tabelas de dados total suporte a coleções <h:dataTable var=“filme” value=#{filmes}> <h:column id=“#{filme.nome}”> O que mais? Suporte a outros tipos de entrada <h:selectBooleanCheckbox> <h:selectManyCheckbox> <h:selectManyListbox> <h:selectManyMenu> <h:selectOneListbox> <h:selectOneMenu> <h:selectOneRadio> O que mais? Implementação open-source, MyFaces (jakarta), com excelentes componentes customizados Geradores de menus Geradores de popups Geradores de Barra de navegação Grande quantidade de Validators customizados: EmailValidator, CreditCardValidator, etc. O que mais? Suporte de ferramentas comerciais para geração Drag’n Drop Sun Java Studio Creator IBM Webspheere JDeveloper (free) Uma tecnologia de geração de páginas a altura de ASP.NET Porém, com toda a maturidade da linguagem Java no ServerSide