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