【问题标题】:JSF passing object to templateJSF 将对象传递给模板
【发布时间】:2013-02-10 16:04:19
【问题描述】:

我有两个 jsf 页面。 layout.xhtml 和 page.xhtml。布局如下:

<ui:composition>                                                                                                                      
<h:panelGroup id="menu" layout="block">                                                                                           
    <h:outputText value="#{menuBean}" />                                                                                          
    <h:form>                                                                                                                      
        <ui:repeat var="menuItem" value="#{menuBean.menuItems}">                                                                  
            <button:menuItem label="#{msgs[menuItem.label]}" action="#{menuBean.selectItem(menuItem.label)}" update="#{update}" />
        </ui:repeat>                                                                                                              
    </h:form>                                                                                                                     
</h:panelGroup>                                                                                                                   
<ui:repeat var="menuItem" value="#{menuBean.menuItems}">                                                                          
    <h:panelGroup layout="block" rendered="#{menuBean.selectedItemLabel eq menuItem.label}">                                      
        <ui:include src="#{menuItem.page}" />                                                                                     
    </h:panelGroup>                                                                                                               
</ui:repeat>                                                                                                                      

这样的页面:

<h:panelGroup binding="#{page}" layout="block">             
    <ui:decorate template="../template.xhtml">                   
        <ui:param name="menuBean" value="#{pageBean}" />        
        <ui:param name="update" value=":#{page.clientId}" />
    </ui:decorate>
</h:panelGroup> 

当我第一次渲染页面时一切正常(菜单项被渲染等)。单击任何按钮后,我得到Target Unreachable, identifier 'menuBean' resolved to null

谁能解释发生了什么,为什么menuBean 没有再次分配,是否存在另一种实现这种事情的方法(要有一些通用布局页面,在那里传递一些对象并生成页面)?我的 bean 由 Spring 管理。

更新:

我猜这个问题与我的复合按钮有关,看起来像这样:

<composite:interface name="menuItem">                                                                                                
    <composite:attribute name="action" targets="button" />                                                                           
    <composite:attribute name="styleClass" />                                                                                        
    <composite:attribute name="label" />                                                                                             
    <composite:attribute name="update" />                                                                                            
    <composite:attribute name="rendered" />                                                                                          
    <composite:insertChildren />                                                                                                     
</composite:interface>                                                                                                               

<composite:implementation>                                                                                                           
    <h:commandButton id="button" value="#{cc.attrs.label}" style="width: 150px;" action="#{cc.attrs.action}"                         
        rendered="#{empty cc.attrs.rendered ? true : cc.attrs.rendered}" styleClass="menu-item #{cc.attrs.styleClass}" type="button">
        <f:ajax render="#{cc.attrs.update}" />                                                                                       
    </h:commandButton>                                                                                                               
</composite:implementation> 

如果我用标准 h:commandButton 替换标签,一切都会完美。我将对象传递给模板,模板将传递的对象传递给复合对象,但我肯定遗漏了一些东西。

【问题讨论】:

    标签: spring jsf jsf-2


    【解决方案1】:

    我认为问题与 bean 的范围有关。据我了解,您的 pageBean 支持 bean 具有请求范围。尝试更改更广泛的范围(应该是查看范围@ViewScoped)。如果您使用 CDI 注释而不是 JSF,那么您可以查看 @ConversationalScope(或者您可以使用 Luiggi 指出的 MyFacesCODI 库)。

    【讨论】:

    • @ViewScoped 来自 JSF,而不是来自 PrimeFaces。在 CDI 中,如果您想使用 @ViewScoped,您可以添加 MyFacesCODI 库来添加此功能。
    • 是的,我已经理解了我的错误并编辑了我的答案。并感谢您提供有关 MyFacesCODI 的信息,有时间我会看看。
    • 我在 portlet (Liferay 6) 环境中使用 ICEFaces。 bean 由 Spring 管理,我的 pageBean 是 ViewScoped :((甚至 SessionScope 行为相同)
    【解决方案2】:

    BalusC 所面临的问题已经在他的 blogspot 中描述过: http://balusc.blogspot.cz/2011/09/communication-in-jsf-20.html#ViewScopedFailsInTagHandlers

    简单地说,在回传请求(按钮的ajax 刷新)传递到我的复合按钮时bean 不存在。正如 BalusC 所指出的,解决方案可以是创建标准 UIComponent 而不是使用复合快捷方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 2021-09-12
      • 1970-01-01
      相关资源
      最近更新 更多