Problemas de Iniciante com JSF

1 resposta
V

Olá! Estou tendo problemas com JSF! Eu estava estudando através do JSF in Action e já havia conseguido executar uma página JSF que fazia tratamento de eventos da seguinte forma: havia 5 campos e dependendo do valor que houvesse no primeiro campo (valor variando de 1 a 5), quando eu clicava no botão, o manipulador de evento colocava valores em cada um dos outros 4 campos. Estes valores eram pré-estabelecidos de acordo com o número de 1 a 5 digitado no primeiro campo (inputText).

Eu deletei este exemplo. Agora estou precisando de fazer algo semelhante a isso e não estou conseguindo de jeito nenhum. É algo simples e parece que não tem nada de errado no meu código, mas num dá certo de jeito nenhum. Estou tentando, por enquanto, apenas fazer uma impressão de uma mensagem na linha de comando quando o botão é pressionado, mas num funciona de jeeeeeito nenhum! Gostaria de saber o que estou fazendo de errado! Para tanto, aqui vai o código!

Observação: estou utilizando o padrão de layout do Core Java Server Faces 2nd. O menu é fixo, o cabeçalho também, mas o conteúdo e variável, de modo que a página do conteúdo (conteudo.jsp) não tem a tag f:view, e o Eclipse enche o saco por causa disso com aqueles sublinhados amarelos.

cadastraEntidade.jsp = utilizando esta aqui primeiro antes de usar a conteudo.jsp propriamente dita
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<h:form id="form1">

     <h:panelGrid columns="2" border="1" rules="all" title="Esta é uma demonstração de panelGrid" columnClasses="menu, conteudo">
         <f:subview id="atributo1">
            <h:outputText value="Nome do Tipo de Entidade"/>
            <h:inputText value="#{personBean.nome}" id="nome"/>
         </f:subview>
         <f:subview id="atributo2">
            <h:outputText value="Mnemônico"/>
            <h:inputText value="#{personBean.mnemonico}" id="mnemonico"/>
         </f:subview>
         <f:subview id="atributo3">
            <h:outputText value="Objeto Interno"/>
            <h:inputText value="#{personBean.oi}" id="oi"/>
         </f:subview>
        
         
         <h:commandButton value="Cadastrar" actionListener="#{personBean.geraEntidade}" />
      
           
     </h:panelGrid> 
     
     </h:form>
PersonBean.java
package beans;

import java.util.LinkedList;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.faces.component.UIParameter;

public class PersonBean {

   String nome, mnemonico, oi;
   List<String> menu, listaDominios;
 
   
   
   public PersonBean()
   {
	   System.out.println("Tá vivo!");
   }


public List<String> getMenu() 
{
	LinkedList<String> lista = new LinkedList<String>();
	lista.add("Tipo de Entidade 1");
	lista.add("Tipo de Entidade 2");
	lista.add("Tipo de Entidade 3");
	lista.add("Tipo de Entidade 4");
	
	return lista;
}

public void setMenu(List<String> menu) {
	this.menu = menu;
}



public String getNome() {
	return nome;
}


public void setNome(String nome) 
{	
	this.nome = nome;
}


public String getMnemonico() {
	return mnemonico;
}


public void setMnemonico(String mnemonico) {
	this.mnemonico = mnemonico;
}


public String getOi() {
	return oi;
}


public void setOi(String oi) {
	this.oi = oi;
}


public void geraEntidade(ActionEvent e)
{
	System.out.println("Funciona!");
	/*UIParameter component = (UIParameter) e.getComponent().findComponent("nome");
	String valor = (String) component.getValue();
	this.setNome("O nome que eu quero");
	System.out.println("Gerooooooooooooooou. Veja:");
	System.out.println("Nomea antigo: " + valor);*/
	
}


public List<String> getListaDominios() 
{
	LinkedList<String> lista = new LinkedList<String>();
	lista.add("Enumerado");
	lista.add("Biscoito");
	lista.add("Simples");
	return lista;
}


public void setListaDominios(List<String> listaDominios) {
	this.listaDominios = listaDominios;
}
  
	
 }
menu.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<f:loadBundle basename="beans.messages" var="msgs"/>
<h:dataTable value="#{personBean.menu}" var="menu">
	<h:column>
		<h:commandLink>
			<h:outputText value="#{msgs[menu]}"/>	
			<f:param name="pagina" value="#{menu}"/>
			</h:commandLink>
	</h:column>
