jsf

25
Java Server Faces (JSF) O que é JSF ? Mais que um framework para desenvolver aplicações web de forma ágil, JSF foi incorporado ao especificação J2EE. Quais os "módulos" que compõem o JSF? Componentes Eventos Valiação e conversões Navegabilidade Backbeans Divisão de papéis com JSF ? Web-Design: Quem cria a "cara" da aplicação, em nosso caso usando HTML Desenvolvedores de aplicação: Quem é responsável por programar objetos, validadores, classes de suporte etc Desenvovedores de componentes: Normalmente, o cara que tem uma boa experiência em programar interface com o usuário e prefere criar UIComponents customizados. Arquitetos de aplicação: O responsável por planejar a aplicação se preocupando com: Escalabilidade, comunicação entre os módulos, Persistência, Transação etc. (Nosso conhecido plano arquitetural). Fornecedores de ferramentas: São os que fornecem ferramentas para auxiliar na produtividade do time. exemplos de ferramentas: Borland JBuilder 2005 Enterprise Eclipse with Exadel Studio Pro Eclipse with Nitrox JSF IDE IBM Rational with JSF support Macromedia Dreamweaver with JSTL and JSF extensions MyEclipse with JSF Developer Oracle JDeveloper Embora haja a definição de papéis é muito comum a acumulação de papéis e até mesmo a divisão de um papel. O que JSF trás de bom? MVC para aplicações web "fácil" de usar componentes extensíveis Boa demanda do mecado e conseqüentemente dos desenvolvedores Código aberto O que temos de diferente com JSF ? Se tornou um padrão Uso de componentes (cuidado, não confundir com componentes de negócio) Conceito de evento para os componentes (temos um conceito muito parecido com os componentes swing) Gerencia estados dos componentes Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf... 1 de 25 16-07-2012 18:51

Transcript of jsf

Page 1: jsf

Java Server Faces (JSF)

O que é JSF ?

Mais que um framework para desenvolver aplicações web de forma ágil, JSF foi incorporado aoespecificação J2EE.

Quais os "módulos" que compõem o JSF?

ComponentesEventosValiação e conversõesNavegabilidadeBackbeans

Divisão de papéis com JSF ?

Web-Design: Quem cria a "cara" da aplicação, em nosso caso usando HTML

Desenvolvedores de aplicação: Quem é responsável por programar objetos, validadores, classesde suporte etc

Desenvovedores de componentes: Normalmente, o cara que tem uma boa experiência emprogramar interface com o usuário e prefere criar UIComponents customizados.

Arquitetos de aplicação: O responsável por planejar a aplicação se preocupando com:Escalabilidade, comunicação entre os módulos, Persistência, Transação etc. (Nosso conhecidoplano arquitetural).

Fornecedores de ferramentas: São os que fornecem ferramentas para auxiliar na produtividade dotime.

exemplos de ferramentas:

Borland JBuilder 2005 EnterpriseEclipse with Exadel Studio ProEclipse with Nitrox JSF IDEIBM Rational with JSF supportMacromedia Dreamweaver with JSTL and JSF extensionsMyEclipse with JSF DeveloperOracle JDeveloper

Embora haja a definição de papéis é muito comum a acumulação de papéis e até mesmo a divisãode um papel.

O que JSF trás de bom?

MVC para aplicações web"fácil" de usarcomponentes extensíveisBoa demanda do mecado e conseqüentemente dos desenvolvedoresCódigo aberto

O que temos de diferente com JSF ?

Se tornou um padrãoUso de componentes (cuidado, não confundir com componentes de negócio)Conceito de evento para os componentes (temos um conceito muito parecido com os componentesswing)Gerencia estados dos componentes

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

1 de 25 16-07-2012 18:51

Page 2: jsf

Curiosidade

Struts e JSF podem ser usados juntos em um mesmo projeto.Até mesmo em uma mesma páginaDentro até mesmo de um mesmo formulário (isso fede, mas é possível)

