¿Cómo navegar en JSF? Cómo hacer que la URL de reflejar la página actual (y no del anterior)

Actualmente estoy aprendiendo JSF, y fue bastante sorprendido y perplejo cuando me di cuenta de que cada vez que usamos <h:form>, el comportamiento estándar de JSF es que siempre me muestra el URL de la anterior la página en el navegador, como opuesto a la dirección URL de la actual página.

Entiendo que esto tiene que ver con la forma en JSF siempre envía un formulario en la misma página y, a continuación, sólo hace lo que sea de la página el controlador le da al navegador que no sabe la ubicación de la página ha cambiado.

Parece JSF ha sido de alrededor durante bastante tiempo, no debe ser un lugar limpio, sólido manera de lidiar con esto. Si es así, ¿te importaría compartir?

He encontrado varias soluciones, pero lamentablemente nada de lo que parece una real solución sólida.

  • Simplemente aceptar que la dirección URL es engañosa.
  • Anexar "?faces-redirect=true" en el valor de retorno de cada bean acción y, a continuación,
    • averiguar cómo reemplazar @RequestScoped con algo más (Flash Ámbitos, CDI conversación, @SessionScoped, …).
    • aceptar tener dos HTTP viajes de ida y vuelta para cada acción del usuario.
  • El uso de algún método (por ejemplo, la 3ª parte de la biblioteca o código personalizado) para ocultar el nombre de la página en la URL, utilizando siempre el mismo genérico URL para cada página.

Si "?faces-redirect=true" es tan bueno como se pone, hay una manera de hacer configurar una aplicación completa para el tratamiento de todas las solicitudes de esta manera?

Solucionado un problema aquí, sólo en caso de que alguien lo necesite stackoverflow.com/questions/15635338/…

OriginalEl autor Student | 2013-03-20

