Você está na página 1de 25

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

Java Server Faces (JSF)


O que JSF ? Mais que um framework para desenvolver aplicaes web de forma gil, JSF foi incorporado ao especificao J2EE. Quais os "mdulos" que compem o JSF? Componentes Eventos Valiao e converses Navegabilidade Backbeans Diviso de papis com JSF ? Web-Design: Quem cria a "cara" da aplicao, em nosso caso usando HTML Desenvolvedores de aplicao: Quem responsvel por programar objetos, validadores, classes de suporte etc Desenvovedores de componentes: Normalmente, o cara que tem uma boa experincia em programar interface com o usurio e prefere criar UIComponents customizados. Arquitetos de aplicao: O responsvel por planejar a aplicao se preocupando com: Escalabilidade, comunicao entre os mdulos, Persistncia, Transao etc. (Nosso conhecido plano arquitetural). Fornecedores de ferramentas: So 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 definio de papis muito comum a acumulao de papis e at mesmo a diviso de um papel. O que JSF trs de bom? MVC para aplicaes web "fcil" de usar componentes extensveis Boa demanda do mecado e conseqentemente dos desenvolvedores Cdigo aberto O que temos de diferente com JSF ? Se tornou um padro Uso de componentes (cuidado, no confundir com componentes de negcio) Conceito de evento para os componentes (temos um conceito muito parecido com os componentes swing) Gerencia estados dos componentes

1 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

Curiosidade Struts e JSF podem ser usados juntos em um mesmo projeto. At mesmo em uma mesma pgina Dentro at mesmo de um mesmo formulrio (isso fede, mas possvel)

Como a especificao do JSF se ajusta

O que tenho que saber para comear a discutir e implementar aplicaes usando o faces ? Criar pginas usando UIComponents e as core tags do faces. definir regras de navegao no arquivo de configurao do faces. Desenvolver backbeans Adicionar esses backbeans no arquivo de configurao do faces

UIComponents e core tags So classes que representam os componentes de interface. Particularidades: Todo componente extensvel Implementa as seguintes intefaces: ActionSource: diz que componentes podem disparar eventos de ao ValueHolder:Diz que o componente mantm um valor local para acessar o seu modelo com converso de tipos. StateHolder: salva os estados dos objetos entre os requests. NamingContainer: diz que cada componente deve conter um id nico EditableValueHolder: especfica para componentes editveis, herda de StateHolder e adiciona suporte validao e a emisso de value-change events Diagrama de classes

2 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

Regras de navegao: o mecanismo que permite unir algum tipo de processamento com seqncia de pginas a serem mostradas. Quando um boto ao um link clicado, o componente associado gera um ActionEvent que lanado para os seus listeners. O receptor desse evento o que chamamos de Backbean (Bean comum), um action method nessa classe vai ser executada e o resultado disso vai ser uma String que deve se encaixar na regra de navegao.

<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>

3 de 25

16-07-2012 18:51

Java Server Faces (JSF)


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

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

BackBean: So classes simples, no herdo de ningum nem so obrigados a implementar nenhuma interface Possuem nossos famosos getter e setters seguindo a conveno JavaBean Possuem os mtodos relacionados Validation methods: mtodos de validao :)
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: mtodos que recebem um ActionEvent e so void (no procuram nenhuma regra de negao, voltam para a mesma pgina). Apenas os componentes que implementam ActionSource podem usar esse mtodo. UICommand e UIButton
JSP:

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

4 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/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): mtodos que retornam uma String que deve casar com as regras de navegao:

5 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/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 configurao 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>

6 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/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 mudanas devido as funcionalidades extras. No final das contas, o cliente faz um pedido http e recebe uma pgina traduzida para o html O primeira informao importante que Javaserver faces representada por uma rvore de UIComponents, no qual chamamos de view
em todo jsp temos que ter:

7 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

// tags dos tlds

...

<f:view> // as tags do faces e tags que no so do faces tambm </f:view>