Como a especificação do JSF se ajusta

O que tenho que saber para começar a discutir e implementar aplicações usando o faces ?

Criar páginas usando UIComponents e as core tags do faces.definir regras de navegação no arquivo de configuração do faces.Desenvolver backbeansAdicionar esses backbeans no arquivo de configuração do faces

UIComponents e core tags

São classes que representam os componentes de interface.Particularidades:

Todo componente é extensívelImplementa as seguintes intefaces:

ActionSource: diz que componentes podem disparar eventos de açãoValueHolder:Diz que o componente mantém um valor local para acessar o seumodelo com conversão de tipos.StateHolder: salva os estados dos objetos entre os requests.NamingContainer: diz que cada componente deve conter um id únicoEditableValueHolder: é específica para componentes editáveis, herda de StateHoldere adiciona suporte à validação e a emissão de value-change events

Diagrama de classes

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

2 de 25 16-07-2012 18:51

Page 3: jsf

Regras de navegação:

É o mecanismo que permite unir algum tipo de processamento com seqüência de páginas a seremmostradas.Quando um botão ao um link é clicado, o componente associado gera um ActionEvent que élançado para os seus listeners.O receptor desse evento é o que chamamos de Backbean (Bean comum), um action method nessaclasse vai ser executada e o resultado disso vai ser uma String que deve se encaixar na regra denavegação.

<navigation-rule>

<from-view-id>/greeting.jsp</from-view-id>

<navigation-case> <from-outcome>success</from-outcome> <to-view-id>/response.jsp</to-view-id> </navigation-case>

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

3 de 25 16-07-2012 18:51

Page 4: jsf

<navigation-case> <from-outcome>fail</from-outcome> <to-view-id>/fail.jsp</to-view-id> </navigation-case>

</navigation-rule>

BackBean:

São classes simples, não herdão de ninguém nem são obrigados a implementar nenhuma interfacePossuem nossos famosos getter e setters seguindo a convenção JavaBeanPossuem os métodos relacionados

Validation methods: métodos de validação :)

JSP:

<h:inputText id="email" value="#{checkoutFormBean.email}" size="25" maxlength="125" validator="#{checkoutFormBean.validateEmail}"/>

Backbean:

public void validateEmail(FacesContext context, UIInput toValidate) { String message = ""; String email = (String) toValidate.getValue(); if (email.indexOf('@') == -1) { toValidate.setValid(false); message = CoffeeBreakBean.loadErrorMessage(context, CoffeeBreakBean.CB_RESOURCE_BUNDLE_NAME,"EMailError"); context.addMessage(toValidate.getClientId(context),new FacesMessage(message, "")); } else { toValidate.setValid(true); }}

Action Event Handler Method: métodos que recebem um ActionEvent e são void (nãoprocuram nenhuma regra de negação, voltam para a mesma página).

Apenas os componentes que implementam ActionSource podem usar esse método.UICommand e UIButton

JSP:

<h:commandLink id="NAmerica" action="bookstore" actionListener="#{localeBean.chooseLocaleFromLink}">

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

4 de 25 16-07-2012 18:51

Page 5: jsf

Backbean:

public void chooseLocaleFromLink(ActionEvent event) {

String current = event.getComponent().getId();

FacesContext context = FacesContext.getCurrentInstance();

context.getViewRoot().setLocale((Locale)

locales.get(current));

}

Value change event handler methods:

JSP:

<h:inputText id="name" size="50" value="#{cashier.name}" required="true" valueChangeListener="#{cashier.processValueChange}" /></h:inputText>

Backbean:

public void processValueChange(ValueChangeEvent event) throws AbortProcessingException { if (null != event.getNewValue()) { FacesContext.getCurrentInstance(). getExternalContext().getSessionMap(). put("name", event.getNewValue()); }}

Navigation handling methods (Action methods): métodos que retornam uma String que deve casar com asregras de navegação:

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

