Olá a todos, estou aprendendo JSF porém me deparei com a seguinte situação:
a) tenho dois
b) um
O código dos Beans segue abaixo:
Genero.javapackage com.anjho.pojo;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.validation.constraints.Min;
import javax.validation.constraints.Size;
@ManagedBean(name = "generoBean")
@ViewScoped
public class Genero implements Serializable {
private static final long serialVersionUID = 1L;
@Size(min = 2, message="O gênero especificado deve conter ao menos dois caracteres!")
private String genero;
@Min(value = 0, message="O código deve ser positivo!")
private int gecode;
public int getGecode() {
return gecode;
}
public void setGecode(int gecode) {
this.gecode = gecode;
}
public Genero() {
}
public Genero(int gecode, String genero) {
this.gecode = gecode;
this.genero = genero;
}
public String getGenero() {
return genero;
}
public void setGenero(String genero) {
this.genero = genero;
}
}
package com.anjho.data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import com.anjho.pojo.Genero;
@ManagedBean(name = "listaGeneroBean")
@ViewScoped
public class ListaGeneroBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<Genero> generoList = null;
private Genero editedGenero;
private int currentGeneroIndex;
private int codeGenero;
private String nomeGenero;
public int getCodeGenero() {
return codeGenero;
}
public void setCodeGenero(int codeGenero) {
this.codeGenero = codeGenero;
}
public String getNomeGenero() {
return nomeGenero;
}
public void setNomeGenero(String nomeGenero) {
this.nomeGenero = nomeGenero;
}
public List<Genero> getGeneroList() {
synchronized (this) {
if (this.generoList == null) {
this.generoList = new ArrayList<Genero>();
generoList.add(new Genero(0, "Teste1"));
generoList.add(new Genero(1, "Teste2"));
generoList.add(new Genero(2, "Teste3"));
}
return generoList;
}
}
public void setGeneroList(List<Genero> generoList) {
this.generoList = generoList;
}
public Genero getEditedGenero() {
return editedGenero;
}
public void setEditedGenero(Genero editedGenero) {
this.editedGenero = editedGenero;
}
public int getCurrentGeneroIndex() {
return currentGeneroIndex;
}
public void setCurrentGeneroIndex(int currentGeneroIndex) {
this.currentGeneroIndex = currentGeneroIndex;
}
public void onApagarClick() {
generoList.remove(generoList.get(currentGeneroIndex));
}
public void onSalvarClick() {
generoList.set(currentGeneroIndex, editedGenero);
}
public void onCadastrarClick() {
generoList.add(new Genero(codeGenero, nomeGenero));
}
}
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<h:outputStylesheet>
a.no-decor>img {
border: none;
}
</h:outputStylesheet>
<a4j:status onstart="#{rich:component('statPane')}.show()"
onstop="#{rich:component('statPane')}.hide()" />
<f:view>
<h:head></h:head>
<h:body>
<rich:panel header="Cadastro de gêneros de exemplares">
<h:form>
<rich:panel style="border-width:0;">
<h:panelGrid columns="3">
<h:outputLabel id="lblGenero" value="Gênero: " />
<h:inputText id="txtGenero" value="#{generoBean.genero}">
<rich:validator event="keyup" />
</h:inputText>
<rich:message for="txtGenero" />
<h:outputLabel id="lblCodigo" value="Código: " />
<h:inputText id="txtCodigo" value="#{generoBean.gecode}">
<rich:validator event="keyup" />
</h:inputText>
<rich:message for="txtCodigo" />
<h:outputText value=" " />
<a4j:commandButton id="btnCadastrar" value="Cadastrar"
action="#{listaGeneroBean.onCadastrarClick}"
execute="@this" render="tblGeneros">
<a4j:param value="#{generoBean.genero}"
assignTo="#{listaGeneroBean.nomeGenero}" />
<a4j:param value="#{generoBean.gecode}"
assignTo="#{listaGeneroBean.codeGenero}" />
<f:setPropertyActionListener
target="#{listaGeneroBean.editedGenero}" value="#{generoBean}" />
</a4j:commandButton>
</h:panelGrid>
</rich:panel>
<rich:panel header="Gêneros cadastrados:">
<rich:extendedDataTable value="#{listaGeneroBean.generoList}"
var="gen" id="tblGeneros" iterationStatusVar="it" width="100%">
<rich:column>
<f:facet name="header">
<h:outputText value="CÓDIGO" />
</f:facet>
<h:outputText value="#{gen.gecode}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="GÊNERO" />
</f:facet>
<h:outputText value="#{gen.genero}" />
</rich:column>
<rich:column>
<a4j:commandLink styleClass="no-decor" execute="@this"
render="@none"
oncomplete="#{rich:component('confirmPane')}.show()">
<h:graphicImage value="/images/icons/delete.gif" alt="delete" />
<a4j:param value="#{it.index}"
assignTo="#{listaGeneroBean.currentGeneroIndex}" />
</a4j:commandLink>
<a4j:commandLink styleClass="no-decor" render="editGrid"
execute="@this"
oncomplete="#{rich:component('editPane')}.show()">
<h:graphicImage value="/images/icons/edit.gif" alt="edit" />
<a4j:param value="#{it.index}"
assignTo="#{listaGeneroBean.currentGeneroIndex}" />
<f:setPropertyActionListener
target="#{listaGeneroBean.editedGenero}" value="#{gen}" />
</a4j:commandLink>
</rich:column>
</rich:extendedDataTable>
</rich:panel>
<a4j:jsFunction name="remove" action="#{listaGeneroBean.onApagarClick}"
render="tblGeneros" execute="@this"
oncomplete="#{rich:component('confirmPane')}.hide();" />
<rich:popupPanel id="statPane" autosized="true">
<h:graphicImage value="/images/ai.gif" alt="ai" />
Aguarde...
</rich:popupPanel>
<rich:popupPanel id="confirmPane" autosized="true">
Tem certeza que deseja apagar este gênero?
<a4j:commandButton value="Cancelar"
onclick="#{rich:component('confirmPane')}.hide(); return false;" />
<a4j:commandButton value="Apagar"
onclick="remove(); return false;" />
</rich:popupPanel>
<rich:popupPanel header="Detalhes do gênero a ser editado:"
id="editPane" domElementAttachment="parent" autosized="true">
<h:outputText value="gênero: " />
<h:inputText value="#{listaGeneroBean.editedGenero.genero}" />
<a4j:commandButton value="Salvar"
action="#{listaGeneroBean.onSalvarClick}" render="tblGeneros"
execute="editPane"
oncomplete="if (#{facesContext.maximumSeverity==null}) {#{rich:component('editPane')}.hide();}" />
<a4j:commandButton value="Cancelar"
onclick="#{rich:component('editPane')}.hide(); return false;" />
</rich:popupPanel>
</h:form>
</rich:panel>
</h:body>
</f:view>
</ui:composition>
Não consigo entender por qual motivo o botão "Cadastrar" não está passando os parâmetros para o bean. No degug, os parâmetros os quais estou utilizando aparecem 0 para o int e vazio para a String, como se o bean não capturasse os parâmetros que estou passando.
Alguém pode me ajudar?
Desde já agradeço.