2011-04-13 4 views
8

Actualmente estoy intentando enviar el ID de un registro de una página a otra.Cómo ejecutar una acción en la solicitud GET con f: viewParam?

Así, en la página 1, tengo algo como esto:

<p:column> 
    <h:link value="#{rpb.map['transNum']}" outcome="TInput.xhtml"> 
     <f:param name="id" value="#{rpb.map['id']}" /> 
    </h:link> 
</p:column> 

y en la página de destino (TInput.xhtml), tengo algo como esto para capturar el ID:

.... 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 

<f:metadata> 
    <f:viewParam name="id" value="#{tInputBean.id}"></f:viewParam> 
</f:metadata> 

<h:head> 
.... 

Ahora, al hacer clic en el enlace, se pasa a la página 2, y la página 2 se maneja con un jsf bean con vista. Y desde mi depuración, este es el orden de happenning:

  1. se ejecuta el método @PostConstruct
  2. el modelo se actualiza con el id capturado de la viewParam (después de la solicitud de validación de Appy +)

Lo que me gustaría lograr es que: después de que se actualice el modelo, me gustaría ejecutar una consulta para esa identificación de registro, obtener su frijol y su lista de detalles de Servicio comercial.

Me pregunto dónde debo podía poner mi código de consulta:

  1. dentro @PostConstruct método no es posible, ya que la identificación capturado de la viewParam se establece en el modelo después los acabados método @PostConstruct
  2. ¿utiliza un detector de fase después de la actualización del modelo?
  3. ¿utilizar un evento del sistema? aunque me parece que no puede encontrar el más apropiado para este caso

favor ilumíneme :)

Respuesta

8

Añadir un <f:event type="preRenderView"> a la <f:metadata>.

<f:metadata> 
    <f:viewParam name="id" value="#{tInputBean.id}" /> 
    <f:event type="preRenderView" listener="#{tInputBean.init}" /> 
</f:metadata> 

con un

public void init(ComponentSystemEvent event) throws AbortProcessingException { 
    // ... 
} 

(por cierto, al contrario que en la documentación, el argumento y la excepción son opcionales, por lo menos en todas las versiones 2.x Mojarra que he tenido usados)

+0

@BalusC: ¡Muchas gracias! Solo sé que hoy podemos poner la etiqueta del evento dentro de los metadatos f: Entonces, básicamente, independientemente de si estoy usando GET o POST, siempre puedo usar el evento f: dentro de f: metadatos para llamar a los métodos de acuerdo con el tipo de evento, ¿estoy en lo correcto? – bertie

+0

De nada. Sí, es independientemente del método. Sin embargo, dicha página con 'f: metadata' debería usarse preferiblemente solo para solicitudes GET. – BalusC

+0

@BalusC: ¡Hola otra vez! Me pregunto, si f: los metadatos se usan preferiblemente solo para el método GET, ¿cuál es el enfoque recomendado para poder ejecutar un método en un evento de pre representación con un método POST? – bertie

4

Utilicé la solución BalusC. Gracias;)

sólo quiero añadir que, si se utiliza facelet, hay que poner:

<f:metadata> 

en cada página utilizando la plantilla:

mytemplate.xhtml:

<html 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"> 

<ui:insert name="meta"/> 

mypage.xhtml usando mytemplate.XHTML:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

<ui:composition template="mytemplate"> 

<ui:define name="meta"> 
    <f:metadata> 
     <f:viewParam name="id" value="#{tInputBean.id}" /> 
     <f:event type="preRenderView" listener="#{tInputBean.init}" /> 
    </f:metadata> 
    </ui:define> 
... 

Solución encontrado en: https://forums.oracle.com/forums/thread.jspa?threadID=2145709

Cuestiones relacionadas