Tengo una aplicación web donde los usuarios pueden enviarse directamente a algunas páginas específicas (como una página donde puede ver o editar un elemento). Para lograr eso, proporcionamos una url específica. Estas URL están ubicadas en fuera de la aplicación web actual (es decir, pueden estar presentes en otra aplicación web o en un correo electrónico).Cómo hacer una redirección en JSF
La url parece http://myserver/my-app/forward.jsf?action=XXX¶m=YYY
, donde:
- acción representa la página en la que se redirige al usuario. Puede considerar esto como
from-outcome
de cualquier acción JSF ennavigation-case
enfaces-config.xml
. - actionParam es un parámetro para la acción anterior (generalmente un ID de elemento)
Así, por ejemplo, que puede tener este tipo de URLs:
http://myserver/my-app/forward.jsf?action=viewItem&actionParam=1234
http://myserver/my-app/forward.jsf?action=editItem&actionParam=1234
Por supuesto, tengo una clase de Java (bean) que comprobará algunos restricciones de seguridad (es decir ¿el usuario puede ver/editar el artículo correspondiente?) y luego redirigir al usuario a la página correcta (como edit.xhtml
, view.xhtml
o access-denied.xhtml
).
aplicación actual
En la actualidad, tenemos una forma básica para lograr el avance. Cuando el usuario hace clic en el enlace, la siguiente página XHTML se llama:
<html>
<body id="forwardForm">
<h:inputHidden id="myAction" binding="#{forwardBean.hiddenAction}"/>
<h:inputHidden id="myParam" binding="#{forwardBean.hiddenActionParam}"/>
<h:commandButton id="forwardBtn" actionListener="#{forwardBean.doForward}" style="display: none;"/>
</body>
<script type="text/javascript">
document.getElementById('forwardForm:forwardBtn').click();
</script>
</html>
Como se puede ver, se unen dos componentes <h:inputHidden>
en mi bean Java. Se usarán para almacenar el valor del parámetro de solicitud action
y actionParam
(usando FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("actiontParam");
). También proporciono el método doForward
que se llamará inmediatamente cuando se represente la página, lo que redirigirá (nuevamente) al usuario a la página real. El método es:
public void doForward(ActionEvent evt) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String redirect = // define the navigation rule that must be used in order to redirect the user to the adequate page...
NavigationHandler myNav = facesContext.getApplication().getNavigationHandler();
myNav.handleNavigation(facesContext, null, redirect);
}
Esta solución funciona, pero tengo dos problemas con eso:
- que no me gusta la forma en que se implementa. Estoy seguro de que puedo tener algo más sencillo (¿usar un servlet?).
- Esta solución usa Javascript, y no debo usar Javascript (ya que este reenvío puede ser utilizado por usuarios antiguos de Blackberry, donde no es compatible con Javascript).
Así que mi pregunta es cómo refactorizar esta característica de redirección/avance?
Información técnica
Java 1.6, JSF 1.2, Facelets, richfaces
No estoy seguro de si es mejor hacer o no, pero le está dando a los usuarios un enlace para hacer clic y utilizando XHTML intermedio y haciendo Javascript haga clic en, pero ¿Por qué no lo está apuntando a un servlet y desde allí puede manejar este escenario que quiero decir en lugar de xhtml intermedio por qué no utilizar servlet. No creo que sea malo agregar nuestro propio servlet en jsf env –
@org: esto sin duda se puede hacer sin servlets. Usar un servlet solo agregaría dolores de cabeza adicionales debido a que no tiene acceso instantáneo a los casos de navegación. – BalusC
@BalusC Gracias, quiero saber, ¿cómo? , ¿Podemos usar scriptlets jsp en xhtml directamente? –