Quando um cliente faz o pedido de uma pgina, se da inicio ao ciclo de vida O conjunto de componentes criado (lado servidor) e mantido de acordo com a requisio Quando o cliente submete a pgina, a implementao do faces vai seguir 2 de tarefas bsicas ao longo do ciclo de vida: validar as UIComponents da view Converter as entradas nos tipos adequados em nossos backbeans Os passos do ciclo de vida vo mudar de acordo com o cenrio da requisio do usurio Faces request: requisio de uma pgina com componentes do faces Non-Faces request: a requisio passa palo Servlet controlador do faces, mas no entra no ciclo de vida Faces response: resposta que envolve uma pgina que entra no ciclo de vida do faces Non-Faces response: Pgina de resposta que no envolve do ciclo de vida do faces Estamos particularmente interessados em uma requisio e uma resposta que entre no ciclo de vida do faces

Response complete Uma pgina web que no est em nossa aplicao ou uma pgina de nossa aplicao que no envolva JSF Render Response Phase Nessa fase, a implementao do Javaserver faces autoriza o jsp container a mostrar a pgina JSP. Caso seja a primeira requisio da pgina as seguintes tarefas so executadas: Os componentes associados a pgina so criados e e adicionados a view, em seguida o JSP container mostra a pgina Caso seja uma um postback (primeira submisso) os componentes so apenas traduzidos para o html e o JSP container se encarrega de mostrar a pgina.

8 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

Caso haja as tags message ou messages na pgina e tenha havido erro durante o ciclo de vida, estes erros iram ser mostrados na pgina Logo depois que os componentes so traduzidos para o html, o status da view salva no servidor Restore View Phase Depois de uma submisso de um cliente (clicando em um boto ou link por exemplo) feito, todo o estado da view restaurado atravs de uma objeto chamado FacesContext (componentes, listeners, validadores, conversores etc) Caso seja a primeira submisso, 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 usurio e guardar esse valor nos seus respectivos componentes se o valor digitado no "casar" com o componente, um erro vai ser adicionado na classe FacesContext e ser mostrado na fase Render Response Phase. Os eventos so lanados 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 validao a todos os valores digitados Caso haja algum erro, uma mensagem de erro vai ser adicionada em FacesContext e o fluxo de execuo vai ser direcionado para a fase render response phase Broadcast de todos os eventos que esto na fila Update Model Values Phase Se chegamos nesse ponto podemos garantir que todos os valores digitados esto corretos O 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 converso entre tipos, um erro vai ser adicionado em FacesContext e o fluxo vai ser direcionado para a fase Render Response Phase broadcast dos eventos que esto na fila Invoke Application Phase nessa fase que o mtodo de ao em seu bean vai ser executado e as regras de navegao vo ser aplicadas O fluxo de execuo vai ser encerrado

Exemplo comentado:

Vamos dar uma olhada na aplicao funcionando aqui, o cdigo fonte dessa aplicao encontra-se aqui. O primeiro passo criar nossa pgina:

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

<html>

9 de 25

16-07-2012 18:51

Java Server Faces (JSF)


<f:view> <body> <h:form> <table> <tr>

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

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

<h:inputText id="login" binding="#{cadastroBean.lo <h:message for="login"/> </td> </tr> <tr> <td> <h:outputText value="Senha"/> </td> <td>

<h:inputSecret id="senha" value="#{cadastroBean.se <h:message for="senha"/> </td> </tr> <tr> <td> <h:outputText value="E-mail" /> </td> <td>

<h:inputText id="mail" value="#{cadastroBean.mail <h:message for="mail"/> </td> </tr> <tr> <td> </td> </tr> </table>

<h:commandButton action="#{cadastroBean.cadastraUsuarioAct

</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>

10 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

<f:facet name="header"> <h:outputText value="Ao"/> </f:facet> <h:commandLink value="#{usuario.id}" actionListener="#{cadastroBea <h:outputText value="Excluir"></h:outputText> </h:commandLink> <f:facet name="footer"> <h:outputText value="Ao"/> </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 descries e validaes das tags que iremos usar com os prefixos bean, html e logic <f:view> o nodo inicial, uma espcie de saco que vai guardar todos os componentes, validadores, conversores etc <h:form> a declarao de um formulrio comum, o detalhe que ele declarado aqui sem nenhuma ao, isso vai ser feito mais na frente no boto de submisso <h:outputText value="Login"/> Tag que imprime na tela um valor fixo, como o caso acima, mas pode imprimir valores de JavaBeans 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 o usurio final dentro de nossos JavaBeans Esconder ou mostrar outros componentes Mudar estilo de fonte, campo Tamanho 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 submisso do formulrio, no atributo action diz que ao tomar quando o