5 de 25 16-07-2012 18:51

Page 6: jsf

JSP:

<h:commandButton value="#{bundle.Submit}" action="#{cashier.submit}" />

Backbean:

public String submit() { ... if(cart().getTotal() > 100.00 && !specialOffer.isRendered()) { specialOfferText.setRendered(true); specialOffer.setRendered(true); return null; } else if (specialOffer.isRendered() && !thankYou.isRendered()){ thankYou.setRendered(true); return null; } else { clear(); return ("receipt"); }}

Arquivo de configuração do faces:

<?xml version="1.0" encoding="ISO-8859-1"?> <!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>tabularBB</managed-bean-name> <managed-bean-class>com.groundside.jsf.backing.Tabular</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

6 de 25 16-07-2012 18:51

Page 7: jsf

<managed-bean> <managed-bean-name>neighbors</managed-bean-name> <managed-bean-class>com.groundside.jsf.Neighbors</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>

<managed-bean> <managed-bean-name>editBB</managed-bean-name> <managed-bean-class>com.groundside.jsf.backing.Edit</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

<managed-bean> <managed-bean-name>editContact</managed-bean-name> <managed-bean-class>com.groundside.jsf.Contact</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

<navigation-rule> <from-view-id>/tabular.jsp</from-view-id> <navigation-case> <from-outcome>drilldown</from-outcome> <to-view-id>/edit.jsp</to-view-id> </navigation-case> </navigation-rule>

<navigation-rule> <from-view-id>/edit.jsp</from-view-id> <navigation-case> <from-outcome>return</from-outcome> <to-view-id>/tabular.jsp</to-view-id> </navigation-case> </navigation-rule>

</faces-config>

Entendendo o ciclo de vida

O ciclo de vida do faces é parecido com o de um JSP comum, temos algumas mudanças devido asfuncionalidades extras.No final das contas, o cliente faz um pedido http e recebe uma página traduzida para o htmlO primeira informação importante é que Javaserver faces é representada por uma árvore deUIComponents, no qual chamamos de view

em todo jsp temos que ter:

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

7 de 25 16-07-2012 18:51

Page 8: jsf

// tags dos tlds

...

<f:view>

// as tags do faces e tags que não são do faces também

</f:view>

Quando um cliente faz o pedido de uma página, se da inicio ao ciclo de vidaO conjunto de componentes é criado (lado servidor) e mantido de acordo com a requisiçãoQuando o cliente submete a página, a implementação do faces vai seguir 2 de tarefas básicas aolongo do ciclo de vida:

validar as UIComponents da viewConverter as entradas nos tipos adequados em nossos backbeans

Os passos do ciclo de vida vão mudar de acordo com o cenário da requisição do usuário

Faces request: requisição de uma página com componentes do facesNon-Faces request: a requisição passa palo Servlet controlador do faces, mas não entra nociclo de vidaFaces response: resposta que envolve uma página que entra no ciclo de vida do facesNon-Faces response: Página de resposta que não envolve do ciclo de vida do faces

Estamos particularmente interessados em uma requisição e uma resposta que entre no ciclo devida do faces

Response complete

Uma página web que não está em nossa aplicação ou uma página de nossa aplicação quenão envolva JSF

Render Response Phase

Nessa fase, a implementação do Javaserver faces autoriza o jsp container a mostrar apágina JSP.Caso seja a primeira requisição da página as seguintes tarefas são executadas:

Os componentes associados a página são criados e e adicionados a view, emseguida o JSP container mostra a páginaCaso seja uma um postback (primeira submissão) os componentes são apenastraduzidos para o html e o JSP container se encarrega de mostrar a página.

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

8 de 25 16-07-2012 18:51

Page 9: jsf

Caso haja as tags message ou messages na página e tenha havido erro durante ociclo de vida, estes erros iram ser mostrados na páginaLogo depois que os componentes são traduzidos para o html, o status da view ésalva no servidor

Restore View Phase

