gpt4 book ai didi

java - 具有渲染属性的jsf commandlink和commandbutton不会触发actionlistener

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:49 25 4
gpt4 key购买 nike

我正在使用 primefaces 在页面上显示一些数据,当单击 CLOB 类型数据时,我想打开一个弹出窗口(使用 primefaces 对话框组件)来显示完整数据。问题是,当我将渲染的属性放入 commandlink 时,它不会触发支持 bean 的方法。如果我不使用渲染的属性,它会正确触发该方法。但它不会正确传递参数。

支持 bean 是受 View 范围限制的。当我提交时,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 "";
}

}

最佳答案

如果变量 columIndex 的值在表单提交的 HTTP POST 请求期间发生更改,就会发生这种情况。如果 #{controller.columnNames} 依赖于基于请求的条件(该条件仅在显示带有表格的页面期间正确),则可能会发生这种情况。您需要确保在 View 作用域 bean 的(后)构造函数中预初始化它,并且该值未在 getter 方法中初始化/操作。

关于java - 具有渲染属性的jsf commandlink和commandbutton不会触发actionlistener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9975303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com