我有一个JSF 2.0应用程序,它有一个叫做协议的bean。这个应用程序总共有4页:main.xhtml,details.xhtml,generation.xhtml和generationFailed.xhtml。正确的导航顺序应该是main.xhtml - > details.xhtml并给定某些条件,generation.xhtml或generationFailed.xhtml。
顺序必须是这样的,因为为了正确显示details.xhtml和生成页面,必须根据用户在main.xhtml中的输入构建bean。
问题是客户可以通过在浏览器中输入URL地址直接转到任何页面。因此,当加载例如details.xhtml时,它会抛出一个错误,因为协议bean有几个null属性。我必须以某种方式知道协议bean的属性是否为null(该属性称为id),如果它为null,则强制重定向到main.xhtml。
有什么想法吗?
答案 0 :(得分:1)
您必须为页面使用过滤器,并为每个客户端构建虚拟状态机。状态机保留您描述的导航规则:main.xhtml - > details.xhtml - > generation.xhtml或generationFailed.xhtml。通过将状态保存在cookie或任何你喜欢的状态(在会话中或服务器端以某种方式),您可以通过检查实际状态来管理,如果实际请求是合法的还是不合适的。
答案 1 :(得分:1)
当用户从main.xhtml导航到任何页面时,只需将main.xhtml bean的属性放入flash范围
public String gotoDetails() {
getFlash().put("id", Id);
return "/pages/details?faces-redirect=true";
}
然后在Details bean中检查此属性以确保它不为null,否则将用户重定向到主页面以选择第一个订单或其他任何东西。使用此方法进行检查
public void loadPage(ComponentSystemEvent cse) {
if (null == getID()) {
FacesContext
.getCurrentInstance()
.getApplication()
.getNavigationHandler()
.handleNavigation(FacesContext.getCurrentInstance(), null,
"/pages/main?faces-redirect=true");
}
}
然后您可以使用
在details.xhtml中调用preRenderView event
中的上一个方法
<f:event listener="#{yourdetailsbean.loadPage}" type="preRenderView" />
答案 2 :(得分:0)
好吧,如果用户输入URL,浏览器将发送GET请求,但如果他们提交表单,则会提交POST请求。您可以简单地编写一个servlet Filter,将FacesServlet的所有GET请求重定向到欢迎页面。
答案 3 :(得分:0)
创建一个sessionscoped bean并添加3个布尔值:
firstPageVisited,secondPageVisited,thirdPageVisited。
在第4页上检查thirdPageVisited是否为false,重定向到3,如果secondPageVisited为false则重定向为2 ...