Button jsf

opa :smiley:

Uso a mesma página para exibir um botão mas dependendo de onde vier a requisição, preciso setar o label e a action diferente…tem alguma maneira de fazer isso usando o mesmo botão sem a necessidade de criar outro?

[]'s

Dá um binding no button e utilize os métodos disponíveis.

Mas procure outra solução.

mas ai eu vou precisar criar um campo do tipo Hidden pra passar algum valor e isso eu não qro fazer

conhece outra solução?

Você não pode criar dois botões mesmo e usar o atributo rendered para decidir qual botão exibir?

Discordo, dependendo não é necessário.

Explica um pouco melhor o problema, pode ser q eu esteje viajando tbm.

Eu pensei nos 2 botões mas não cheguei a uma lógica razoável … pq o cenário é o seguinte:

pagina X com o botão OK

se X for acessado através da A, a função do OK deve ser L e se X for acessado do B, a função e o label do botão muda pra C

entende?

Ah e vcs sabem como que eu posso acessar um método de outra classe sem precisar dar New() nele?

Faça um binding e altere o destino da action em tempo de execução, como o colega ja falou.

Porque fazer com que o mesmo botão tenha duas ações diferentes se você pode criar dois botões com o atributo rendered?

Eu imaginaria assim, um managedBean no escopo session acessado por essas três páginas teria os métodos acaoA() e acaoB(), assim:

enum Acao {SEM_ACAO, A, B};
Acao acaoAtual;

public String acaoA() {
    acaoAtual = Acao.A;
    return "sucesso";
}

public String acaoB() {
    acaoAtual = Acao.B;
    return "sucesso";
}

Quando o botão da página A é acionado, sua ação é acaoA(), e quando o botão da página B é acionado, sua ação é acaoB(). Imaginemos que existe uma regra em faces-config.xml que diz que quando o retorno é “sucesso”, a página resultado é X.

Em X, eu teria dois botões:

<h:commandButton label="OK" action="#{mb.l}" rendered="#{mb.veioDeA}"/>
<h:commandButton label="C" action="#{mb.c}" rendered="#{mb.veioDeB}"/>

Mas só um dos botões seria exibido, pois no managedBean, além dos métodos acima eu teria:

public boolean isVeioDeA() {
    return currAction == Action.A;
}

public boolean isVeioDeB() {
    return currAction == Action.B;
}

Fazendo com que só um dos botões fosse exibido
Certo?