11 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

formulrio for submetido

<h:form id="removeUsuario"> <h:dataTable var="usuario" value="#{cadastroBean.usuariosCadastrados}" bord <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="Ao"/> </f:facet> <h:commandLink value="#{usuario.id}" actionListener="#{cada <h:outputText value="Excluir"></h:outputText> </h:commandLink> <f:facet name="footer"> <h:outputText value="Ao"/> </f:facet> </h:column> </h:dataTable> </h:form>

Uma das possveis estruturas de repetio, cada repetio de seu contedo uma linha var=usuario, declarao de uma varivel column, cada coluna que vai ser criada na tabela facet, com o atributo name="header" o nome que vai ser colocado no cabealho da coluna, name="footer" o nome que v ser colocado com rodap da coluna Nosso usurio de negcio

package daca.bean; public class Usuario { private private private private int id String String String ; login=""; senha=""; mail="";

12 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/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 negcio responsvel pela persistncia de nosso usurio


package daca.dao; import import import import import import import import java.sql.Connection; java.sql.PreparedStatement; java.sql.ResultSet; java.sql.SQLException; java.util.ArrayList; java.util.List; org.springframework.jdbc.datasource.DriverManagerDataSource; 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;

13 de 25

16-07-2012 18:51

Java Server Faces (JSF)


public GerenteBanco(){ }

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

/* (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,se 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() {

14 de 25

16-07-2012 18:51

Java Server Faces (JSF)


return dataSource; }

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

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

Classe responsvel por localizar os servios descritos no Spring


package daca.service; import import import import import import javax.servlet.ServletContext; org.springframework.context.ApplicationContext; org.springframework.web.context.support.WebApplicationContextUtils; daca.dao.GerenteBanco; daca.util.DCContants; 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 context private ApplicationContext appContext; //the cached user service private 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_NA } /** * Lookup service based on service bean name. * * @param serviceBeanName the service bean name * @return the service bean */ public Object lookupService(String serviceBeanName) {

15 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...
return appContext.getBean(serviceBeanName);

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

Classe utilitria 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() } }

Configurao 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>

16 de 25

16-07-2012 18:51

Java Server Faces (JSF)


</bean> <!-PErsistent Service Defintion -->

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

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

Arquivo de configurao 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>

17 de 25

16-07-2012 18:51

Java Server Faces (JSF)


</managed-bean>

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

</faces-config>

Em navegation-rules.xml (parte 3), declaramos as regras de navegao


<?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>

18 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

<display-name>Daca</display-name> <description> Aplicao 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 workarou <taglib> <taglib-uri>http://java.sun.com/jstl/core</taglib-uri> <taglib-location>/WEB-INF/c.tld</taglib-location> </taglib> </web-app>

19 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

Vamos dar uma olhada em nosso Backbean

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

public class CadastroBean {

private private private private private private private

HtmlInputText loginComponente; String login=""; String senha=""; String mail=""; int idParaRemocao; ServiceLocator service; 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 usurio criado com os dados do form */

20 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/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;

21 de 25

16-07-2012 18:51

Java Server Faces (JSF)


}

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/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; }

22 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

Finalizando

Implicit objects applicationScope cookie facesContext header headerValues initParam param paramValues requestScope sessionScope tree
Chamar na pgina <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 em faces-config.xml melhor porque voc pode reusar seu validador) Fazer uma classe Validador, basta implementar a interface validator e o mtodo de validao Implementar o mtodo validate() no backbean
Mtodo validate que deve ser implementado no bean:

23 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/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 pgina jsp chamar o mtodo de validao:

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

Conversores: JSF tem seus alguns conversores implementados, mas possvel criar seus prprios conversores BigDecimalConverter BigIntegerConverter BooleanConverter ByteConverter CharacterConverter DateTimeConverter DoubleConverter FloatConverter IntegerConverter LongConverter NumberConverter ShortConverter Internacionalizao Ler na pgina o arquivo de budle e declara uma varivel para manipul-lo

24 de 25

16-07-2012 18:51

Java Server Faces (JSF)

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jsf...

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

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

Finalmente: Faces faz bem mais do que eu expliquei Conversores, Validadores, Internacionalizao etc. procure se aprofundar!

25 de 25

16-07-2012 18:51

Você também pode gostar