Depois de uma submissão de um cliente (clicando em um botão ou link por exemplo)é feito, todo o estado da view é restaurado através de uma objeto chamadoFacesContext (componentes, listeners, validadores, conversores etc)Caso seja a primeira submissão, uma view vazia será criada e o ciclo de vida serádesviado para a fase render response phase

Apply Request Values Phase

O faces vai extrair todos os valores digitados pelo usuário e guardar esse valor nosseus respectivos componentesse o valor digitado não "casar" com o componente, um erro vai ser adicionado naclasse FacesContext e será mostrado na fase Render Response Phase.Os eventos são lançados para os listeners de todos os componentes

Process Validations Phase

Nessa fase Javaserver faces vai executar todos os validadores existentes na view,ele vai aplicar as regras de validação a todos os valores digitadosCaso haja algum erro, uma mensagem de erro vai ser adicionada em FacesContexte o fluxo de execução vai ser direcionado para a fase render response phaseBroadcast de todos os eventos que estão na fila

Update Model Values Phase

Se chegamos nesse ponto podemos garantir que todos os valores digitados estãocorretosO status da view será atualizado com todos os valores gravados nos componentes(Lembrando que o status da view é mantido no lado servidor)Caso ocorra algum erro de conversão entre tipos, um erro vai ser adicionado emFacesContext e o fluxo vai ser direcionado para a fase Render Response Phasebroadcast dos eventos que estão na fila

Invoke Application Phase

É nessa fase que o método de ação em seu bean vai ser executado e as regras denavegação vão ser aplicadasO fluxo de execução vai ser encerrado

Exemplo comentado:

Vamos dar uma olhada na aplicação funcionando aqui, o código fonte dessa aplicação encontra-seaqui.O primeiro passo é criar nossa página:

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<html>

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

9 de 25 16-07-2012 18:51

Page 10: jsf

<f:view><body>

<h:form><table>

<tr><td>

<h:outputText value="Login"/></td><td>

<h:inputText id="login" binding="#{cadastroBean.loginCompone<h:message for="login"/>

</td></tr><tr>

<td><h:outputText value="Senha"/>

</td><td>

<h:inputSecret id="senha" value="#{cadastroBean.senha}" requ<h:message for="senha"/>

</td></tr><tr>

<td><h:outputText value="E-mail" />

</td><td>

<h:inputText id="mail" value="#{cadastroBean.mail}" require<h:message for="mail"/>

</td></tr>

<tr><td>

<h:commandButton action="#{cadastroBean.cadastraUsuarioAction}" valu</td>

</tr></table>

</h:form><h:form id="removeUsuario">

<h:dataTable var="usuario" value="#{cadastroBean.usuariosCadastrados}" border="1"><h:column>

<f:facet name="header"><h:outputText value="Login"/>

</f:facet><h:outputText value="#{usuario.login}"></h:outputText>

<f:facet name="footer"><h:outputText value="Login"/>

</f:facet>

</h:column><h:column>

<f:facet name="header"><h:outputText value="E-mail"/>

</f:facet><h:outputText value="#{usuario.mail}"></h:outputText><f:facet name="footer">

<h:outputText value="E-mail"/></f:facet>

</h:column><h:column>

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

10 de 25 16-07-2012 18:51

Page 11: jsf

<f:facet name="header"><h:outputText value="Ação"/>

</f:facet><h:commandLink value="#{usuario.id}" actionListener="#{cadastroBean.removeUs

<h:outputText value="Excluir"></h:outputText></h:commandLink><f:facet name="footer">

<h:outputText value="Ação"/></f:facet>

</h:column></h:dataTable>

</h:form><body>

</f:view><html>

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

O arquivo tld, é onde encontramos as descrições e validações das tags que iremos usar com osprefixos bean, html e logic

<f:view>É o nodo inicial, uma espécie de saco que vai guardar todos os componentes, validadores,conversores etc

