jsf
-
Upload
gildel-romualdo -
Category
Documents
-
view
30 -
download
1
Transcript of 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
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
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
<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
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
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
<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
// 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
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
<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
<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
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
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
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
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
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
</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
</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
<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
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
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
}
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
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
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
<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