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 "";
}
}
那麼表是動態的。它通過將輸入的查詢傳遞給db來獲取數據,並在頁面上顯示結果。我將CLOB類型數據顯示爲 ... 我想將行號和列號作爲參數傳遞給支持bean以從表格數據中獲取clob類型數據以顯示在彈出窗口中。點擊「...」時我不更新表格 列索引是我使用columnIndexVar =「columnIndex」PrimeFaces的「列」組件的columntruebute獲得的客戶端索引。它實際上不存儲在backing bean中。 @BalusC –
Bren
2012-04-02 12:39:56
這又取決於'#{controller.columnNames}',它實際上是從後臺bean獲得的。 – BalusC 2012-04-02 12:44:09
但columNames不會因clob數據查看請求而更改。我再次檢查確認。那麼,我發佈了我的支持bean的相關部分。 另外我嘗試了別的。而不是傳遞行和列索引。我傳遞了數據對象本身的記錄[columIndex]。但即使數據不爲空傳遞給後備bean的對象爲空 @BalusC – Bren 2012-04-02 13:06:00