<h:form>É a declaração de um formulário comum, o detalhe é que ele é declarado aqui sem nenhuma ação,isso vai ser feito mais na frente no botão de submissão

<h:outputText value="Login"/>Tag que imprime na tela um valor fixo, como o caso acima, mas pode imprimir valores deJavaBeans ou de um arquivo de bundle por exemplo.

<h:inputText id="login" binding="#{cadastroBean.loginComponente}"required="true"/> <h:message for="login"/>

Nessa tag temos uma input comum, o detalhe é que ela está "amarrada" com um componente(HtmlInputText)que está no meu bean

As vantagens de se fazer assim é que podemos mapular o que vai ser mostrado para ousuário final dentro de nossos JavaBeans

Esconder ou mostrar outros componentesMudar estilo de fonte, campoTamanho das entrada

<h:inputSecret id="senha" value="#{cadastroBean.senha}" required="true"/><h:message for="senha"/>

Input como a explicada acima com a entrada escondida

<h:commandButton action="#{cadastroBean.cadastraUsuarioAction}"value="Enviar Dados"/>

Aqui vai acontecer a submissão do formulário, no atributo action diz que ação tomar quando o

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

11 de 25 16-07-2012 18:51

Page 12: jsf

formulário for submetido

<h:form id="removeUsuario"><h:dataTable var="usuario" value="#{cadastroBean.usuariosCadastrados}" border="1">

<h:column><f:facet name="header">

<h:outputText value="Login"/></f:facet><h:outputText value="#{usuario.login}"></h:outputText>

<f:facet name="footer"><h:outputText value="Login"/>

</f:facet>

</h:column><h:column>

<f:facet name="header"><h:outputText value="E-mail"/>

</f:facet><h:outputText value="#{usuario.mail}"></h:outputText><f:facet name="footer">

<h:outputText value="E-mail"/></f:facet>

</h:column><h:column>

<f:facet name="header"><h:outputText value="Ação"/>

</f:facet><h:commandLink value="#{usuario.id}" actionListener="#{cadastroBean.r

<h:outputText value="Excluir"></h:outputText></h:commandLink><f:facet name="footer">

<h:outputText value="Ação"/></f:facet>

</h:column></h:dataTable>

</h:form>

Uma das possíveis estruturas de repetição, cada repetição de seu conteúdo é uma linhavar=usuario, declaração de uma variávelcolumn, é cada coluna que vai ser criada na tabelafacet, com o atributo name="header" o nome que vai ser colocado no cabeçalho da coluna,name="footer" o nome que vá ser colocado com rodapé da colunaNosso usuário de negócio

package daca.bean;

public class Usuario {

private int id ;private String login="";private String senha="";private String mail="";

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

12 de 25 16-07-2012 18:51

Page 13: jsf

public int getId() {return id;

}

public void setId(int id) {this.id = id;

}

public String getLogin() {return login;

}

public void setLogin(String login) {this.login = login;

}

public String getSenha() {return senha;

}

public void setSenha(String senha) {this.senha = senha;

}

public String getMail() {return mail;

}

public void setMail(String mail) {this.mail = mail;

}

}

Classe de negócio responsável pela persistência de nosso usuário

package daca.dao;

import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import org.springframework.jdbc.datasource.DriverManagerDataSource;import daca.bean.Usuario;

