我正在尝试扩展 JSF 1.2 中的 NavigationHandler,并保留访问过的页面的堆栈(更准确地说,是视图 ID,以及操作和输出)。
我尝试实现一个自定义操作,例如“go_back”,它将带我回到上一页。
我当前的 NavigationHandler:
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import java.util.Stack;
public class NavigationManager extends NavigationHandler {
NavigationHandler _base;
private Stack trailPointStack;
public NavigationManager(NavigationHandler base) {
super();
_base = base;
trailPointStack = new Stack();
}
@Override
public void handleNavigation(FacesContext fc, String actionMethod, String actionName) {
NavigationPoint point;
String currentAction = actionName;
String currentMethod = actionMethod;
if (actionName.equals("go_back") && (trailPointStack.size() > 0)) {
point = (NavigationPoint) trailPointStack.pop();//better check if there is something in there
//currentAction = null;
//currentMethod = null;
currentAction = point.getAction();
currentMethod = point.getActionMethod();
fc.getViewRoot().setViewId(point.getViewId());
} else {
point = new NavigationPoint(actionName, actionMethod, fc.getViewRoot().getViewId());
trailPointStack.push(point);
}
//check stack size to be less than 6 items
while (trailPointStack.size() > 5) {
trailPointStack.removeElementAt(0);
}
_base.handleNavigation(fc, currentMethod, currentAction);
}
}
NavigationPoint 只是一个包含 3 个字符串的简单类,分别用于 actionName、actionMethod 和 ViewId。
我的导航规则,在 faces-config.xml 中:
<navigation-rule>
<description>Index to subpages</description>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-outcome>i_to_1</from-outcome>
<to-view-id>/page_a1.jsp</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>to_page_a2</from-outcome>
<to-view-id>/page_a2.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
<navigation-rule>
<description>From page a1</description>
<from-view-id>/page_a1.jsp</from-view-id>
<navigation-case>
<from-outcome>to_page_a2</from-outcome>
<to-view-id>/page_a2.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
<navigation-rule>
<description>From page a2</description>
<from-view-id>/page_a2.jsp</from-view-id>
<navigation-case>
<from-outcome>to_page_a1</from-outcome>
<to-view-id>/page_a1.jsp</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>to_index</from-outcome>
<to-view-id>/index.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
我只有 3 页,index.jsp、page_a1.jsp 和 page_a2.jsp。
您可以在导航案例中看到它们之间的联系。我想要的是能够从 page_a2.jsp “go_back”到 page_a1.jsp 或 index.jsp。
正常导航工作正常:索引 -> P1 -> P2 -> P1 -> P2 -> 索引;没问题。
如果我这样做:索引 -> P1 -> P2
我将在堆栈上:
底部
1:index.jsp/i_to_1 -> page_a1.jsp
2:page_a1.jsp/to_page_a2 -> page_a2.jsp
顶部
当我从 P2 尝试“go_back”时,我希望它返回到第 1 页。它没有(页面刚刚重新加载)。如果我第二次尝试,它会起作用。
我认为这是因为在第一次尝试时,我从堆栈中弹出,并尝试使用“to_page_a2”操作 - 失败。第二次,它再次从堆栈中弹出,但现在它尝试使用“i_to_1”,这......不知何故,有效。
谁能帮我这个?我希望我的解释足够清楚 - 如果没有,请询问。
也欢迎任何类似的想法。我应该提一下,我是在 2 天前开始使用 JSF 的,我还不清楚那里发生的一切。
谢谢你,亚历克斯