URL看起来像这样:
http://myserver/my-app/forward.jsf?action=XXX¶m=YYY
,其中:- action表示用户将被重定向到的页面。您可以将其视为
faces-config.xml
中任何JSF操作中navigation-case
的from-outcome
。
- actionParam是上一个操作的参数(通常是一个项目ID)。例如,我可以拥有这些类型的URL:
-
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