2012-04-02 129 views
1

我正在使用primefaces在頁面上顯示一些數據,並且在CLOB類型數據上單擊時我想打開一個彈出窗口(使用primefaces對話框組件)來顯示完整數據。問題是,當我把呈現的atrribute放到commandlink時,它不會觸發backing bean上的方法。如果我不使用渲染的atrribute,它會正確地啓動該方法。但它不會正確傳遞參數。帶有呈現屬性的jsf commandlink和commandbutton不會觸發actionlistener

backing bean是viewscoped。我提交時可能是關於bean的狀態是否丟失?如果是這樣,那麼要做什麼來克服呢?

這裏是源:

<p:dataTable id="dynamicDBReaderResultTable" 
    widgetVar="wv_dynamicDBReaderResult" paginator="true" page="1" 
    rows="10" value="#{controller.data}" var="record" 
    paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
    rowsPerPageTemplate="10,25,50,100" 
    emptyMessage="#{dtsmsgm['NoRecords']}" 
    errorMessage="Error viewing data" rowIndexVar="rownumber" lazy="false" 
    dynamic="true"> 
    <p:column> 
     <h:outputText value="#{rownumber+1}" 
      style="font-weight:bold; font-size:1.05em" /> 
    </p:column> 
    <p:columns value="#{controller.columnNames}" var="columnName" 
     columnIndexVar="columnIndex"> 
     <f:facet name="header"> 
      <h:outputText value="#{columnName}" /> 
     </f:facet> 
     <h:outputText value="#{record[columnIndex].toDisplayString()}" /> 

<p:commandLink id="showDataButton" value="..." 
      actionListener="#{controller.prepareLargeData(rownumber,columnIndex)}" 
      rendered="#{record[columnIndex].dataType eq '2005'}" //if this attribute is removed, it fires the action, but with both parameters as zero 
      onsuccess="dlg.show()"> 
     </p:commandLink> 



    </p:columns> 
</p:dataTable> 

<p:dialog id="largeDataDialog" header="Large Data Content" 
    widgetVar="dlg" closeOnEscape="true" minHeight="150"> 
    <h:outputText id="largeData" value="#{controller.largeData}" /> 
</p:dialog> 

輔助Bean:

@ManagedBean(name = "dynamicDBReader") 
@ViewScoped 
public class DynamicDBReader extends AEntityBean<AEntity> { 
private List<String> columnNames; 
private List<DBData[]> tabularData; 
private boolean showTable; 
private DBData largeData; 


public void prepareLargeData(int rowNumber, int columnIndex) { 
    largeData = tabularData.get(rowNumber)[columnIndex]; 
} 

@Override 
public void init() { 
    reInit(); 
} 

private void reInit() { 
    columnNames = new ArrayList<String>(); 
    tabularData = new ArrayList<DBData[]>(); 
    selectedRelease = getLastRelease(); 
    setShowTable(false); 
} 



public List<DBData[]> getData() { 
    return tabularData; 
} 

public List<String> getColumnNames() { 
    return columnNames; 
} 


/** 
* @param showTable 
*   the showTable to set 
*/ 
public void setShowTable(boolean showTable) { 
    this.showTable = showTable; 
} 

/** 
* @return the showTable 
*/ 
public boolean isShowTable() { 
    return showTable; 
} 

/** 
* @param largeData 
*   the largeData to set 
*/ 
public void setLargeData(DBData largeData) { 
    this.largeData = largeData; 
} 

/** 
* @return the largeData 
* @throws SQLException 
* @throws IOException 
*/ 
public String getLargeData() { 
    if (largeData == null) { 
     return ""; 
    } 
    try { 
     return largeData.toFullString(); 
    } catch (IOException ioe) { 
     String errorMessage = "Failed reading data"; 
     LogUtil.error(logger, errorMessage, ioe); 
    } catch (SQLException sqle) { 
     String errorMessage = "Failed reading data"; 
     LogUtil.error(logger, errorMessage, sqle); 
    } 
    return ""; 
} 

} 

回答

1

如果變量columIndex的值的形式提交的HTTP POST請求期間已改變,可以發生。如果#{controller.columnNames}依賴於基於請求的條件,而該條件僅在使用表格顯示頁面時纔是正確的,則會發生這種情況。您需要確保您在視圖範圍的bean的(後)構造函數中預初始化它,並且該值不會在getter方法中初始化/操作。

+0

那麼表是動態的。它通過將輸入的查詢傳遞給db來獲取數據,並在頁面上顯示結果。我將CLOB類型數據顯示爲 ... 我想將行號和列號作爲參數傳遞給支持bean以從表格數據中獲取clob類型數據以顯示在彈出窗口中。點擊「...」時我不更新表格 列索引是我使用columnIndexVar =「columnIndex」PrimeFaces的「列」組件的columntruebute獲得的客戶端索引。它實際上不存儲在backing bean中。 @BalusC – Bren 2012-04-02 12:39:56

+0

這又取決於'#{controller.columnNames}',它實際上是從後臺bean獲得的。 – BalusC 2012-04-02 12:44:09

+0

但columNames不會因clob數據查看請求而更改。我再次檢查確認。那麼,我發佈了我的支持bean的相關部分。 另外我嘗試了別的。而不是傳遞行和列索引。我傳遞了數據對象本身的記錄[columIndex]。但即使數據不爲空傳遞給後備bean的對象爲空 @BalusC – Bren 2012-04-02 13:06:00