/** TODO To change the template for this generated type comment go to* Window - Preferences - Java - Code Style - Code Templates*/public class GerenteBanco{

private DriverManagerDataSource dataSource;

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

13 de 25 16-07-2012 18:51

Page 14: jsf

public GerenteBanco(){}

/* (non-Javadoc) * @see daca.service.PersistenteIF#save(daca.business.Usuario) */public void save(Usuario usuario) {

try {Connection conn = dataSource.getConnection() ;PreparedStatement statement = conn.prepareStatement("insert into usuario (login,senha,mail) statement.setString(1,usuario.getLogin());statement.setString(2,usuario.getSenha());statement.setString(3,usuario.getMail());statement.execute();conn.close();

} catch (SQLException e) {e.printStackTrace();

}}

/* (non-Javadoc) * @see daca.service.PersistenteIF#remove(java.lang.String) */public void remove(String id) {

try {Connection conn = dataSource.getConnection();PreparedStatement statement = conn.prepareStatement("delete from usuario where id=?");statement.setString(1,id);statement.execute();conn.close();

} catch (SQLException e) {e.printStackTrace();

}}

/* (non-Javadoc) * @see daca.service.PersistenteIF#selectTodos() */public List selectTodos() {

Connection conn = null;List lista = new ArrayList();try {

conn = dataSource.getConnection();ResultSet rs = conn.createStatement().executeQuery("select * from usuario");while(rs.next()){

Usuario u = new Usuario();u.setId(rs.getInt(1));u.setLogin(rs.getString(2));u.setSenha(rs.getString(3));u.setMail(rs.getString(4));lista.add(u);

}conn.close();

} catch (SQLException e) {e.printStackTrace();

}return lista;

}

/** * @return Returns the dataSource. */public DriverManagerDataSource getDataSource() {

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

14 de 25 16-07-2012 18:51

Page 15: jsf

return dataSource;}

/** * @param dataSource The dataSource to set. */public void setDataSource(DriverManagerDataSource dataSource) {

this.dataSource = dataSource;}

}

Classe responsável por localizar os serviços descritos no Spring

package daca.service;

import javax.servlet.ServletContext;import org.springframework.context.ApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import daca.dao.GerenteBanco;import daca.util.DCContants;import daca.util.FacesUtils;

/** * The implementation of <code>ServiceLocator</code>. * <p> * This class is managed by the JSF managed bean facility, * and is set with application scope. * * @see ServiceLocator */public class ServiceLocator {

//the Spring application contextprivate ApplicationContext appContext;

//the cached user serviceprivate GerenteBanco persistentService;

/** * Constructor. * <p> * The following steps being done: * <ul> * <li>retrieve Spring application context from servlet context. * <li>look up <code>UserService</code> from Spring applicatino context. * </ul> */public ServiceLocator() {

ServletContext context = FacesUtils.getServletContext();this.appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);persistentService = (GerenteBanco)this.lookupService(DCContants.PERSISTENT_SERVICE_BEAN_NAME);

}

/** * Lookup service based on service bean name. * * @param serviceBeanName the service bean name * @return the service bean */public Object lookupService(String serviceBeanName) {

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

15 de 25 16-07-2012 18:51

Page 16: jsf

return appContext.getBean(serviceBeanName);}

public GerenteBanco getPersistentService() {return persistentService;

}

public void setPersistentService(GerenteBanco persistentService) {this.persistentService = persistentService;

}}

Classe utilitária para facilitar o uso da classe FacesContext

package daca.util;

import javax.faces.context.FacesContext;import javax.servlet.ServletContext;

