Fala galera, tudo bem?!
Realmente eu estou um tanto quanto perdido e se alguém puder me ajudar a sanar minhas dúvidas, eu ficarei muito feliz!
Seguinte: eu estou utilizando a tecnologia Facelets como forma de “templatizar” o desenvolvimento da aplicação na qual estou trabalhando. O problema é que não estou conseguindo de jeito nenhum fazer com que os dados dos inputText da interface sejam “setados” no bean correspondente! Aliás, até há pouco tempo, o botão que eu estava usando (commandButton) não estava funcionando “nem a custa de reza braba”! Eu até pensei em utilizar FacesContext como já vi no JSF in Action e também em alguns fóruns, mas eu não acredito que seja necessário utilizar FacesContext para um caso como o meu. De acordo com o Ciclo de Vida do JSF e de acordo com o estudo de tecnologias que eu fiz, eu escolhi JSF exatamente por esta “vinculação automática” entre os valores dos campos do formulário e o bean gerenciado. Mas simplesmente não estou conseguindo fazer isso funcionar. Algumas dúvidas:
-
Para fazer com que os valores do formulário sejam “submetidos” às respectivas propriedades no bean, o commandButton tem de conter type=“submit” e tem de estar dentro do <h:form> que contém os campos que quero atualizar no bean? Porque se tiver, eu só consegui fazer ele funcionar com immediate=“true”. Mas com immediate=true, se eu entendi, pula todas as fases do ciclo de vida e não atualiza nada lá no bean;
-
FacesContext só não deveria ter de ser usado quando eu quero alterar a interface dinamicamente?
-
O botão que estou usando pode estar dentro de um outro <h:form>, dentro de um outro ui:define, no caso da utilização de Facelets?
Acho que é só por enquanto! Seguem os códigos usados nesta labuta:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:c="http://java.sun.com/jstl/core">
<ui:composition template="./template2.xhtml">
<h:messages globalOnly="false" />
<ui:define name="menuAtributo">
<ul>
<li>Cadastro de Atributo</li>
</ul>
</ui:define>
<ui:define name="conteudoAtributo">
<table>
<tr>
<td bgcolor="#B8CFE5"><b>Atributo</b></td>
<td bgcolor="#EEEEEE"><b><a href="http://localhost:8080/EstudoJSF/cadastraRegra.jsf">Regra</a></b></td>
<td bgcolor="#EEEEEE"><b><a href="http://localhost:8080/EstudoJSF/cadastraAtributoSimples.jsf">Atributo Simples</a></b></td>
<td bgcolor="#EEEEEE"><b><a href="http://localhost:8080/EstudoJSF/cadastraAtributoComposto.jsf">Atributo Composto</a></b></td>
<td bgcolor="#EEEEEE"><b><a href="http://localhost:8080/EstudoJSF/cadastraIdiomas.jsf">Idiomas</a></b></td>
</tr>
</table>
<div style="overflow:auto; height:300px;">
<!-- Utilizar tabela de dados do JSF para dar aparência para a tela -->
<!-- Coloca SCROLL aqui. -->
<h:form id="umForm">
<table>
<tr>
<td>
<h:outputText value="Mnemonico Atributo"/><br/>
<h:inputText value="#{Atributo.mnemonico}" />
</td>
<td>
<h:outputText value="Aba"/><br/>
<h:inputText value="#{Atributo.aba}" />
</td>
</tr>
<tr>
<td>
<h:outputText value="Sequencial Atributo"/><br/>
<h:inputText value="#{Atributo.sequencial}">
<f:convertNumber />
</h:inputText>
</td>
<td>
<h:outputText value="Tipo Atributo"/><br/>
<h:selectOneMenu id="status" value="#{Atributo.tipoAtributo}">
<f:selectItems id="textoSelecao" value="#{Atributo.listaTiposAtributos}"/>
</h:selectOneMenu>
</td>
</tr>
<tr>
<td>
<h:outputText value="Tipo Dominio"/><br/>
<h:selectOneMenu id="status" value="#{Atributo.tipoDominio}">
<f:selectItems id="textoSelecao" value="#{Atributo.listaDominios}"/>
</h:selectOneMenu>
</td>
<td>
<h:outputText value="Atributo Compositor"/><br/>
<h:inputText value="#{Atributo.atributoCompositor}" />
</td>
</tr>
<tr>
<td>
<h:outputText value="Definido pelo Sistema"/><br/>
<h:selectOneMenu id="status" value="#{Atributo.definidoPeloSistema}">
<f:selectItems id="textoSelecao" value="#{Atributo.verdFalso}"/>
</h:selectOneMenu>
</td>
<td>
<h:outputText value="Armazenado"/><br/>
<h:selectOneMenu id="status" value="#{Atributo.armazenado}">
<f:selectItems id="textoSelecao" value="#{Atributo.verdFalso}"/>
</h:selectOneMenu>
</td>
</tr>
<tr>
<td>
<h:outputText value="Ocultar este Atributo?"/><br/>
<h:selectOneMenu id="status" value="#{Atributo.ocultar}">
<f:selectItems id="textoSelecao" value="#{Atributo.verdFalso}"/>
</h:selectOneMenu>
</td>
</tr>
</table>
</h:form>
</div>
</ui:define>
<ui:define name="botoes">
<center>
<h:form>
<h:outputText value="Uepa"/>
<h:commandButton type="submit" id="butao" value="Cadastrar Atributo" action="#{Atributo.cadastra}"/>
</h:form>
</center>
</ui:define>
</ui:composition>
</html>
Só como observação, o escopo do bean é SESSÃO, ok?!
Bean:
package beans;
import java.util.LinkedList;
import java.util.List;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
/**
* Este vai ser o bean por tras do cadastro de um atributo.
* Como o cadastro de atributo exige uma outra tela, e adequado que um bean diferente
* esteja associado a esta tela. No caso de atributos ja cadastrados,
* tais dados serao adquiridos do banco de dados e mostrados em formato de tabela
* na pagina de cadastro de entidade.
* @author vvgneto
*
*/
public class Atributo
{
private String mnemonico;
private String aba; //como que o sistema atual faz referencia pra aba?
private int sequencial;
private String tipoAtributo;
private String tipoDominio;
private boolean atributoCompositor;
private boolean definidoPeloSistema;
private boolean armazenado;
private boolean ocultar;
//boolean oculto;
private boolean editavel;
private int cardMin;
private int cardMax;
private boolean parteChave;
private boolean unico;
private String regrasValidacao;
private String regrasDerivacao;
private String atributoLigacao;
private String tipoSubject;
private String tipoObserver;
private String subject;
private int tamanho;
private int menorValor;
private int maiorValor;
private String valorDefault;
private String mascaraEdicao;
private String unidMedidaAtributo;
private String extensao;
private String aplicativo;
private String plataforma;
private String nomeClasseExecutavel;
private String dadosEnumeracao;
private String referencia;
private String atributoReferencia;
private String filtro;
private String portugues;
private String textAjudaPT;
private String espanhol;
private String textAjudaES;
private String ingles;
private String textAjudaIN;
private String frances;
private String textAjudaFR;
public Atributo(){
this.setMnemonico("ISTO");
}
public String getMnemonico() {
return mnemonico;
}
public void setMnemonico(String mnemonico) {
this.mnemonico = mnemonico;
}
public String getAba() {
return aba;
}
public void setAba(String aba) {
this.aba = aba;
}
public int getSequencial() {
return sequencial;
}
public void setSequencial(int sequencial) {
this.sequencial = sequencial;
}
public String getTipoAtributo() {
return tipoAtributo;
}
public void setTipoAtributo(String tipoAtributo) {
this.tipoAtributo = tipoAtributo;
}
public String getTipoDominio() {
return tipoDominio;
}
public void setTipoDominio(String tipoDominio) {
this.tipoDominio = tipoDominio;
}
public boolean getAtributoCompositor() {
return atributoCompositor;
}
public void setAtributoCompositor(boolean atributoCompositor)
{
this.atributoCompositor = atributoCompositor;
}
public boolean getDefinidoPeloSistema() {
return definidoPeloSistema;
}
public void setDefinidoPeloSistema(boolean definidoPeloSistema)
{
this.definidoPeloSistema = definidoPeloSistema;
}
public boolean getArmazenado()
{
return armazenado;
}
public void setArmazenado(boolean armazenado)
{
this.armazenado = armazenado;
}
public boolean getOcultar()
{
return ocultar;
}
public void setOcultar(boolean ocultar)
{
this.ocultar = ocultar;
}
public boolean getEditavel()
{
return editavel;
}
public void setEditavel(boolean editavel)
{
this.editavel = editavel;
}
public int getCardMin() {
return cardMin;
}
public void setCardMin(int cardMin) {
this.cardMin = cardMin;
}
public int getCardMax() {
return cardMax;
}
public void setCardMax(int cardMax) {
this.cardMax = cardMax;
}
public boolean getParteChave() {
return parteChave;
}
public void setParteChave(boolean parteChave)
{
this.parteChave = parteChave;
}
public boolean getUnico()
{
return unico;
}
public void setUnico(boolean unico)
{
this.unico = unico;
}
public String getRegrasValidacao() {
return regrasValidacao;
}
public void setRegrasValidacao(String regrasValidacao) {
this.regrasValidacao = regrasValidacao;
}
public String getRegrasDerivacao() {
return regrasDerivacao;
}
public void setRegrasDerivacao(String regrasDerivacao) {
this.regrasDerivacao = regrasDerivacao;
}
public String getAtributoLigacao() {
return atributoLigacao;
}
public void setAtributoLigacao(String atributoLigacao) {
this.atributoLigacao = atributoLigacao;
}
public String getTipoSubject() {
return tipoSubject;
}
public void setTipoSubject(String tipoSubject) {
this.tipoSubject = tipoSubject;
}
public String getTipoObserver() {
return tipoObserver;
}
public void setTipoObserver(String tipoObserver) {
this.tipoObserver = tipoObserver;
}
public String getSubject() {
return subject;
}
public void setSubject(String sub) {
subject = sub;
}
public int getTamanho() {
return tamanho;
}
public void setTamanho(int tamanho) {
this.tamanho = tamanho;
}
public int getMenorValor() {
return menorValor;
}
public void setMenorValor(int menorValor) {
this.menorValor = menorValor;
}
public int getMaiorValor() {
return maiorValor;
}
public void setMaiorValor(int maiorValor) {
this.maiorValor = maiorValor;
}
public String getValorDefault() {
return valorDefault;
}
public void setValorDefault(String valorDefault) {
this.valorDefault = valorDefault;
}
public String getMascaraEdicao() {
return mascaraEdicao;
}
public void setMascaraEdicao(String mascaraEdicao) {
this.mascaraEdicao = mascaraEdicao;
}
public String getUnidMedidaAtributo() {
return unidMedidaAtributo;
}
public void setUnidMedidaAtributo(String unidMedidaAtributo) {
this.unidMedidaAtributo = unidMedidaAtributo;
}
public String getExtensao() {
return extensao;
}
public void setExtensao(String extensao) {
this.extensao = extensao;
}
public String getAplicativo() {
return aplicativo;
}
public void setAplicativo(String aplicativo) {
this.aplicativo = aplicativo;
}
public String getPlataforma() {
return plataforma;
}
public void setPlataforma(String plataforma) {
this.plataforma = plataforma;
}
public String getNomeClasseExecutavel() {
return nomeClasseExecutavel;
}
public void setNomeClasseExecutavel(String nomeClasseExecutavel) {
this.nomeClasseExecutavel = nomeClasseExecutavel;
}
public String getDadosEnumeracao() {
return dadosEnumeracao;
}
public void setDadosEnumeracao(String dadosEnumeracao) {
this.dadosEnumeracao = dadosEnumeracao;
}
public String getReferencia() {
return referencia;
}
public void setReferencia(String referencia) {
this.referencia = referencia;
}
public String getAtributoReferencia() {
return atributoReferencia;
}
public void setAtributoReferencia(String atributoReferencia) {
this.atributoReferencia = atributoReferencia;
}
public String getFiltro() {
return filtro;
}
public void setFiltro(String filtro) {
this.filtro = filtro;
}
public String getPortugues() {
return portugues;
}
public void setPortugues(String portugues) {
this.portugues = portugues;
}
public String getTextAjudaPT() {
return textAjudaPT;
}
public void setTextAjudaPT(String textAjudaPT) {
this.textAjudaPT = textAjudaPT;
}
public String getEspanhol() {
return espanhol;
}
public void setEspanhol(String espanhol) {
this.espanhol = espanhol;
}
public String getTextAjudaES() {
return textAjudaES;
}
public void setTextAjudaES(String textAjudaES) {
this.textAjudaES = textAjudaES;
}
public String getIngles() {
return ingles;
}
public void setIngles(String ingles) {
this.ingles = ingles;
}
public String getTextAjudaIN() {
return textAjudaIN;
}
public void setTextAjudaIN(String textAjudaIN) {
this.textAjudaIN = textAjudaIN;
}
public String getFrances() {
return frances;
}
public void setFrances(String frances) {
this.frances = frances;
}
public String getTextAjudaFR() {
return textAjudaFR;
}
public void setTextAjudaFR(String textAjudaFR) {
this.textAjudaFR = textAjudaFR;
}
public List<SelectItem> getListaTiposAtributos()
{
LinkedList<SelectItem> lista = new LinkedList<SelectItem>();
lista.add(new SelectItem("ABA"));
lista.add(new SelectItem("BASICO"));
lista.add(new SelectItem("COMPOSTO"));
lista.add(new SelectItem("ENUMERADO"));
lista.add(new SelectItem("EXECUTAVEL"));
lista.add(new SelectItem("ID_PROPRIO"));
lista.add(new SelectItem("OBJ_EXTERNO"));
lista.add(new SelectItem("OBJ_INTERNO"));
return lista;
}
public List<SelectItem> getListaDominios()
{
LinkedList<SelectItem> lista = new LinkedList<SelectItem>();
lista.add(new SelectItem("ALFANUMERICO"));
lista.add(new SelectItem("BOOLEANO"));
lista.add(new SelectItem("COMPOSTO_AGRUPADOR"));
lista.add(new SelectItem("COMPOSTO_COMPLEXO"));
lista.add(new SelectItem("COMPOSTO_LISTA"));
lista.add(new SelectItem("COMPOSTO_SIMPLES"));
lista.add(new SelectItem("DATA"));
lista.add(new SelectItem("DECIMAL"));
lista.add(new SelectItem("INTEIRO"));
lista.add(new SelectItem("MOEDA"));
return lista;
}
public List<SelectItem> getVerdFalso()
{
LinkedList<SelectItem> lista = new LinkedList<SelectItem>();
lista.add(new SelectItem("Verdadeiro"));
lista.add(new SelectItem("Falso"));
return lista;
}
/**
* TODO Metodo cadastrar.
* Este metodo encapsula um atributo que esta sendo cadastrado.
* Logo, ele deve ter um metodo cadastrar associado para poder chamar
* a persistencia e mandar os dados para baixo.
*/
public String cadastra()
{
this.vai();
return "cadastro";
}
public void vai()
{
System.out.println("Valor de sequencial: " + this.sequencial);
System.out.println("Owa! Aqui vai levar o atributo cadastrado para baixo na pilha de camadas");
System.out.print("Alguem...");
System.out.println("Valor de ocultar este atributo: " + this.ocultar);
System.out.println("Mnemonico: " + this.getMnemonico());
}
}