tipo referencia por pasar pasaje parametros parametro objetos metodos como clase jsf request parameter-passing el managed-bean

jsf - referencia - pasar tipo como parametro c#



Pasar la variable de ámbito de solicitud pasada como parámetro de método de acción EL no funciona (1)

Estoy usando JSF 2.2 en Glassfish 4.1.

Estoy tratando de pasar un parámetro de consulta como un argumento de método de acción de la siguiente manera:

// Example 1. This does not work. // at url http://localhost:8080/app/[email protected] <p:commandButton value="Place order" action="#{orderManager.placeOrder(param[''email''])}" />

(Sepa que param es un objeto EL implícito ).

En el registro del servidor lo he configurado para imprimir el parámetro del método, pero puedo ver que se pasó una cadena vacía, no "[email protected]" como esperaba.

He confirmado que mi configuración general está funcionando. Si reemplazo el fragmento de arriba con lo siguiente, se muestra "[email protected]" en el registro del servidor:

// Example 2. This works. <p:commandButton value="Place order" action="#{orderManager.placeOrder(''[email protected]'')}" />

También he confirmado que mi uso de objetos implícitos EL es factible. El siguiente fragmento funciona si recupero el parámetro de FacesContext (después de eliminar el parámetro de correo electrónico de la placeOrder de placeOrder , por supuesto):

// Example 3. This works. <p:commandButton value="Place order" action="#{orderManager.placeOrder()}" > <f:param name="email" value="#{param[''email'']}"/> </p:commandButton>

Y aquí hay un misterio final, uno que realmente me confunde, si uso el siguiente fragmento, puedo recuperar el parámetro "email" del parámetro del método y de FacesContext, pero recuerdo que el parámetro del método no fue recuperable en el Ejemplo 1 !

// Example 4. This works, and BOTH parameters are retrievable! <p:commandButton value="Place order" action="#{orderManager.placeOrder(param[''email''])}" > <f:param name="email" value="#{param[''email'']}"/> </p:commandButton>

¿Puedo pasar un objeto EL JSF implícito como un parámetro de método de acción?

¿Y tienes una explicación de por qué parece funcionar en el Ejemplo 4, pero no en el Ejemplo 1?


El atributo de action se evalúa durante la fase Aplicar valores de solicitud de la solicitud HTTP activada por el envío de formulario, que es una solicitud HTTP diferente a la que produjo el resultado HTML con el formulario (y con el parámetro de email presente en la solicitud) .

La etiqueta <f:param> se evalúa durante la fase de respuesta de procesamiento de la solicitud HTTP que debe producir el resultado HTML con el formulario. Esto termina así "codificado" en la salida HTML generada (¡contrario a los argumentos del método EL en el atributo de action !). Cuando el usuario envía el formulario, esto simplemente se devuelve al servidor como un parámetro de solicitud simple String vainilla (que necesitaría convertir de nuevo si originalmente era un tipo complejo).

Esto no tiene nada que ver con si el valor es un objeto EL implícito o no.

Dicho esto, hay otras 2 formas:

  1. Pasarlo como entrada oculta (no, no con <h:inputHidden> ).

    <h:form> <input type="hidden" name="email" value="#{param.email}" /> ... </h:form>

  2. Establézcalo como propiedad de una vista de bean con ámbito, permanecerá en bean mientras viva la vista.

    <f:metadata> <f:viewParam name="email" value="#{viewScopedBean.email}" /> </f:metadata>