2013-02-10 123 views
0

我有兩個jsf頁面。 layout.xhtml和page.xhtml。佈局是這樣的:JSF將對象傳遞給模板

<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沒有再次分配,如果存在另一種方式來實現這種事情(有一些通用的佈局頁面,傳遞一些對象並生成頁面)?我的豆由Spring管理。

UPDATE:

我想這個問題以某種方式連接到我的複合按鍵,看起來像這樣:

<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> 

如果我更換用標準小時標籤:的commandButton一切完美。我將對象傳遞給模板,模板將傳遞的對象傳遞給複合,但我肯定錯過了一些東西。

回答

0

我認爲問題與豆的範圍有關。據我瞭解你的pageBean支持bean有請求範圍。嘗試改變更廣泛的範圍(它應該是視圖範圍@ViewScoped)。如果您使用CDI註釋而不是JSF,那麼您可以查看@ConversationalScope(或者可以使用MyFacesCODI庫,如Luiggi所述)。

+0

'@ ViewScoped'來自JSF,而不是PrimeFaces。在CDI中,如果您想使用'@ ViewScoped',則可以添加添加此功能的MyFacesCODI庫。 – 2013-02-10 17:07:05

+0

是的,我已經打開了我的惡作劇,編輯我的unswer。感謝您提供MyFacesCODI的相關信息,我會在有空的時候看看它。 – dimas 2013-02-10 17:09:32

+0

我在Portlet(Liferay 6)環境中使用ICEFaces。豆由Spring管理,我的pageBean是ViewScoped :((即使SessionScope的行爲相同) – svobol13 2013-02-10 17:25:30