JSF 2.0:跨多个视图保留组件状态

时间:2011-01-05 15:26:11

标签: jsf jsf-2 state

我使用MyFaces 2.0.3 / PrimeFaces 2.2RC2开发的Web应用程序分为内容和导航区域。在使用模板(即<ui:define>)包含在多个页面中的导航区域中,有一些小部件(例如导航树,可折叠面板等),我希望在这些小部件中保留跨视图的组件状态。 / p>

例如,假设我在主页上。当我通过单击导航树中的产品导航到产品详细信息页面时,我的Java代码会使用

触发重定向
navigationHandler.handleNavigation(context, null,
  "/detailspage.jsf?faces-redirect=true")

访问该详细信息页面的另一种方法是直接点击主页上显示的产品预告片。相应的<h:link>会将我们引导至详细信息页面。

在这两种情况下,我的导航树(PrimeFaces树组件)和我的可折叠面板的扩展状态都会丢失。我理解这是因为重定向/ h:link会导致创建新视图。

处理此问题的最佳方法是什么?我已经在我的项目中使用了MyFaces Orchestra及其对话范围,但我不确定这是否有任何帮助(因为我必须将小部件的扩展/折叠状态绑定到支持bean ...但据我所知,这是不可能的)。有没有办法告诉JSF哪个组件状态传播到下一个视图,假设该视图中存在相同的组件?

我想我可能需要一个指向正确方向的指针。谢谢!


更新1:我只是尝试将面板和树绑定到会话范围的bean,但这似乎没有任何效果。另外,我想我必须手动绑定所有子组件(如果有的话),所以这似乎不太合适。

更新2:将UI组件绑定到非请求范围的bean不是一个好主意(请参阅我在下面的评论中发布的链接)。如果没有更简单的方法,我可能需要按如下方式进行:

  • 折叠面板或展开树时,将当前状态保存在会话范围的辅助bean中(!= UI组件本身)
  • 组件的状态存储在地图中。映射键是组件(希望)唯一的相对ID。我不能在这里使用整个绝对组件路径,因为如果视图发生更改,父命名容器的ID可能会更改,假设这些ID是以编程方式生成的。
  • 构建新视图后,从地图中检索组件的状态并将其应用于组件。例如,在面板的情况下,我可以将collapsed属性设置为从我的会话范围的辅助bean中检索的值。

更新3:我按照上述说法运行了它。总而言之,解决方案是将相关属性存储在会话范围的bean中,而不是将整个UIComponent会话作用域。然后,在导航发生后重新构建组件时,通过检索保存的属性(使用EL)来设置属性值,例如

<p:panel collapsed="#{backingBean.collapsedState}" ... />

(这是一个简化的例子。由于我使用多个面板,我使用地图来存储这些属性,如上所述。)

2 个答案:

答案 0 :(得分:0)

一种解决方案是使用会话范围的bean。

答案 1 :(得分:0)

可折叠面板是什么意思?我问,因为有一个组件可以关闭,也可以组件。我在项目的导航窗格中使用。 accordianPanel有一个名为“activeIndex”的属性。这是我在sessionBean中所做的,以维护我的手风琴选项卡的状态:

 private int tabIndex; //declared a private variable

    public SessionBean() {
       tabIndex = 100; //set the initial tab index to 100 so all tabs are closed when page loads.
    }

    public int getTabIndex(){
       return tabIndex;
    }

    public void setTabIndex(int tabIndex){
       this.tabIndex=tabIndex;
    }

in my navigation pane:



<p:accordionPanel activeIndex="#{sessionBean.tabIndex}" collapsible="true" autoHeight="false">
    <p:tab title="#{tab1_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" /><br/>
    </p:tab>
    <p:tab title="#{tab2_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" />
    </p:tab>
    <p:tab title="#{tab3_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" />
    </p:tab>
 </p:accordionPanel>

我没有使用树组件进行导航,因为这给我的项目带来了一些困难,这些困难可以通过使用accordionPanel轻松克服,所以我不能说导航的那一部分。

相关问题