</h:dataTable>
faces-config.xml
<?xml version="1.0"?> 
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee">

<navigation-rule>
	<navigation-case>
		<from-outcome>telaPrincipal</from-outcome>
		<to-view-id>/telaPrincipal.jsp</to-view-id>		
		
	</navigation-case>
</navigation-rule>
  
  <managed-bean>
    <managed-bean-name>personBean</managed-bean-name>
    <managed-bean-class>beans.PersonBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>   
    
   
 </managed-bean>
 
 <context-param>
 	
 </context-param> 
  

  <application>
    <resource-bundle>
      <base-name>beans.messages</base-name>
      <var>msg</var>
    </resource-bundle>
  </application>

  
  
</faces-config>
messages.properties
title=Exemplo de Aplicação JSF
textoBotao1 = Teste-me!
itemMenu1=Mensagens
itemMenu2=Usuário
itemMenu3=Pessoa Física
itemMenu4=Pessoa Jurídica
itemMenu5=Entidade

1 Resposta

V

Fala galera, tudo bem?!

Eu fui fazer uns testes e cheguei a algumas conclusões interessantes a respeito do problema que eu estava enfrentando:

Primeiro) Eu esqueci de colocar aqui o código que inclui as páginas de menu e cadastraEntidade. Colocando-a, fica um pouco mais claro o que vou dizer:

telaPrincipal.jsp

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

<f:view>
 <html>
 <head>
 	<link href="styles.css"  rel="stylesheet" type="text/css"/>
 </head>
  <body>
   <h:form>
     <h:panelGrid columns="2" border="1" rules="all" title="Esta é uma demonstração de panelGrid" width="100%" columnClasses="menu, conteudo">
         <f:facet name="header">
            <h:outputText value="Cabeçalho"/>
         </f:facet>
            <f:subview id="menu">
            	<c:import url="menu.jsp"/>
            </f:subview>           
            
                 
           	<c:import url="cadastraEntidade.jsp"/>   
            
            
     </h:panelGrid> 
    </h:form>
   </body>
 </html>
</f:view>

No livro Core Java Server Faces 2nd, alerta-se que quando utiliza-se a inclusão de conteúdo para efeito de reaproveitamento, como estou fazendo aqui, as páginas que estão sendo inseridas não podem ter a tag <f:view>. O ideal seria que as páginas incluídas fossem incluídas dentro de uma <f:subview>. No entanto, no próprio livro este último import não fica dentro de uma subview. De qualquer modo, coloquei-o dentro de uma subview para testar. Resultado: não deu certo também. Então resolvi testar isoladamente apenas a página cadastraEntidade.jsp. Resultado?! Deu certo. Aliás, deu uma exceção que vou colocar como segundo alerta. Mas enfim, o fato é que funcionou. Ah, e para fazê-la funcionar, eu envolvi o conteúdo dentro de um f:view, claro. Isso é que fez funcionar. Ou seja, a conclusão a que eu cheguei foi que quando se utiliza inclusão da forma como estou fazendo aqui, as páginas não conseguem fazer vinculação com o backing bean. O backing bean é instanciado pela aplicação, mas o fato de a página incluída não estar dentro da “visão” faz com que ações, eventos ou mesmos as propriedades dos atributos não fiquem acessíveis. Diante disso, gostaria de deixar um pedido aqui de sugestão de alguma implementação que posso utilizar para fazer reaproveitamento de código de layout (menu, cabeçalho, rodapé, e conteúdo dinâmico) e que não possua essa limitação que diagnostiquei aqui.

Segundo) A assinatura do método tratador do evento do botão era: public void tratador(ActionEvent e). Deu uma exceção dizendo que o método não havia sido encontrado. Então coloquei o caminho completo desta classe dentro da biblioteca do JSF: public void tratador(javax.faces.event.ActionEvent e) e funcionou. Antes, mesmo quando era apenas ActionEvent, eu já tinha importado lá em cima o ActionEvent deste pacote e não do AWT ou Swing, num sei (que possui uma classe com mesmo nome). Então, aparentemente eu tenho de utilizar o endereço completo para conseguir utilizar o JSF.

É possível que eu esteja com alguma biblioteca bichada ou que meu Eclipse esteja precisando de um Upgrade?! Estou usando o Europa 3.3. Tá bom, né não?!

Aguardo contribuições!

Criado 17 de abril de 2009
Ultima resposta 17 de abr. de 2009
Respostas 1
Participantes 1