O RequestScope do JSF tem apenas a duração de uma solicitação HTTP ou seja na troca páginas ou execuções na mesma página o managed bean anotado com @requestScope perderá os valores em seus atributos.
Uma das maneiras de solucionar esse problema é utilizar a anotação @ManagedProperty para injetar o atributo enviado por f:param através de outra requisição.
Segue abaixo um 2 exemplos onde vão mostrar como enviar um valor de uma página para outra utilizando ResquestScope.
1 – Enviando um valor fixo no xhtml :
RequestController.java
import java.io.Serializable; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.RequestScoped; @RequestScoped @ManagedBean(name = "requestController" ) public class RequestController implements Serializable { private static final long serialVersionUID = 1L; @ManagedProperty("#{param.parametro}") private String parametro; // gets and sets
Observação :
O @ManagedProperty é composto por “param” que é o map de parametro request do JSF (FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()) + o nome do atributo enviado no xhtml (f:param name=””).
O @ManagedProperty é composto por “param” que é o map de parametro request do JSF (FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()) + o nome do atributo enviado no xhtml (f:param name=””).
enviar-parametro.xhtml
<h:form> <h:commandButton value="Enviar" action="/pages/ver-parametro"> <f:param name="parametro" value="10"/> </h:commandButton> </form>
ver-parametro.xhtml
<h:form> <h:inputText value="#{requestController.parametro}" /> </form>
2 – Enviando um valor vindo de um inputText da página:
RequestController.java
import java.io.Serializable; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.RequestScoped; @RequestScoped @ManagedBean(name = "requestController" ) public class RequestController implements Serializable { private static final long serialVersionUID = 1L; @ManagedProperty("#{param.parametro}") private String parametro; public String setWithRedirect() { return "/pages/ver-parametro?parametro=" +this.parametro+"?faces-redirect=true"; } // gets and sets
enviar-parametro.xhtml
<h:form> <h:outputText value="Valor do parametro: " /> <h:inputText value="#{requestController.parametro}" /> <h:commandButton value="Enviar" action="#{requestController.redirecionar"/> </form>
ver-parametro.xhtml
<h:form> <h:inputText value="#{requestController.parametro}" disabled="true" /> </form>
Observação :
- f:param envia os valores por GET
- f:param por enviar paramos por GET não pode ser enviado objetos apenas tipos primitivos