如何在 JSF 1.x 中对页面加载进行重定向
我有一个Web应用程序,用户可以直接发送到某些特定页面(例如他可以查看或编辑项目的页面)。为此,我们提供了一个特定的网址。这些网址位于当前Web应用程序之外(即它们可以存在于另一个Web应用程序中,也可以存在于电子邮件中)。
该网址如下所示,其中:http://myserver/my-app/forward.jsf?action=XXX¶m=YYY
-
操作表示将重定向到用户的页面。您可以将此视为 中任何 JSF 操作的操作。
from-outcome
navigation-case
faces-config.xml
- actionParam 是上一个操作的参数(通常是项目 ID)
例如,我可以拥有这些类型的网址:
http://myserver/my-app/forward.jsf?action=viewItem&actionParam=1234
http://myserver/my-app/forward.jsf?action=editItem&actionParam=1234
当然,我有一个Java类(bean),它将检查一些安全约束(即是否允许用户查看/编辑相应的项目?),然后将用户重定向到正确的页面(例如,或)。edit.xhtml
view.xhtml
access-denied.xhtml
当前实现
目前,我们有一个基本的方法来完成前进。当用户单击该链接时,将调用以下 XHTML 页:
<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>
如您所见,我在 Java Bean 中绑定了两个组件。它们将用于存储两者和请求参数的值(使用 )。我还提供了在呈现页面时将立即调用的方法,该方法将(再次)将用户重定向到真实页面。方法是:<h:inputHidden>
action
actionParam
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("actiontParam");
doForward
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);
}
这个解决方案是有效的,但我有两个问题:
- 我不喜欢它的实现方式。我相信我可以有更简单的东西(使用Servlet?)。
- 这个解决方案使用Javascript,我一定不能使用Javascript(因为这个转发可能被旧的黑莓用户使用,其中Javascript不受支持)。
所以我的问题是如何重构这个重定向/转发功能?
技术资料
Java 1.6, JSF 1.2, Facelets, Richfaces