Introdução a JSF Marco Antonio Agenda • • • • ManagedBean Página JSP Faces-config DataTable Lista de diretórios/arquivos • Na figura ao lado podemos conferir a lista dos arquivos no final do projeto. • Use como referência. ManagedBeans • Para cada página JSP teremos um bean (classe java com get/set) correspondentes. • Essa classe é chamada ManagedBean e deve ter um atributo para cada campo da página. – Ex: Uma página de login, com nome e senha, deve ter um managedbean com os atributos nome e senha correspondentes. LoginBean package net.sca.controle; public class LoginBean { private String nome; private String senha; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getSenha() { return senha; } public void setSenha(String senha) { this.senha = senha; } LoginBean public String validarUsuario() { if (getSenha().equals("123456")) { return "usuarioValido"; } return "usuarioInvalido"; } } faces-config.xml <?xml version="1.0" encoding="UTF-8"?> <!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>loginBean</managed-bean-name> <managed-bean-class> net.sca.controle.LoginBean </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> faces-config.xml <navigation-rule> <from-view-id>/Login.jsp</from-view-id> <navigation-case> <from-outcome>usuarioValido</from-outcome> <to-view-id>/PaginaPrincipal.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/Login.jsp</from-view-id> <navigation-case> <from-outcome>usuarioInvalido</from-outcome> <to-view-id>/UsuarioInvalido.jsp</to-view-id> </navigation-case> </navigation-rule> </faces-config> web.xml • Arquivo que define o servlet do JSF. • Deve estar dentro do WebContent/WEB-INF. web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SistemaDeControleAereo</display-name> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class> javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> Métodos de comando • Os managedbeans também têm os métodos executados em cada página. • Mais uma vez, imaginando o login, teremos um método validarUsuario. • Essa validação usa os valores dos atributos nome e senha, que foram carregados automaticamente pelo JSF. • Cada uma das ações (usuarioValido e usuarioInvalido) redireciona a aplicação para uma página diferente. Arquivo de mensagens • Crie o arquivo no diretório informado anteriormente. mensagens.properties titulo.pagina.login=Página de Login atributo.id=Código nome.fantasia=Nome Fantasia razao.social=Razão Social nome=Nome: senha=Senha: botao.login=Efetuar Login usuario.invalido=Usuário Inválido mensagem.boasvindas=Bem-Vindo ao SCA Primeira página web • Ctrl + “N” ou menu File -> new... Login.jsp • Atençao: as páginas ficam na pasta WebContent. • Essa é apenas uma definição do plugin do eclipse. Login.jsp (1ª. Parte) (1) <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> (2) <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> (3) <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> (4) <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <html> (5) <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Página de login</title> Detalhamento 1. Encoding – padrão de caracteres utilizados na página. É um padrão internacional. 2. Tipo de documento. 3. Biblioteca de tags do JSF 4. Biblioteca de tags HTML do JSF 5. Folha de estilo Login.jsp (1) <f:view> (2) <f:loadBundle basename="resources.mensagens" var="msgs" /> <body> (3) <h:form> (4) <h:panelGrid columns="2"> (5) <f:facet name="header"> (6) <h:outputText value="#{msgs['titulo.pagina.login']}" /> </f:facet> (7) <h:outputText value="#{msgs.nome}" /> (8) <h:inputText value="#{loginBean.nome}" /> (9) <h:outputText value="#{msgs.senha}" /> (10) <h:inputSecret value="#{loginBean.senha}" /> (11) <h:commandButton value="#{msgs['botao.login']}“ action="#{loginBean.validarUsuario}" /> (12) <h:commandButton type="reset" value="Limpar***" /> </h:panelGrid> </h:form> </body> </f:view> </html> Detalhamento 1. View: Início da página JSF. 2. loadBundle: Arquivo de mensagens. 3. Form: Tag de abertura do formulário. Todos os componentes devem ficar dentro dele. 4. panelGrid: Tabela com 2 colunas. 5. Facet: Cabeçalho (header) ou rodapé (footer) da tabela. 6. outputText: texto puro, recuperado da respectiva chave no arquivo de mensagens. Cont... 7. outputText: recupera o texto associado com a chave msgs.nome 8. inputText: associa essa caixa de texto com a propriedade nome do loginBean 9. outputText:... 10. inputSecret: associa essa caixa de texto (senha) com a respectiva propriedade senha no loginBean 11. commandButton: botão para acessar o sistema. Esse botão executa o método validarUsuario do loginBean. 12. Botão de reset, com um texto explícito (sem recuperar do arquivo de mensagens). Menu.jsp <a href="PaginaPrincipal.faces">Início</a> | <a href="ListaDeEmpresas.faces">Empresa Aérea</a> | <a href="">Funcionários</a> | <a href="">Aeronave</a> | <a href="">Vôo</a> Detalhamento • • Abre a página associada a PaginaPrincipal.jsp ou ListaDeEmpresas.jsp (visto depois no arquivo faces-config.xml). O JSF troca a extensão “jsp” por “faces” no browser. PaginaPrincipal.jsp <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <html> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Página Principal</title> </head> <f:view> <f:loadBundle basename="resources.mensagens" var="msgs" /> <h:form> <jsp:include page="Menu.jsp" /> <h3><h:outputText value="#{msgs['mensagem.boasvindas']}" /></h3> </h:form> </f:view> </html> UsuarioInvalido.jsp <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <html> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Erro</title> </head> <f:view> <f:loadBundle basename="resources.mensagens" var="msgs" /> UsuarioInvalido.jsp <h:form> <h:panelGrid columns="1"> <h:outputText value="#{msgs['usuario.invalido']}" /> (1) <h:commandLink action=“paginaDeLogin"> (2) <h:outputText value="Voltar" /> </h:commandLink> </h:panelGrid> </h:form> </f:view> </html> Detalhamento 1. commandLink: cria um “a href” para “paginaDeLogin”, ou seja, abre de novo a tela de login. 2. Texto do link. EmpresaAereaBean package net.sca.controle; import javax.faces.model.*; import net.sca.entidades.*; import net.sca.persistencia.*; public class EmpresaAereaBean { private DAOEmpresaAerea daoEmpresaAerea; //DAO correspondente private EmpresaAerea empresaAerea; //Objeto para a persistência private DataModel modelo; //Modelo para o DataTable public DAOEmpresaAerea getDaoEmpresaAerea() { if (daoEmpresaAerea == null) { //Inicialização tardia (lazy inicialization) daoEmpresaAerea = new DAOEmpresaAerea(); } return daoEmpresaAerea; } EmpresaAereaBean //Componente do JSF para criação de telas de consulta public DataModel getEmpresas() { modelo = new ListDataModel(getDaoEmpresaAerea().listaTodos()); return modelo; } //Objeto para persistência public EmpresaAerea getEmpresaAerea() { if (empresaAerea == null) { empresaAerea = new EmpresaAerea(); } return empresaAerea; } public void setEmpresaAerea(EmpresaAerea empresaAerea) { this.empresaAerea = empresaAerea; } EmpresaAereaBean //Utilizado na edição //Recupera o objeto selecionado na tabela public String mostraDados() { Object objetoSelecionado = modelo.getRowData(); setEmpresaAerea((EmpresaAerea) objetoSelecionado); return "editar"; } //Persistência do objeto public String gravar() { getDaoEmpresaAerea().atualizar(getEmpresaAerea()); return "paginaPrincipal"; } } DAOGenerico • Crie o método a seguir no DAOGenerico: public List<T> listaTodos() { String sql = "FROM " + getClasse().getName(); Query query = sessao.createQuery(sql); return query.list(); } – O hibernate trabalha com a classe List para coleção de objetos Lista de empresas • Para listar as empresas iremos usar o componente DataTable, recuperando os dados da coleção e mostrando direto na tabela. ListaDeEmpresas.jsp <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <html> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Lista de Empresas</title> <f:view> <f:loadBundle basename="resources.mensagens" var="msgs" /> <h:form> <jsp:include page="Menu.jsp" /> ListaDeEmpresas.jsp <h1>Lista de Empresas</h1> <h:dataTable value="#{empresaAereaBean.empresas}" var="umaEmpresa“ border="1"> <h:column> <f:facet name="header"> <h:outputText value="Código" /> </f:facet> <h:outputText value="#{umaEmpresa.id}"></h:outputText> </h:column> ListaDeEmpresas.jsp <h:column> <f:facet name="header"> <h:outputText value="Nome Fantasia" /> </f:facet> <h:outputText value="#{umaEmpresa.nomeFantasia}"></h:outputText> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Razão Social" /> </f:facet> <h:outputText value="#{umaEmpresa.razaoSocial}"></h:outputText> </h:column> </h:dataTable> </h:form> </f:view> </html> Tela de cadastro • No cadastro, o managedbean EmpresaAereaBean associa os valores das caixas de texto com as propriedades do atributo EmpresaAerea. • O id deve ficar guardado em um campo hidden. • Quando o usuário pressionar o botão Gravar, será executado o método “gravar” no MB. CadastroDeEmpresa.jsp <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <html> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Cadastro de Empresa</title> </head> <f:view> <f:loadBundle basename="resources.mensagens" var="msgs" /> <h:form> <jsp:include page="Menu.jsp" /> CadastroDeEmpresa.jsp <h1>Dados da Empresa</h1> <h:inputHidden value="#{empresaAereaBean.empresaAerea.id}" /> <h:panelGrid columns="2" border="1"> <h:outputText value="#{msgs['atributo.id']}" /> <h:outputText value="#{empresaAereaBean.empresaAerea.id}" /> <h:outputText value="#{msgs['nome.fantasia']}" /> <h:inputText value="#{empresaAereaBean.empresaAerea.nomeFantasia}“ size="50" /> <h:outputText value="#{msgs['razao.social']}" /> <h:inputText value="#{empresaAereaBean.empresaAerea.razaoSocial}“ size="50" /> <h:commandButton action="#{empresaAereaBean.gravar}" value="Gravar" /> <h:commandButton type="reset" value="Reset" /> </h:panelGrid> </h:form> </f:view> </html> faces-config.xml • É o momento de acrescentar os novos MB’s e regras de navegação no arquivo de configuração. Registro do bean <managed-bean> <managed-bean-name>empresaAereaBean</managed-bean-name> <managed-bean-class> net.sca.controle.EmpresaAereaBean </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> Regras de navegação <navigation-rule> <from-view-id>/ListaDeEmpresas.jsp</from-view-id> <navigation-case> <from-outcome>editar</from-outcome> <to-view-id>/CadastroDeEmpresa.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <navigation-case> <from-outcome>paginaPrincipal</from-outcome> <to-view-id>/PaginaPrincipal.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <navigation-case> <from-outcome>paginaDeLogin</from-outcome> <to-view-id>/Login.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <navigation-case> <to-view-id>/ListaDeEmpresas.jsp</to-view-id> </navigation-case> </navigation-rule> Próximos passos • Como desafio, implemente a inclusão e exclusão.