2011-01-27 41 views
1

我有一個頁面通過querystring接收一個id號碼並顯示相關文章。JSF 2.0查詢字符串傳播

我用<f:viewParams>與preRenderView事件和數據從數據庫中@PostConstruct方法加載:

@Named 
@RequestScoped 
public class Bean { 
    private Long id; 

    @PostCostruct 
    public void init() { 
     if (this.id != null) { 
      // load data from db 
     } 
    } 

    public String modify() { 
     // update data 
    } 
} 

當我調用數據被正確加載頁面,但是當我點擊修改按鈕

<h:commandButton value="Modify" action="#{bean.modify}" /> 

我得到一個錯誤,因爲沒有查詢字符串參數發送到bean,從而沒有數據加載。

如何傳播查詢字符串參數?

回答

1

afaik,修改方法應返回以「?includeViewParams = true」結尾的操作字符串。只有這樣視圖參數纔會被傳播(理論上它也應該和faces-include-view-params一起工作,當與faces-redirect配對時,這會減少眼睛的傷害)。

附錄:如果您需要(如註釋中所述)在您的init方法中使用該參數,那麼它們不是 - 從JSF角度來看 - 實際輸入。你沒有得到驗證,轉換等,但如果你只是想抓住的原始值,使用:

@ManagedParam("#{param.id}") 
private String id; 

// getter and setter for param goes here (obligatory!) 

的ID將在調用init前被注入。請注意,這基本上是一種繞過viewparams的方式。你可以使用除String之外的其他類型,但任何轉換錯誤都將以異常結束,所以最好將它保留爲字符串並手動進行任何轉換。

但是,你的問題的根源似乎是濫用@PostConstruct;大概要填寫您一直在預渲染階段,大致如下所示:

<f:event type="preRenderView" listener="#{beanThatNeedsId.init}"/> 
+0

但我需要在方法返回之前id參數,甚至在調用該方法,在init方法了。 – Alf 2011-01-29 21:33:19