2011-06-29 60 views
0

我試圖讓一個小應用程序使用Seam 3,RichFaces 4並在傳遞一些參數時遇到一些麻煩。我嘗試了很多不同的東西,但我一直在最後的障礙。我通過請求參數傳遞customerId。但是當我彈出一個彈出面板上的RichFaces命令按鈕時,該customerId不再提供給我。使用Seam,RichFaces和PopupPanel傳遞參數

我正在設置一個應用程序來管理一些數據。基本上,你從一個屏幕選擇客戶,將帶您到包含「資源庫」,您則可以創建,編輯等,您可以通過URL到第二個庫頁另一個畫面:

http://localhost:8080/media-manager/repositories.xhtml?customer=12

然後,我有一顆豆採摘這個值了:

@Named 
@RequestScoped 
public class RepositoryBean extends AbstractViewBean<Repository> { 
    // Various properties etc. here 

    private Long customerId; 

    public void init() { 
     log.info("Customer ID is "+ customerId); 
    } 
} 

然後我通過元數據設置的客戶ID存儲庫頁上,並調用初始化:

<f:metadata> 
    <f:viewParam name="customer" value="#{repositoryBean.customerId}"/> 
    <f:event type="preRenderView" listener="#{repositoryBean.init}" /> 
</f:metadata> 

這在一開始就運行良好。我可以使用提供的ID顯示客戶需要的信息。但是,當我嘗試創建我的popupPanel是有點不對。下面的代碼的簡化版本,第一:

<rich:popupPanel id="repositoryModalPanel" modal="true" resizeable="true"> 
    <f:facet name="header">Title</f:facet> 
    <f:facet name="controls"> 
    <h:outputLink value="#" onclick="#{rich:component('repositoryModalPanel')}.hide(); return false;">X</h:outputLink> 
    </f:facet> 
    <h:form id="modalForm" class="modalForm"> 
    <fieldset> 
    <ul class="layout form"> 
     <li> 
     <label for="name" class="required">Name:</label> 
     <h:inputText id="name" value="#{repositoryBean.instance.name}" required="true"> 
      <!-- rich:validator event="blur"/--> 
     </h:inputText> 
     <rich:message for="name" errorClass="error errormessage" /> 
     </li> 
     <li class="last"> 
     <a4j:commandButton id="create" value="Create" action="#{repositoryBean.saveRepository}" rendered="#{empty repositoryBean.instance.id}"/> 
     <a4j:commandButton id="save" value="Save" action="#{repositoryBean.saveRepository}" rendered="#{not empty repositoryBean.instance.id}"/> 
     <a4j:commandButton id="cancel" value="Cancel" action="#{repositoryBean.clearInstance}" immediate="true" /> 
     </li> 
    </ul> 
    </fieldset> 
</h:form> 

基本上,只要我打的保存的commandButton,init方法被調用,但從未填充在客戶成員。有沒有人有任何洞察力爲什麼?

我讀過viewParam僅適用於GET請求,所以也許這就是問題所在?但是,如果是這樣 - 另一種解決方案是什麼?我見過的很多東西(例如使用@ManagedProperty)似乎並不適用於Seam 3.

回答

1

RepositoryBean是RequestScoped,因此會在每個請求中新創建,特別是在您點擊保存按鈕時。

直接的解決方案是將RepositoryBean升級爲ConversationScoped,並在進入頁面時使其長時間運行。

@Named 
@ConversationScoped 
public class RepositoryBean extends AbstractViewBean<Repository> { 
    // Various properties etc. here 

    @In 
    Conversation conversation 

    private Long customerId; 

    public void init() { 
     log.info("Customer ID is "+ customerId); 
     conversation.begin(); 
    } 
} 

對於該easieast方式是轉儲preRenderView和使用接縫3視圖動作來代替。

<f:metadata> 
    <f:viewParam name="customer" value="#{repositoryBean.customerId}"/> 
    <s:viewAction action="#{repositoryBean.init}" if="#{conversation.transient}"/> 
</f:metadata> 
+0

這樣做的工作,但通過首選項,我想避免使用對話只爲一個頁面。你知道有什麼方法可以堅持requestcope嗎? –

+0

當然,你可以通過GET方式顯式地傳遞參數,並忘記整個init()機制。但是 - 除非有你沒有提到的要求 - 在這種情況下避免談話絕對是錯誤的。不要忘了,促進對話從短暫到長時間運行的整個概念已經完全按照這個用例進行設計......當然,您不需要擔心任何性能下降/增加的內存消耗這樣的事情... –