Mais de um atributo no value JSF 2.0 [Resolvido]

Seguinte galera,

tenho um selectOneMenu que pode ter o valor em diferentes atributos na managed-bean.

Não sei como devo proceder, procurei na internet e não encontrei nada a respeito (talvez não procurei da forma correta).

Vou mostrar um exemplo para que fique mais facil:

Na view:

<h:selectOneMenu value="(aqui poder ser o "campoDesejado" da classe A ou da classe B)" >
<f:selectItem itemValue="0" itemLabel="Qualquer descrição" />
<f:selectItem itemValue="1" itemLabel="Qualquer descrição" />
<f:selectItem itemValue="2" itemLabel="Qualquer descrição" />
</h:selectOneMenu>

No ManagedBean:

...
private Classe A;
private Classe B;
//getters and setters omitidos
...

Nas classes:

...
private campoDesejado; //Campo desejado comum nas duas classes

//getters and setters omitidos
...

Bom galera é isso!

Fico no aguardo.

Antes de tentarmos resolver isso. Como o aplicativo definiria qual classe ou atributo escolher ? Acredito que essa abordagem precisa ser revista do ponto de vista de lógica.

Certo,

o valor do selectOneMenu determina qual classe irei utilizar para armazenar os valores.

Na verdade tenho mais campos abaixo do selectOneMenu, e conforme for o valor do selectOneMenu eu vou escolher a classe, sendo que muitas classes tem atributos iguais. (Pensei em fazer herança com os atributos iguais, mas no meu caso não posso)

Olha, porque vc não cria um único método dentro do seu manegedbean para controlar isso, ele repassa e recebe um object de seu selectOneMene. Lembre, evite criar código para execução do seu modelo dentro do seu view. Esse método resolve qual classe-instância repassar. Se essas classes tiverem corretamente sobreescrito toString() irá funcionar corretamente.

dwduncan,

teria como me dar um micro exemplo pratico disso?? (Seria tipo uma classe generica?)

Eu pensei em criar um metodo para controlar isso, só que não sei por onde começar.

[code]Certo, vamos lá:
ManagedBean:

Classe classe1;
Classe classe2;
Classe classe3;



String algumCriterio;

//getters e setters

public Object getObjetoNecessario(){

      if (algumCriterio.equals("eh isso") return getClasse1();
      else if (algumCriterio.equals("eh aquilo") return getClasse2();
      else return getClasse3();

}

public void setObjetoNecessario(Object obj){
      //codigo para setar o objeto de acordo com o criterio

}

Já no seu view:


&lt;h:selectOneMenu value="#{seuManagedBean.objetoNecessario}" &gt;   
    &lt;f:selectItem itemValue="0" itemLabel="Qualquer descrição" /&gt; 
    &lt;f:selectItem itemValue="1" itemLabel="Qualquer descrição" /&gt;
    &lt;f:setPropertyActionListener value="#{seuCriterio}" target="#{seuManagedBean.algumCriterio}" /&gt;  
&lt;/h:selectOneMenu&gt;

Isso seria um exemplo no estilo “tiro no escuro”, e, confesso que essa abordagem não é nada boa, porém, se é o vc quer, cuidado, pois é uma gambiarra isso aí !!! :slight_smile:

dwduncan,

estou envolvido no mesmo problema do redthi.

Como você mesmo disse isso é uma gambiarra.

Na sua opnião, o que eu deveria fazer, fazer assim ou criar diversos “containers” e adicionar os campos e vincular eles a classe e renderizar o “container” desejado?

xD~~

Olha, eu não sei com está o projeto de vcs. Existe o principio da coesão do objeto, ou seja, cada objeto é único e nele existem todos os métodos que são exclusivos a ele, é mais que isso, mas basicamente falando é isso. Por isso, fica confuso vc ter um objeto que possa assumir diversos valores, distintos até na classe. Dessa forma vc deveria ter um select, input, etc para cada objeto que vc deseja ajustar. Agora, se é apenas selecionar objetos instanciados da mesma classe, a conversa é outra.

Então, pra mim quanto mais simples melhor!

Pensei em fazer da Seguinte maneira:

<h:selectOneMenu value="#{bean.selectOneMenu}>
<f:selectItem itemValue="0" itemLabel="Qualquer descrição" />
<f:selectItem itemValue="1" itemLabel="Qualquer descrição" />
<f:selectItem itemValue="2" itemLabel="Qualquer descrição" />
</h:selectOneMenu>
 
//Dependendo do resultado do SelectOneMenu eu habilito ou desabilito os campos abaixo
<h:inputText value="#{bean.campo1}" rendered="#{bean.desabilita}" />
<h:inputText value="#{bean.campo2}" rendered="#{bean.desabilita}" />
<h:inputText value="#{bean.campo3}" rendered="#{bean.desabilita}" />
<h:inputText value="#{bean.campo4}" rendered="#{bean.desabilita}" />
<h:inputText value="#{bean.campo5}" rendered="#{bean.desabilita}" />

No MB:

...declarando os campos
private String campo1;
private String campo2;
private String campo3;
private String campo4;
private String campo5;
 
... no metodo que preciso executar
if(selectOneMenu.equals("0")) {
ClasseA a = new ClasseA();
a.setCampo1(campo1);
a.setCampo2(campo2);
a.setCampo3(campo3);
} else if (selectOneMenu.equals("1")) {
ClasseB b = new ClasseB();
b.setCampo4(campo4);
b.setCampo5(campo5);
} else if (selectOneMenu.equals("2")) {
ClasseC c = new ClasseC();
c.setCampo1(campo1);
c.setCampo2(campo2);
c.setCampo5(campo5);
}

Unica maneira, “mais facil” de implementar que encontrei, duro que isso é uma POG disgramada!

PS: eu tenho em torno de uns 20 campos proximos a ?campo1? e em torno de 20 classes.

cara tenta o seguinte

<h:panelGrid>
<h:panelGroup>
<h:selectOneMenu id=“cboOpcao” value="#{cliente.cboConsulta}">
<f:selectItem itemValue="" itemLabel="::Selecione::"/>
<f:selectItems value="#{cliente.listaCboConsulta}"/>
<a4j:support event=“onchange” reRender=“panelNome”/>
</h:selectOneMenu>
</h:panelGroup>
</h:panelGrid>

<h:panelGrid id=“panelNome” cellpadding=“0” cellspacing=“0” columns=“1”>
<h:panelGroup>
<h:outputText value=“Nome cliente” rendered="#{cliente.cboConsulta == 1}"/>
</h:panelGroup>
<h:panelGroup>
<h:inputText style=“margin-top:4px” value="#{cliente.cli_nome}" rendered="#{cliente.cboConsulta == 1}">
<a4j:support event=“onkeyup” reRender=“btoBuscarNome” action="#{cliente.validaCampoNome}"/>
</h:inputText>
</h:panelGroup>
</h:panelGrid>

Fizemos da forma que o @altitdb citou, foi a melhor até o momento…
valeu pela foça.
abs