2 Kommentare

  1. 70

    De hecho, JSF como una forma basada en aplicación dirigida MVC framework envía el formulario de envío a la misma URL donde la página con el <h:form> se ha solicitado formulario. Usted puede confirmar observando la <form action> URL de la que genera el HTML de salida. Esta es la web en términos de desarrollo, que se caracteriza como devolución. Una navegación en una devolución de datos por defecto no provocar una nueva solicitud a la nueva URL, pero en lugar de la carga de la página de destino como el contenido de la respuesta. Este es de hecho un lío cuando simplemente quiero que la página a la página de navegación.

    Por lo general, el enfoque de derechos como a la navegación/redirección depende de los requerimientos del negocio y la idempotence (leer: «bookmarkability») de la solicitud (nota: para el hormigón ejemplos de código, consulte el «Véase también» enlaces de abajo).

    • Si la solicitud es idempotente, sólo tiene que utilizar un OBTENER el formulario/link en lugar de enviar el formulario (es decir, usar <a>, <form>, <h:link> o <h:button> en lugar de <h:form> y <h:commandXxx>).

      Por ejemplo, la página a la navegación de la página de Google como buscador, etc.

    • Si la solicitud no es idempotente, sólo se muestran los resultados de forma condicional en el mismo punto de vista (es decir, volver null o void de método de acción y hacer uso de, por ejemplo, <h:message(s)> y/o rendered).

      Por ejemplo, en la página de entrada de datos/editar, asistente de varios pasos, de diálogo modal, formulario de confirmación, etc.

    • Si la solicitud no es idempotente, pero la página de destino es idempotente, acaba de enviar una redirección después de la POST (es decir, devolver el resultado con la ?faces-redirect=true de método de acción, o invocar manualmente ExternalContext#redirect(), o poner <redirect/> en el legado de XML de navegación caso).

      Por ejemplo, para mostrar la lista de todos los datos después de la exitosa edición, redirigir después de inicio de sesión, etc.

    Nota que puro página a página, la navegación es generalmente idempotente y aquí es donde muchos JSF empezar a fallar por abusar de comando enlaces de botones/y, a continuación, después se quejan de que la Url no cambia. También tenga en cuenta que la navegación de los casos son muy rara vez se utiliza en aplicaciones del mundo real que son desarrollados con respecto a SEO/UX y aquí es donde muchos JSF tutoriales fallar, permitiendo que los lectores creen lo contrario.

    También tenga en cuenta que el uso de POST es absolutamente no «más seguro» que el que se OBTIENE debido a que los parámetros de la petición no son inmediatamente visibles en la URL. Todavía son visibles en el cuerpo de la solicitud HTTP y todavía calcular y manipular. Así que no hay absolutamente ninguna razón para preferir POST para idempotente solicitudes para el bien de la «seguridad». La verdadera seguridad está en el uso de HTTPS en lugar de HTTP y la comprobación en el negocio de los métodos de servicio si el usuario conectado actualmente se permite la consulta de la entidad X, o para manipular a la entidad X, etc. Un digno marco de seguridad que ofrece anotaciones para esto.

    Véase también:

    gracias por esa respuesta sistemática. Usted hablar de un montón de opciones que no estaba enterado. Voy a echar un vistazo a ellos. asistente de varios pasos fue de hecho lo que yo estaba pensando. Sabes por casualidad una página con un buen ejemplo sobre cómo hacerlo en una sola página sin utilizar la 3ª parte de las herramientas?
    E. g. stackoverflow.com/questions/9741778/…
    que es muy cool. Las páginas individuales/pasos siguen siendo inaccesibles para el usuario? Me gusta especialmente que usted puede utilizar @ViewScoped con eso. gracias!
    Por favor, disculpe mi ignorancia BalusC (de nuevo). ¿Por qué los diseñadores de JSF no utilice la dirección URL almacenada para que el botón atrás del navegador para saber dónde enviar el POST atrás en lugar de meterse con la URL del navegador. No hay duda de que existe una razón técnica para ello, pero esto es la única cosa que realmente me molesta acerca de JSF. Se tornillos: archivo CSS lugares cuando se sale de una sub-carpeta; marcadores; y también la seguridad de los contenedores, ya que estará feliz de mostrar una página segura, porque la seguridad de los contenedores es mirar a la URL de la página actual, y ver la página anterior, no de la actual, supuestamente, a la página segura.
    Como respondió, simplemente no usar POST de la página a la página de navegación.

    OriginalEl autor BalusC

  2. -2

    Un poco tarde pero voy a publicar mi solución aquí. Yo tenía la misma pregunta, pero no encontramos este post hasta después de que yo había publicado. En el código de abajo me la actualización de la URL de forma manual a través de una redirección como se mencionó anteriormente, pero mediante programación, no a través de html. Esto se ajusta a mis propósitos. La aplicación se desplaza a una nueva página y la URL se actualiza. El uso de la «devuelve la cadena» método impide la URL de la actualización, así que simplemente reemplazar cada una de las personas con esta ExternalContext redirigir y todo debería estar bien. Gracias por la explicación.

    public void viewGroups(){
    
    ExternalContext ec = FacesContext.getCurrentInstance()
            .getExternalContext();
    try {
    
         ec.redirect(ec.getRequestContextPath()
                    + "/viewgroups.xhtml");
    
    } catch (IOException e) {
        //TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    }   
    El muy upvoted respuesta es más detallada, y es probable que una mejor solución. Mi método funciona en el caso de que un marco de seguridad que se establece, tales como la asignación de funciones con la autorización de url. Debido al cambio de dirección, un 404 se produce cuando los usuarios no autorizados a visitar esa página. Simplemente estoy ofreciendo una alternativa, aunque no soy lo suficientemente educadas sobre el tema para conocer las repercusiones de esto en el código de java en lugar de a <redirigir> en una web de contenido de archivo. Siéntase libre me ilumine.
    La Otra respuesta tiene una redirección solución para Java demasiado y no algo que debe Hacerse En Un archivo xml. Y Es demasiado trabajará con los marcos de seguridad
    A mi entender, el uso de los mencionados <redirigir>. La redirigir=true se debe establecer en cada elemento que llama a una página. Además, un controlador de navegación también se debe establecer para cada ruta de navegación en un faces–config.xml archivo. Ver en este enlace: mkyong.com/jsf2/jsf-page-forward-vs-page-redirect
    Mi método de «evita ?caras-redirect=true en cada acción de valor devuelto del método» como se ha mencionado en los comentarios anteriores. Usted sólo tendrá que aplicar esto en cada método que se llama a una página.

    OriginalEl autor John Wooley

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea