JSF:空嵌套的dataTable [英] JSF: Empty nested dataTable
问题描述
托管bean的一部分代码是:
@ManagedBean
@SessionScoped
public class InspectionBean实现Serializable {
private MBeanInfo data;
private List< OperationWrapper>操作;
public void setInitData(MBeanInfo data){
this.data = data;
initOperations();
}
public List< MBeanOperation> getOperations(){
返回操作;
}
public void setOperations(List< MBeanOperation> list){
operations = list;
}
private void initOperations(){
operations = new ArrayList< MBeanOperation>();
for(MBeanOperationInfo opInfo:data.getOperations()){
OperationWrapper opWrapper = new OperationWrapper();
opWrapper.setName(opInfo.getName());
opWrapper.setDescription(opInfo.getDescription());
opWrapper.setReturnType(opInfo.getReturnType());
列表< ParameterWrapper> paramList =
new ArrayList< ParameterWrapper>();
for(MBeanParameterInfo paramInfo:opInfo.getSignature()){
ParameterWrapper paramWrapper =
new ParameterWrapper();
paramWrapper.setName(paramInfo.getName());
paramWrapper.setDescription(paramInfo.getDescription());
paramWrapper.setType(paramInfo.getType());
paramWrapper.setValue();
paramList.add(paramWrapper);
}
mBeanOp.setSignature(paramList);
operations.add(mBeanOp);
}
}
//其他代码
}
OperationWrapper类代码:
public class OperationWrapper implements Serializable {
private String name;
private String returnType;
private List< ParameterWrapper>签名;
private String description;
//其他getter和setter
public List< ParameterWrapper> getSignature(){
return signature;
}
public void setSignature(List< ParameterWrapper> signature){
this.signature = signature;
}
}
ParameterWrapper类代码:
public class ParameterWrapper implements Serializable {
private String name;
private String type;
private String description;
private String value;
//简单的getter和setter
}
是问题页面的代码:
< h:dataTable value =#{inspectBean.operations}var =操作
border =1width =100%cellpadding =5
style =border-style:solid; border-collapse:collapse;>
< h:column>
< f:facet name =header>操作< / f:facet>
#{operation.name}
< / h:column>
< h:column>
< f:facet name =header>返回值< / f:facet>
#{operation.returnType}
< / h:column>
< h:column>
< f:facet name =header>描述< / f:facet>
#{operation.description}
< / h:column>
< h:column>
< f:facet name =header>参数< / f:facet>
< h:form>
< h:dataTable value =#{operation.signature}var =param
rendered =#{not empty operation.signature}
border =1width =100%
style =border-style:solid; border-collapse:collapse;>
< h:column>
#{param.name}
< / h:column>
< h:column>
#{param.type}
< / h:column>
< h:column>
#{param.description}
< / h:column>
< h:column>
< h:inputText value =#{param.value}size =20/>
< / h:column>
< / h:dataTable>
< a4j:commandButton value =Invoke
action =#{inspectBean.invokeOperation(operation)}
render =@ none/>
< / h:form>
< / h:column>
< / h:dataTable>
当页面的这一部分显示时,它看起来像这样:
所以嵌套数据表中没有文本!
你可以看到桌子在他们应该的地方。还有文本单元格。并在正确的数量。但是文本在哪里?
调试没有结果。列表中填写正确的数据。
有什么问题?如何解决这个问题?
罪魁祸首是在 var
嵌套表标记的属性:
< h:dataTable value =#{operation。签名}var =param...>
< h:column>
#{param.name}
< / h:column>
...
#{param}
是一个保留的EL变量名称,它引用由 ExternalContext#getRequestParameterMap()
。例如。 page.xhtml?id = 123
将在使用#{param.id时给出打印
。你可以也不应该覆盖它。 123
}
给它一个不同的名字。例如。 var =signature
和#{signature.name}
等。
另请参见:
I'm writing my own implementation of JMX console for JBoss 6.1 based on JSF.
There is a part of code of managed bean:
@ManagedBean
@SessionScoped
public class InspectionBean implements Serializable {
private MBeanInfo data;
private List<OperationWrapper> operations;
public void setInitData(MBeanInfo data) {
this.data = data;
initOperations();
}
public List<MBeanOperation> getOperations() {
return operations;
}
public void setOperations(List<MBeanOperation> list) {
operations = list;
}
private void initOperations() {
operations = new ArrayList<MBeanOperation>();
for (MBeanOperationInfo opInfo : data.getOperations()) {
OperationWrapper opWrapper = new OperationWrapper();
opWrapper.setName(opInfo.getName());
opWrapper.setDescription(opInfo.getDescription());
opWrapper.setReturnType(opInfo.getReturnType());
List<ParameterWrapper> paramList =
new ArrayList<ParameterWrapper>();
for (MBeanParameterInfo paramInfo : opInfo.getSignature()) {
ParameterWrapper paramWrapper =
new ParameterWrapper();
paramWrapper.setName(paramInfo.getName());
paramWrapper.setDescription(paramInfo.getDescription());
paramWrapper.setType(paramInfo.getType());
paramWrapper.setValue("");
paramList.add(paramWrapper);
}
mBeanOp.setSignature(paramList);
operations.add(mBeanOp);
}
}
//some other code
}
The OperationWrapper class code:
public class OperationWrapper implements Serializable {
private String name;
private String returnType;
private List<ParameterWrapper> signature;
private String description;
//other getters and setters
public List<ParameterWrapper> getSignature() {
return signature;
}
public void setSignature(List<ParameterWrapper> signature) {
this.signature = signature;
}
}
The ParameterWrapper class code:
public class ParameterWrapper implements Serializable {
private String name;
private String type;
private String description;
private String value;
//simple getters and setters
}
And this is a code of a problem page:
<h:dataTable value="#{inspectionBean.operations}" var="operation"
border="1" width="100%" cellpadding="5"
style="border-style: solid; border-collapse: collapse;">
<h:column>
<f:facet name="header">Operation</f:facet>
#{operation.name}
</h:column>
<h:column>
<f:facet name="header">Return Value</f:facet>
#{operation.returnType}
</h:column>
<h:column>
<f:facet name="header">Description</f:facet>
#{operation.description}
</h:column>
<h:column>
<f:facet name="header">Parameters</f:facet>
<h:form>
<h:dataTable value="#{operation.signature}" var="param"
rendered="#{not empty operation.signature}"
border="1" width="100%"
style="border-style: solid; border-collapse: collapse;">
<h:column>
#{param.name}
</h:column>
<h:column>
#{param.type}
</h:column>
<h:column>
#{param.description}
</h:column>
<h:column>
<h:inputText value="#{param.value}" size="20"/>
</h:column>
</h:dataTable>
<a4j:commandButton value="Invoke"
action="#{inspectionBean.invokeOperation(operation)}"
render="@none"/>
</h:form>
</h:column>
</h:dataTable>
When this part of the page is displayed, it looks like this: So there is no text in nested dataTables!
As you can see tables are in places where they should. And there are cells for text. And in the right quantity. But where is the text?
Debugging gives no result. Lists are filled with the correct data.
What's wrong? How can I fix this?
The culprit is in the var
attribute of your nested table markup:
<h:dataTable value="#{operation.signature}" var="param" ...>
<h:column>
#{param.name}
</h:column>
...
The #{param}
is a reserved EL variable name which refers the request parameter map as obtained by ExternalContext#getRequestParameterMap()
. E.g. page.xhtml?id=123
will give print 123
when using #{param.id}
. You can and should not override it.
Give it a different name. E.g. var="signature"
and #{signature.name}
, etc.
See also:
这篇关于JSF:空嵌套的dataTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!