Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo
Introduo Desenvolvimento Web Aplicaes web tornam-se mais e mais importantes Mais e mais complexas:
Ajax, validao (server vs. client), efeitos... Exigncia mais elevada do cliente durante os anos Interfaces ricas (fceis de usar) Prazos cada vez mais curtos Desenvolvimento considerado difcil
Introduo Surgiram diversos frameworks MVC: Apache Struts WebWork (Struts2) Spring MVC Tapestry Jboss Seam E muito outros.. continuam surgindo mais
Introduo Problemas Java no nos fornece o bastante para desenvolvermos aplicaes web com produtividade Dificuldade para integrar vrios frameworks (algumas vezes nem possvel) Falta de padro para um framework web Ausncia de uma API padro para construir componentes web java
Introduo HTML Esttico, simples No tem conexo com Base De Dados timo para criar Home Pages
OlaMundo.html <html> <head> <title>Ol Mundo</title> </head> <body> Ol Mundo. </body> </html>
Introduo Servlets uma extenso de servidores Disponibiliza uma interface para o servidor Recursos Dinmicos para web Interage com os clientes Necessita de um Servlet Container (Ex: Tomcat)
Introduo Servlets
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>Ol Mundo</body></html>"); out.close(); } }
Introduo Java Server Pages JSP O JSP foi desenvolvido APENAS para mostrar resultados, o SERVLET deveria fazer a ponte com o banco de dados e fazer as regras de negcio Facilitar a criao de HTML Scriplets: colocar cdigo Java no JSP ;-(
Introduo OlaMundo.jsp
<html> <body> <% String mensagem = "Ol Mundo!"; out.println(mensagem); %> <br> Muito mais simples de editar o html e muito mais complicado de editar o codigo Java <br> </body> </html>
Introduo Frameworks Frameworks so projetados com a inteno de facilitar o desenvolvimento de software, habilitando designers e programadores a gastarem mais tempo determinando as exigncias do software do que com detalhes de baixo nvel do sistema No reinventar a roda
Introduo Struts Framework: Action Based MVC para construes de aplicaes WEB Cada solicitao HTTP tem que ser respondida com uma resposta HTTP O .do mapeado no arquivo struts-config.xml O ActionServlet define o Action correspondente para a solicitao
Introduo Struts Framework: Action Based O ActionServlet coloca a entrada em um JavaBean , estes JavaBeans so definidos como FormBeans O Action pode acessar o FormBean efetuar qualquer operao e armazenar o resultado em um ResultBean O Action interage com a camada de negcio onde uma base de dados poder ser atualizada
Introduo Framework: Component Based Rpido aprendizado Baseado em Componentes Deixa o programador despreocupado com a parte visual Programao Web como Desktop Simplicidade Agilidade
Introduo Frameworks Web Component Based Java Server Faces JBossSeam Wicket
JSF - Introduo JavaServer Faces ... Uma especificao ? Um framework baseado em componentes ? Interface com o usurio ? Um framework dirigido a eventos ? Padro de mercado ? RAD ? Um framework MVC ?
JSF - Introduo ... um framework dirigido a eventos Possui um modelo para manipulao de eventos Componentes geram determinados eventos Faz chamada um mtodo (ao no servidor) O estado da aplicao web muda devido ao evento disparado pelo usurio Um evento pode ser um click em um boto, focar sobre um input ou mesmo alterar o valor de uma combo-box
JSF - Introduo ... padro de mercado uma especificao (JCP) Java EE 5.0 Suporte de Big Players Sun, Apache, IBM, Oracle, BEA Systems, Borland, ... IDEs (NetBeans, Eclipse, MyEclipse, JDeveloper, ...) Implementaes (Sun (R.I), Apache, IBM, ...) Conjuntos de componentes (ADF Faces, Apache MyFaces, WoodStock, IceFaces, JBoss RichFaces, ...)
JSF - Introduo .. RAD (Rapid Application Development) JSF padroniza os primeiros trs pontos e permite a criao de ferramentas RAD Utiliza-se IDEs drag-and-drop para construir aplicaes Sun Studio Creator, NetBeans, Jdeveloper,Eclipse etc
JSF - Introduo ... um framework MVC para construir interfaces com o usurio para aplicaes web. JSF inclui: Um conjunto de APIs para: representar os componentes UI e gerenciar o estado destes componentes manipular os eventos e validao de entrada do usurio definir e controlar a navegao entre as pginas dar suporte a internacionalizao e acessibilidade
JSF - Introduo Resumo mais do que um framework, uma especificao baseada em MVC Suporte internacionalizao Facilita criao de telas Facilita a transferncia dos dados entre telas e camadas de negcio atravs da EL Facilidade para criao de componentes
JSF - Introduo Resumo Produtividade para conversores recebidos do formulrio para os tipos nas classes Flexibilidade para renderizao Criar modelos simples de eventos entre interfaces grficas e as classes no servidor Mecanismos produtivos para validao de campos na tela
JSF - Introduo Por que usar JSF? um padro de mercado Presente na especificao JEE5.0 e em breve JEE6.0 Suporte de Big Players Fcil de usar e produtivo Fornece separao de funes que envolvem a construo de aplicaes Web
JSF Por que usar JSF? Alta abstrao para desenvolvimento de aplicao web Modelo de programao dirigido a eventos (oposto ao modelo HTTP request/response) Baixa curva de aprendizagem da equipe Vrios pontos de extenso (converters, validators, listeners etc) Componentes j prontos!
JSF Por que usar JSF? Reusabilidade e estrutura de componentes extensvel Acessibilidade (browsers, celulares, pdas, ...) Segurana OWASP (Open Web Application Security Project) cross-site scripting, session hijacking, execuo de mtodos, ... Natureza orientada a componentes, validao e pontos de extenso
JSF Por que usar JSF? Grande atividade da comunidade em fruns, listas de discusso, blogs, portais, revistas, livros etc Integrao com diversos frameworks: Spring, Spring-Annotation, Spring-Webflow, Hibernate, EJB3, JPA, JBoss Seam, Acegi, JAAS, Struts, Struts2, Shale, Tiles, Facelets, Sitemesh, DWR, EXT, Crank, BeehiveWebflow, GWT, Portlets e muitos outros
JSF Por que usar JSF? Testes unitrios Shale testing framework Templates Tiles e Sitemesh Facelets
JSF Por que usar JSF? IDEs e WYSIWYG (What you see is what you get) Eclipse (MyEclipse, Europa, Ganymed), IntelliJ IDEA, Jbuilder, NetBeans (Visual WebPack) , IBM Rational App/Web Sun Java Studio Creator , Oracle Jdeveloper, Red Hat Developer Studio (antigo Exadel Studio) e JSFToolbox (Dreamweaver)
JSF Por que usar JSF? Grande variedade de componentes comerciais e opensource disponveis Myfaces Tomahawk Backbase Myfaces Sandbox Simplica (ECruiser Suite) Myfaces Tobago QuipuKit Myfaces Trinidad Blueprints
JSF Por que usar JSF? Myfaces Orchestra ADF Faces IceFaces WoodStock JBoss RichFaces JBoss Ajax4jsf RCFaces Jenia4Faces ZK G4JSF (GWT API) Dynamic Faces Crank
JSF Conceitos chaves do JSF Componentes Renderers Managed-beans Converters / Validators Navegao Eventos Ciclo de vida (Request Lifecycle)
JSF Componentes Separa a lgica de negcio da apresentao Cada view composta por uma hierarquia de componentes Componentes podem ser adicionados na view programaticamente ou via template (JSP por default, ou Facelets para melhor desempenho e fcil desenvolvimento)
JSF Componentes so expressos em tags em uma pgina JSP e em sua maioria so de interface com o usurio Os componentes padres so divididos em dois grupos: Faces Core <f:view>, <f:loadBundle>, <f:param> HTML wrappers <h:dataTable>, <h:selectOneMenu> Componente = class + [renderer] + tag handler (JSP)
JSF Renderers Responsvel por exibir o componente no cliente So agrupados em render kits Render kit padro o HTML, mas podemos ter WML, SVG etc. Efetua o encode (gera HTML do componente) Efetua o decode (seta o componente com os dados da URL query string e do formulrio)
JSF Renderes:
JSF Managed beans Podem ser definidos nos escopos de: Application, Session, Request e None uma classe que envia objetos de negcio para camada de apresentao So registrados no faces-config.xml
JSF Managed beans Objetos que sofrero alteraes em seus atributos durante uma requisio, assim como seus mtodos podem ser chamados a partir de um command So como as Actions do Struts, porm os form beans so injetados por setters dentro do seu prprio bean Os ManagedBeans sero usados na EL das pginas
Session
User user = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
Session
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", (User)users.getRowData());
JSF
JSF Value Binding Binda valor do componente ao managed-bean O binding ocorre atravs de JSF Expression Language (EL) Semelhante a JSTL, porm usa-se #{} no lugar de ${} Pode-se executar mtodos no modelo atravs de expresses No processada imediatamente como na JSTL A partir da JSF 1.2 utiliza-se a Unified Expression Language (JSP 2.1) que resolve problemas de incompatibilidade entre a JSF-EL e JSP-EL
<h:outputText value="#{pessoa.nome}"/>
JSF
JSF Value Binding
JSF
JSF Value Binding
JSF Converters Tem por finalidade converter e/ou formatar objetos do tipo Java para String e vice-versa Converters so bi-direcionais Managed-bean faz: getAsObject() JSP faz: getAsString()
JSF Converters JSF j fornece converters padres para date / time, numbers etc Voc pode implementar seu prprio converter:
Basta implementar a interface javax.faces.convert.Converter Registrar o converter no faces-config.xml
O converter pode atuar de forma explcita(id) ou implcita(class) de acordo com a sua configurao no faces-config.xml
JSF
Converter para que toda propriedade do tipo org.com.model.CPF de qualquer bean use este converter
<converter> <converter-for-class> org.com.model.CPF </converter-for-class> <converter-class> org.com.faces.CPFConverter </converter-class> </converter>
JSF
Converter declarado explicitamente:
<h:inputText id=cpf value="#{UserRegistration.user.cpf}"> <f:converter converterId=br.com.CPFConverter /> </h:inputText>
JSF
Converter Padres do JSF:
JSF Validatores Tem por responsabilidade garantir que o valor informado pelo usurio seja vlido Validador trabalha com objetos, no somente com Strings JSF j fornece validadores padres como required, length, range etc
JSF Voc pode implementar seu prprio validador Basta implementar a interface javax.faces.validator.Validator Registrar o validador no faces-config.xml Voc pode associar um ou mais validadores a um componente
JSF javax.faces.validator.Validator
JSF
Navegao Navegao de uma pgina para outra Simples e poderoso sistema de navegao O framework seleciona a prxima view baseado:
Na view anterior Resultado(outcome) de uma action EL de ao (ex.: #{mBean.user.save}) Qualquer combinao acima
JSF Navegao
JSF Navegao
JSF Eventos Componentes geram determinados eventos que por sua vez disparam aes no servidor (mtodo(s) no managed-bean ou listeners) Voc tambm pode implementar listeners de ao associados a outros componentes do formulrio Os listeners mais comuns do JSF so
ActionListener ValueChangeListener
Mtodo no managed-bean
public String cadastrar() { // processa evento return listar; // retorna para view listar }
JSF Value-change event que executa mtodo aps alterar o valor do componente
<h:selectOneMenu id=UF value=#{cadastroBean.uf} valueChangeListener=#{cadastroBean.carregaCidades} onchange=submit();> <f:selectItems value=#{cadastroBean.ufList} /> </h:selectOneMenu>
Restore Component Tree: O conjunto de componentes JSF criado ou restaurado dependento da requisio (Primeira ou demais vezes executadas)
JSF (Fases) Apply request Values: Os componentes iro extrair seu novo valor dos parmetros da Request, colocando-os em variveis de estado no servidor
JSF (Fases)
Process Validations: todos os validadores sero executados, em caso de erro de qualquer valor, a mensagem alocada no FacesContext, caso contrrio ele atualiza (Update Model Values) os valores dos inputs na camada de negcio atravs da EL
JSF (Fases)
Invoke Application: Os mtodos do ManagedBeans so executados e as regras de navegao (Gravar, Excluir, Alterar,...) so resolvidas. Se tudo ocorrer bem renderizada pelo container do JSP, caso contrrio as mensagens gravadas no FacesContext so apresentadas
JSF (Fases)
Caso queira pular as fazer de validao e converso, basta utilizar o parametro immediate=true
JSF JSF Extension Points Customizar componentes Phase listeners (antes, depois de qualquer fase) Customizar converters / validators Customizar renderers Customizar ActionListenerImpl para manipular eventos Decorar ou substituir view handler, navigation handler, state manager etc
JSF
faces-config.xml Arquivo XML para configurar recursos da aplicao Contm regras de navegao, customizao e extenso de converters, validators, componentes etc Geralmente est localizado dentro de /WEB-INF/faces-config.xml Pode ser dividido em diretrios e sub-diretrios ou dentro de arquivos jar Seta javax.faces.application.CONFIG_FILES no web.xml Ou ento coloca-se META-INF/faces-config.xml dentro de um jar
JSF
faces-config.xml (Resumo) <faces-config ... > <converter> <converter-id>core.faces.CnpfCnpjConverter</converter-id> <converter-class>converter.CnpfCnpjConverter</converter-class> </converter>
JSF
faces-config.xml (Resumo) <managed-bean> <managed-bean-name>reportBean</managed-bean-name> <managed-bean-class>bean.ReportBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>
JSF
faces-config.xml (Resumo) <navigation-rule> <from-view-id>/jsp/deposito/tiporeq/searchList.jsp</from-view-id> <navigation-case> <from-outcome>deposito.tiporeq.update</from-outcome> <to-view-id>/jsp/deposito/tiporeq/update.jsp</to-view-id> </navigation-case> </navigation-rule>
<form id="jsftags" method="post" action="/jsftags/faces/pages/tags.jsp" enctype="application/x-www-form-urlencoded"> ... <input type="hidden" name="jsftags" value="jsftags" /> <input type="hidden" name="jsftags:link" /> </form>
<a id="_id0:link href="#" onclick= "document.forms['_id0']['_id0:link'].value= '_id0:link'; document.forms['_id0'].submit(); return false; >Next Page</a>
<h:outputText value="#{jsfexample.zipCode}"/>
<span style="color: red"> Validation Error: Value is required. </span> <input id="jsftags:useraddress" type="text" name="jsftags:useraddress" value="" /> <input type="submit" name="jsftags:_id1" value="Save" /> Escrevendo uma mensagem: FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Usurio j Cadastrado!"));
<h:outputText value="Would you like email updates?"/> <input type="checkbox name="jsftags:_id6" checked title="emailUpdates" /> Would you like email updates?
span id="jsftags:cars"> <table><tr> <td><label for="jsftags:cars"> <input name="jsftags:cars value="accord" type="checkbox"> Honda Accord</input></label></td> <td><label for="jsftags:cars><input name="jsftags:cars value="4runner" type="checkbox"> Toyota 4Runner</input> </label></td> <td><label for="jsftags:cars><input name="jsftags:cars value="nissan-z" type="checkbox"> Nissan Z350</input<</label></td> </tr></table> </span>
<select id="jsftags:cars_selectManyListbox name="jsftags:cars_selectManyListbox multiple size="3"> <option value="accord">Honda Accord</option> <option value="4runner">Toyota 4Runner</option> <option value="nissan-z">Nissan Z350</option> </select>
Honda Accord Toyota 4Runner Nissan Z350 <select id="jsftags:selectCar name="jsftags:selectCar" size="1"> <option value="accord">Honda Accord</option> <option value="4runner">Toyota 4Runner</option> <option value="nissan-z">Nissan Z350</option> </select>
Componentes JSF
Atributos importantes: required, immediate, readonly, rendered .....
<h:inputText value="#{numberBean.userNumber}" required="true" validatorMessage="O nmero tem que ser entre 0 e 100" readonly=false" rendered=true > <h:commandButton value="Desistir" action="desistir" immediate="true"/>
Exerccio 1
Criar um cadastro de Pessoa. Criar um bean que represente o formulrio (Nome, Endereo, Telefone ) Usar f:view e h:form para os formulrios Especificar o Action Controller com o atributo de ao h:commandButton Criar uma Action para inserir os dados do formulrio, chame a lgica de negcio, guarde os resultados em uma lista e imprima os valores no console Usar o faces-config para declarar o form bean e navegao Aps inserir, imprimir no console quem foi inserido e enviar para uma pgina de sucesso com um boto voltar
Exerccio 1 (Continuao)
Validao: Utilizar o h:messages e h:message
<h:messages style="color: red"/>
DataModel Para enviar os dados para view em fomato de tabela, basta criar um objeto DataModel Para inserir os objetos no DataModel: dataModel.setWrappedData(Lista) Para obter os objetos da tabela : dataModel.getWrappedData() ou getRowData()
Exerccio 2
Usando DataModel Inserir uma tabela no cadastro do exerccio 1 Criar um link para apagar o registro da tabela
Exerccio 3
Criar um evento de mudana em um combo. Criar um combo na tela de tipo de endereo Inserir os tipos (Rua, Quadra, Lote ....) Criar um mtodo para capturar essa mudana e imprimir no console o valor antigo e o novo
Exerccio 4 (Opcional)
Navegao: Sortear um nmero usando o Math.random()*100 Pedir para o usurio entrar com o nmero Se estiver certo, enviar para pgina de sucesso com opo de sair ou jogar novamente, se estiver errado avisar que est errado e informar se maior ou menor, o usurio pode desistir, enviando para uma tela confirmao.
Exerccio 4 (Opcional)
Navegao:
Exerccio 5 (Opcional)
Criar validadores: Validador de Nome, que s aceite seu nome. Validador de email Validador que no aceite data no passado.
Exerccio 5 (Opcional)
Criar validadores:
public class ValidatorNome implements Validator { @Override public void validate(FacesContext arg0, UIComponent arg1, Object arg2) throws ValidatorException { String nome = (String)arg2; if (nome != null && nome.equalsIgnoreCase("gabriel")) { throw new ValidatorException(new FacesMessage(arg1.getClientId(arg0),"Nome Invlido")); } }
Exerccio 6 (Opcional)
Criar conveter: Criar um objeto UF (cdigo e nome) Utiliz-lo em um combo Criar um converter para UF
Exerccio 6 (Opcional)
Converter:
public class UFConverter implements Converter { @Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) { if(StringUtils.isEmpty(value)){ return null; } UF uf = new UF(); if (value.equals("DF")) { <h:selectOneMenu value="#{user.uf}" uf.setCodigo(1); valueChangeListener="#{userAction.mudarUF}" onblur="submit()" uf.setNome("DF"); converter="ufConverter"> } else if (value.equals("SP")) { uf.setCodigo(3); <f:selectItems value="#{userAction.listaUF}" /> uf.setNome("SP"); </h:selectOneMenu> } else if (value.equals("GO")) { public List<SelectItem> getListaUF() { uf.setCodigo(3); uf.setNome("GO"); List<SelectItem> items = new ArrayList<SelectItem>(); } items.add(new SelectItem(new UF(1 , "DF"))); return uf; items.add(new SelectItem(new UF(2 , "SP"))); } @Override public String getAsString(FacesContext arg0, UIComponent arg1, Object value) { return value.toString(); }
JSF 2.0
Suporte a templates, baseado no Facelets, Tiles, dentre outros Simplificar a criao de aplicaes do tipo CRUD Melhor tratamento de mensagens de erro Mecanismo de tratamento de excees padro Criao de aplicaes Web sem XML, utilizando anotaes Simplificao no desenvolvimento de componentes Especificar onde os artefatos (Conversores, Renderizadores, etc.) devem ser colocados no WAR, permitindo ao container encontr-los sem a necessidade de sua definio em arquivos de configurao Permitir que artefatos sejam alterados sem a necessidade de reinicializar o servidor
FIM