Navegación JSF 1.2 más eficiente por Java

Tengo un menú desplegable en mi página principal index.xhtml JSF. El código / commandButton asociado se ve así:

    <h:selectOneMenu id="nodes" value="#{MyBacking.chosenNode}">
    <f:selectItems value="#{MyBacking.nodes}" />
</h:selectOneMenu>

<a4j:commandButton value="Retrieve" styleClass="ctrlBtn"
    id="retrieveBtn" style="margin-bottom: 2px;"
    onclick="#{rich:component('nodeLoadWait')}.show()"   # modal
    action="#{MyBacking.redirect}"
    image="/img/btnRetrieve26.png" />

action estaba configurado en 'hola' previamente, y en mi faces-context.xml:

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>hello</from-outcome>
        <to-view-id>/nodeMgmt.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

Cuando te action se configuró en 'hola', haciendo clic en el retrieve El botón funcionó bien en que las caras manejarían la navegación y MyBacking.setChosenNode El método asignaría todos los datos necesarios, de modo que el contenido de nodeMgmt.xhtml se mostraría completamente poblado.

Sin embargo, si la actividad inicial provocada por el clic del usuario retrieve se agota el tiempo de espera, la página web se bloquea aunque el bean detecta el tiempo de espera, y me gustaría redirigir al usuario a una página "agotada".

Para manejar el bean de respaldo que devuelve un mensaje de tiempo de espera agotado (cuya detección de error ya está presente cuando está 'dentro' de la aplicación), pensé en lugar de usar el faces-context.xml archivo, lo manejaría internamente.

Encontré FacesContext.getCurrentInstance (). GetExternalContext (). Redirect pero el javadoc JSF 1.2 no presenta esto. ¿Quizás es porque no aparece? Sin embargo, redirige lo que es confuso. ¿Por qué no hay documentación sobre este método?

No obstante, me redirige a la página, pero se procesa sin tener en cuenta los datos instanciados por el bean durante la solicitud inicial. El bean está en el alcance de la solicitud actualmente. El código relevante en el bean es

    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("nodeMgmt.jsf");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

¿Es usar una llamada de Java backend la mejor manera de hacer este tipo de redirección? Si no es así, ¿es mejor usar faces-context.xml? ¿Si es así, cómo? Mientras estamos aquí, ¿alguien puede dirigirme a un buen recurso de lectura para el uso de FacesContext.getCurrentInstance (). GetExternalContext () que tiene ejemplos decentes sobre cómo hacer una navegación simple con datos porque tengo problemas para ubicar uno?

¡Salud

preguntado el 16 de mayo de 11 a las 16:05

1 Respuestas

Encontré FacesContext.getCurrentInstance (). GetExternalContext (). Redirect pero el javadoc JSF 1.2 no presenta esto. ¿Quizás es porque no aparece? Sin embargo, redirige lo que es confuso. ¿Por qué no hay documentación sobre este método?

Ciertamente la hay.

Probablemente estaba leyendo el javadoc incorrecto. El de FacesContext ¿quizás?


No obstante, me redirige a la página, pero se procesa sin tener en cuenta los datos instanciados por el bean durante la solicitud inicial. El bean está en el alcance de la solicitud actualmente.

Una redirección indica al navegador que active una nueva solicitud HTTP. Por lo tanto, todos los beans con ámbito de solicitud de la solicitud anterior se anularán y reinicializarán en la nueva solicitud. Si desea retener la solicitud, le gustaría usar un reenvío en su lugar (que JSF usa de forma predeterminada), pero esto no funcionará en las solicitudes iniciadas por ajax, ya que se mantendrá en la misma página de todos modos. Solo una respuesta con una redirección obligará a Ajax a cambiar la ubicación de la ventana usando JavaScript.

Si desea conservar algunos parámetros en la nueva solicitud, deberá pasarlos como parámetros de solicitud. P.ej

externalContext.redirect("nodeMgmt.jsf?foo=bar");

y configúrelos como propiedad administrada en el bean.

contestado el 16 de mayo de 11 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.