我有一个网络应用程序,用户可以直接发送到某些特定页面(例如他可以查看或编辑项目的页面)。为此,我们提供了一个特定的网址。这些网址位于外面(即它们可以存在于另一个 web 应用程序或电子邮件中)。
网址看起来像http://myserver/my-app/forward.jsf?action=XXX¶m=YYY
,其中:
- action表示用户将被重定向到的页面。您可以将其视为in 中
from-outcome
的任何 JSF 操作navigation-case
的faces-config.xml
的 - actionParam是上一个动作的参数(一般是item 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>
如您所见,我<h:inputHidden>
在我的 Java bean 中绑定了两个组件。它们将用于存储两者的值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