/** * Utility class for JavaServer Faces. */public class FacesUtils {

/** * Get servlet context. * * @return the servlet context */public static ServletContext getServletContext() {

return (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();}

}

Configuração do Spring

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"

<!-- ========================= Start of PERSISTENCE DEFINITIONS ========================= -->

<!-- DataSource Definition --><bean id="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"><property name="driverClassName">

<value>com.mysql.jdbc.Driver</value></property><property name="url">

<value>jdbc:mysql:///daca</value></property><property name="username">

<value>root</value></property><property name="password">

<value></value></property>

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

16 de 25 16-07-2012 18:51

Page 17: jsf

</bean>

<!-- PErsistent Service Defintion -->

<bean id="servicoPersistencia" class="daca.dao.GerenteBanco"><property name="dataSource"><ref local="dataSource"/></property>

</bean></beans>

Arquivo de configuração do faces, na verdade esse arquivo foi quebrado em 3, em faces-config.xml(parte 1) , declaramos validadores, locale, bundle ...

<?xml version="1.0"?><!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"><faces-config>

<application>

<locale-config> <default-locale>br</default-locale> </locale-config>

<message-bundle>daca.bundle.Messages</message-bundle> </application>

</faces-config>

Em managed-bean.xml (parte 2), declaramos apenas os backbeans

<?xml version="1.0"?><!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"><faces-config>

<managed-bean> <description> Service locator of the business services </description> <managed-bean-name>serviceLocatorBean</managed-bean-name> <managed-bean-class>daca.service.ServiceLocator</managed-bean-class> <managed-bean-scope>application</managed-bean-scope> </managed-bean>

<managed-bean> <description> </description> <managed-bean-name>cadastroBean</managed-bean-name> <managed-bean-class>daca.view.CadastroBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>service</property-name> <value>#{serviceLocatorBean}</value> </managed-property>

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

17 de 25 16-07-2012 18:51

Page 18: jsf

</managed-bean>

</faces-config>

Em navegation-rules.xml (parte 3), declaramos as regras de navegação

<?xml version="1.0"?><!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"><faces-config>

<navigation-rule>

<from-view-id>*</from-view-id> <navigation-case> <description> </description> <from-outcome>sucesso</from-outcome> <to-view-id>/index.jsp</to-view-id> </navigation-case>

</navigation-rule>

<!--

<from-view-id>/algumaPagina.jsp</from-view-id> <navigation-case> <description> </description> <from-outcome>nomeLugar</from-outcome> <to-view-id>/umaPagina.jsp</to-view-id> </navigation-case>

</navigation-rule>-->

</faces-config>

Como fica o web.xml

<?xml version="1.0"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

18 de 25 16-07-2012 18:51

Page 19: jsf

<display-name>Daca</display-name>

<description> Aplicação Exemplo DACA </description>

<welcome-file-list> <welcome-file>index.jsf</welcome-file>

</welcome-file-list>

<!-- JavaServer Faces -->

<context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>server</param-value> </context-param>

<context-param>

<param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml,/WEB-INF/faces-managed-beans.xml,/WEB-INF/faces-navigation. </context-param>

<context-param> <param-name>com.sun.faces.validateXml</param-name> <param-value>true</param-value> </context-param>

<listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener>

<!-- Faces Servlet --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>

<!-- Spring Servlet--><servlet> <servlet-name>SpringContextServlet</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup></servlet>

<!-- Faces Servlet Mapping --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping>

<!-- Tomcat 4.1 can not read tld file from jar for jstl1.0 jarkata implementation. It's a workaround h<taglib>

<taglib-uri>http://java.sun.com/jstl/core</taglib-uri><taglib-location>/WEB-INF/c.tld</taglib-location>

</taglib>

</web-app>

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

19 de 25 16-07-2012 18:51

Page 20: jsf

Vamos dar uma olhada em nosso Backbean

package daca.view;

import java.lang.reflect.InvocationTargetException;import java.util.ArrayList;import java.util.List;import javax.faces.component.html.HtmlCommandLink;import javax.faces.component.html.HtmlInputText;import javax.faces.event.ActionEvent;import org.apache.commons.beanutils.BeanUtils;import daca.bean.Usuario;import daca.dao.GerenteBanco;import daca.service.ServiceLocator;import daca.util.DCContants;

public class CadastroBean {

private HtmlInputText loginComponente;private String login="";private String senha="";private String mail="";private int idParaRemocao; private ServiceLocator service;private List usuariosCadastrados = new ArrayList();

public String cadastraUsuarioAction(){setLogin((String) getLoginComponente().getValue());service.getPersistentService().save(createUsuarioBussiness());return DCContants.PAGINA_CADASTRO;

}

public void removeUsuarioAction(ActionEvent event){HtmlCommandLink link = (HtmlCommandLink) event.getSource();getService().getPersistentService().remove( ((Integer)link.getValue()).toString() );

}

/** * cria um usuario do model * @return usuario, o usuário criado com os dados do form */

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

20 de 25 16-07-2012 18:51

Page 21: jsf

public Usuario createUsuarioBussiness(){ //TODO usar uma factory, tirar os printStackTrace Usuario u = new Usuario(); try { BeanUtils.copyProperties(u, this); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } reset(); return u ; }

public void reset() { setLoginComponente(new HtmlInputText()); setMail("");

setSenha("");}

public HtmlInputText getLoginComponente() {return loginComponente;

}

public void setLoginComponente(HtmlInputText loginComponente) {this.loginComponente = loginComponente;

}

public String getLogin() {return login;

}

public void setLogin(String login) {this.login = login;

}

public String getMail() {return mail;

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

21 de 25 16-07-2012 18:51

Page 22: jsf

}

public void setMail(String mail) {this.mail = mail;

}

public String getSenha() {return senha;

}

public void setSenha(String senha) {this.senha = senha;

}

public List getUsuariosCadastrados() {usuariosCadastrados = service.getPersistentService().selectTodos();return usuariosCadastrados;

}

public void setUsuariosCadastrados(List usuariosCadastrados) {this.usuariosCadastrados = usuariosCadastrados;

}

public ServiceLocator getService() {return service;

}

public void setService(ServiceLocator service) {this.service = service;

}

}

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

22 de 25 16-07-2012 18:51

Page 23: jsf

Finalizando

Implicit objects

– applicationScope– cookie– facesContext– header– headerValues– initParam– param– paramValues– requestScope– sessionScope– tree

Chamar na página

<h:outputText id=version value="#{initParam.versionNo}"

web.xml file

<context-param><param-name>versionNo</param-name><param-value>1.05</param-name>

</context-param>

Usando validadores

<h:inputText id="userNo" value="#{UserNumberBean.userNumber}"validator="#{UserNumberBean.validate}"/>

<h:inputText id="userNo" value="#{UserNumberBean.userNumber}">

<f:validateLength maximum="6" minimum="2"/></h:inputText>

Uma forma de implementar seus validadores (criar uma classe, um tld e registrar o validador emfaces-config.xml é melhor porque você pode reusar seu validador)

Fazer uma classe Validador, basta implementar a interface validator e o método devalidaçãoImplementar o método validate() no backbean

Método validate que deve ser implementado no bean:

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

23 de 25 16-07-2012 18:51

Page 24: jsf

public void validateEmail(FacesContext context,UIInput toValidate) {String message = "";String email = (String) toValidate.getValue();if (email.indexOf('@') == -1) {

toValidate.setValid(false);message = CoffeeBreakBean.loadErrorMessage(context,CoffeeBreakBean.CB_RESOURCE_BUNDLE_NAME,"EMailError");context.addMessage(toValidate.getClientId(context),new FacesMessage(message, ""));

} else {toValidate.setValid(true);

}}

na sua página jsp chamar o método de validação:

<h:inputText id="email" value="#{checkoutFormBean.email}"size="25" maxlength="125"validator="#{checkoutFormBean.validateEmail}"/>

Conversores:

JSF tem seus alguns conversores implementados, mas é possível criar seus própriosconversores

BigDecimalConverter

BigIntegerConverter

BooleanConverter

ByteConverter

CharacterConverter

DateTimeConverter

DoubleConverter

FloatConverter

IntegerConverter

LongConverter

NumberConverter

ShortConverter

Internacionalização

Ler na página o arquivo de budle e declara uma variável para manipulá-lo

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

24 de 25 16-07-2012 18:51

Page 25: jsf

<f:loadBundlebasename="carstore.bundles.Resources" var="bundle"/>

<h:outputText value="bundle.key"/>

Finalmente:

Faces faz bem mais do que eu expliqueiConversores, Validadores, Internacionalização etc. procure se aprofundar!

Java Server Faces (JSF) http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

25 de 25 16-07-2012 18:51