JSF:空嵌套的dataTable [英] JSF: Empty nested dataTable

查看:122
本文介绍了JSF:空嵌套的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