Boa noite.
Preciso da ajuda de vocês para redirecionar uma página.
O cenário é o seguinte:
O usuário faz um cadastro e clica em salvar, caso o cadastro não seja duplicado eu devo redirecionar o usuário para uma página de impressão.
E esse é justamente o problema, não consigo redirecionar o cadastro.
O:
FacesContext.getCurrentInstance().getExternalContext().redirect("/MatriculaOnline/pages/protected/defaultUser/defaultUserIndex.xhtml");
Como vocês sabem apaga os dados.
Tentei retornar o endereço pela String.
public String salvarAluno() {
//outros métodos ocultados
return "/innerPage/impressaoAlunoCadastro.xhtml?faces-redirect=true";
}
Procurei várias maneiras de fazer esse redirect sem perder as informações, porém falhei em todas .
Como eu posso redirecionar?
Estou usando Primefaces!
Desde já agradeço.
explica melhor:
Você não consegue redirecionar?
Você consegue redirecionar porém perde as informações?
Aconselho você a colocar o escopo do seu bean gerenciado como “view”.
[quote=paulovloghan]explica melhor:
Você não consegue redirecionar?
Você consegue redirecionar porém perde as informações?
Aconselho você a colocar o escopo do seu bean gerenciado como “view”.[/quote]
Obrigado pela resposta.
Me expressei mal.
Estou usando o viewScope e consigo redirecionar usando:
Mas a página de impressão fica em branco, pois quando é redirecionado dessa maneira o FacesContext apaga os beans.
quando eu disse “view”… estava querendo dizer “session”…
pq existe a troca de view…
se o escopo for view… o bean renova…
ow… você passar as informações como post pra próxima tela…
luksrn
Outubro 17, 2012, 8:59pm
#5
Se você está utilizando um escopo de View, o redirect irá “apagar” o estado do seu bean. Se você quer passar alguma informação para essa outra página com um redirect, aconselho você dá uma olhada no FlashScope do JSF (Isso se você estiver utilizando a versão 2)
Obrigado pelas respostas.
Consegui redirecionar usando o flashScope, mas mesmo assim o bean foi apagado.
JSFUtils.flashScope().put("alunoControle", this);
return "impressaoAlunoCadastro?faces-redirect=true";
Existe alguma outra maneira de redirecionar?
luksrn
Outubro 18, 2012, 4:59pm
#7
Como vc tá acessando esse objeto que você botou no flashScope nessa página ‘impressaoAlunoCadastro’ ?
A página que chama o método com esse buttom:
<p:commandButton update="messages" value="Confirmar a pré-matrícula deste aluno" action="#{alunoSalvarControle.verificarAluno}" icon="ui-icon-check"/>
Encurtando o classe seria algo assim:
@ManagedBean
@ViewScoped
public class AlunoSalvarControle implements Serializable {
@ManagedProperty(value = "#{alunoControle}")
private AlunoControle alunoControle;
public AlunoControle getAlunoControle() {
return alunoControle;
}
public void setAlunoControle(AlunoControle alunoControle) {
this.alunoControle = alunoControle;
}
public String verificarAluno(){
salvarAluno();
JSFUtils.flashScope().put("alunoControle", this);
return "impressaoAlunoCadastro?faces-redirect=true";
}
Que encaminha para uma página com os componentes assim:
<h:outputLabel value="Nome do Aluno: " style="font-weight:bold;" />
<h:outputLabel value="#{alunoControle.aluno.nome}" />
<h:outputLabel value="Data de Nascimento: " style="font-weight:bold;"/>
<h:outputLabel value="#{alunoControle.aluno.dtNascimento}" />
<h:outputLabel value="Nome da Mãe: " style="font-weight:bold;"/>
<h:outputLabel value="#{alunoControle.aluno.nomeMae}" />
<h:outputLabel value="Nome do Responsável: " style="font-weight:bold;"/>
<h:outputLabel value="#{alunoControle.aluno.nomeResponsavel}" />
<h:outputLabel value="Telefone: " style="font-weight:bold;"/>
<h:outputLabel value="#{alunoControle.aluno.telefone}" />
Coloquei a página de impressão no mesmo diretório da página para confirmar a matrícula.
Eu chego nela, porém ela está em branco.
Coloquei só alguns pedaços dos códigos senão iria ficar muito grande.
luksrn
Outubro 18, 2012, 5:17pm
#9
O acesso a um objeto do flash scope é um pouco diferente, tenta assim
<h:outputLabel value="#{flash.alunoControle.aluno.nome}" />
// ... ou
<h:outputLabel value="#{flash['alunoControle'].aluno.nome}" />
Funcionou, mas foi em termos.
Da maneira que vc fez não funcionou, pois ele acusava que não estava achando o atributo aluno dentro da classe AlunoSalvarControle mesmo eu fazendo a injection do alunoControle que possui a Classe ALuno.
Eu criei um atribudo nomeAluno dentro de AlunoSalvarControle e funcionou fiz assim:
salvarAluno();
nomeAluno= alunoControle.getAluno().getNomeAluno();
JSFUtils.flashScope().put("alunoSalvarControle", this);//passei a mesma classe que recebe o action e não como antes onde eu passava o alunoControle
Com isso dessa maneira funcionou:
[code]<h:outputLabel value="#{flash['impressoraGerar'].nome}" />[/code]
Você sabe o pq dessa maneira não funcionou?
exeception:
Ele só funciona com a propriedade dentro da mesma classe que recebe o form. Bom pelo menos nos testes que eu fiz…
Muito obrigado luksrn pela ajuda!