2011-04-13 66 views
8

我正在嘗試將記錄的ID從一個頁面發送到另一個頁面。如何使用f:viewParam對GET請求執行操作?

所以在第1頁,我有這樣的事情:

<p:column> 
    <h:link value="#{rpb.map['transNum']}" outcome="TInput.xhtml"> 
     <f:param name="id" value="#{rpb.map['id']}" /> 
    </h:link> 
</p:column> 

,並在目標頁面(TInput.xhtml),我有這樣的事情來捕捉ID:

.... 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 

<f:metadata> 
    <f:viewParam name="id" value="#{tInputBean.id}"></f:viewParam> 
</f:metadata> 

<h:head> 
.... 

現在,點擊鏈接,進入第2頁,第2頁由一個視圖範圍的jsf bean處理。和從我的調試,這是happenning的順序:

  1. 執行
  2. 模型與
從viewParam捕獲(APPY請求+驗證之後)的ID更新@PostConstruct方法

我想實現的是: 更新模型後,我想執行該記錄ID的查詢,獲取它的bean,它是業務服務的詳細信息列表。

我不知道應該在哪裏我可以把我的查詢代碼:

  1. @PostConstruct方法中是不可能的,因爲從viewParam捕獲的ID被後設置爲模型的@PostConstruct方法完成
  2. 模型更新後使用階段監聽器?
  3. 使用系統事件?雖然我似乎無法找到一個合適的這種情況

請賜教:)

回答

8

添加<f:event type="preRenderView"><f:metadata>

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

public void init(ComponentSystemEvent event) throws AbortProcessingException { 
    // ... 
} 

(順便說一下,在違背了文檔,參數和異常都是可選的,至少在我使用過的所有鑽嘴魚科2.X版本)

+0

@BalusC:非常感謝你!我今天才知道,我們可以將事件標籤放在f:元數據中。所以,基本上,無論使用GET還是POST,我都可以使用f:metadata中的f:event根據事件類型調用方法,我是否正確? – bertie 2011-04-13 15:26:22

+0

不客氣。是的,這與方法無關。然而,這樣一個帶有'f:metadata'的頁面應該只用於GET請求。 – BalusC 2011-04-13 15:28:17

+0

@BalusC:你好!我想知道,如果f:metadata最好只用於GET方法,那麼推薦使用POST方法在預渲染事件上執行方法的方法是什麼? – bertie 2011-04-14 00:46:12

4

我使用了BalusC解決方案。感謝;)

我只想補充,如果你使用的facelet,你需要把:

<f:metadata> 

在每個頁面使用的模板:

mytemplate.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets"> 

<ui:insert name="meta"/> 

mypage.xhtml使用mytemplate。XHTML:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

<ui:composition template="mytemplate"> 

<ui:define name="meta"> 
    <f:metadata> 
     <f:viewParam name="id" value="#{tInputBean.id}" /> 
     <f:event type="preRenderView" listener="#{tInputBean.init}" /> 
    </f:metadata> 
    </ui:define> 
... 

發現的解決方案爲:https://forums.oracle.com/forums/thread.jspa?threadID=2145709