Jsf 生成新行时如何维护/保存行值?

Jsf 生成新行时如何维护/保存行值?,jsf,ajax4jsf,jsf-1.2,Jsf,Ajax4jsf,Jsf 1.2,我有以下bean: public class MyBean { public ArrayList<ReportRow> getReportRows() { return reportRows; } private final ArrayList<ReportRow> reportRows = new ArrayList<ReportRow>(Arrays.asList(

我有以下bean:

public class MyBean {

public ArrayList<ReportRow> getReportRows()
    {
        return reportRows;
    }



    private final ArrayList<ReportRow> reportRows = 
        new ArrayList<ReportRow>(Arrays.asList(

                new ReportRow("","")
    ));

    public ArrayList<ReportRow> getOrderList() {

        return reportRows;

    }

    public String addAction() {

        ReportRow row = new ReportRow("", "");
        reportRows.add(row);
        return null;
    }



    public class ReportRow{

        String reportColumnName;
        String reportColumnDesc;

        public ReportRow(String reportColumnName,String reportColumnDesc) {

            this.reportColumnName=reportColumnName;
            this.reportColumnDesc=reportColumnDesc;
        }

        public String getReportColumnName()
        {
            return reportColumnName;
        }

        public void setReportColumnName(String reportColumnName)
        {
            this.reportColumnName = reportColumnName;
        }

        public String getReportColumnDesc()
        {
            return reportColumnDesc;
        }

        public void setReportColumnDesc(String reportColumnDesc)
        {
            this.reportColumnDesc = reportColumnDesc;
        }

    }

}
公共类MyBean{
公共ArrayList getReportRows()
{
返回报告行;
}
专用最终ArrayList reportRows=
新建ArrayList(Arrays.asList(
新报告行(“,”)
));
公共ArrayList getOrderList(){
返回报告行;
}
公共字符串addAction(){
ReportRow行=新的ReportRow(“,”);
reportRows.add(行);
返回null;
}
公共类报表行{
字符串reportColumnName;
字符串报告columndesc;
公共报告行(字符串reportColumnName、字符串reportColumnDesc){
this.reportColumnName=reportColumnName;
this.reportColumnDesc=reportColumnDesc;
}
公共字符串getReportColumnName()
{
返回报告列名称;
}
public void setReportColumnName(字符串reportColumnName)
{
this.reportColumnName=reportColumnName;
}
公共字符串getReportColumnDesc()
{
返回报告columndesc;
}
public void setReportColumnDesc(String reportColumnDesc)
{
this.reportColumnDesc=reportColumnDesc;
}
}
}
jsf页面:

<t:dataTable value="#{myBean.reportRows}" var="o"
            id="reportColumnsTable" styleClass="standardTable" headerClass="standardTable_Header"
            rowStyleClass="#{myBean.viewDelayedRsd}"
            >

            <h:column>

            <t:outputLabel value="Column name:"></t:outputLabel>
            <t:inputText id="ReportColumnName" value="#{o.reportColumnName}" required="true">
            </t:inputText>

            </h:column>

            <h:column>

            <t:outputLabel value="Column Desc:"></t:outputLabel>
            <t:inputText id="ReportColumnDesc" value="#{o.reportColumnDesc}" >

            </t:inputText>

            </h:column>

            <h:column>

            <h:outputLink value="#add"><h:outputText value="Add"/>
                        <a4j:support ajaxSingle="true" event="onclick" action="#{rprtBean.addAction}"
                        reRender="reportColumnsTable,msgPanel" />                       
            </h:outputLink>

            </h:column>

            </t:dataTable>

问题是,当我单击“添加”时,它会生成一个新行,并清除旧行,我想保留旧行的值,有什么想法吗?

您使用的是
而不是
根本不提交表单,它触发一个简单的GET请求。
中无法正常工作。将其替换为

  • 或者将bean状态保存在视图范围中。在页面中的某个位置添加以下标记:

    <t:saveState value="#{myBean}" />
    
    
    
    或者因为您也在使用RichFaces/Ajax4jsf:

    <a4j:keepAlive beanName="myBean" />
    
    
    
  • 您使用的是
    而不是
    根本不提交表单,它触发一个简单的GET请求。
    中无法正常工作。将其替换为

  • 或者将bean状态保存在视图范围中。在页面中的某个位置添加以下标记:

    <t:saveState value="#{myBean}" />
    
    
    
    或者因为您也在使用RichFaces/Ajax4jsf:

    <a4j:keepAlive beanName="myBean" />
    
    
    

  • 我只使用了a4j命令链接,一切正常。

    我只使用了a4j命令链接,一切正常。

    当我使用第一个解决方案时,它给出了一个异常:java.io.NotSerializableException,因此我使bean实现可序列化,错误消失了,但当我尝试它时,没有新的、仍然旧的行文本文件重置是,bean必须实现可序列化。试试
    。顺便说一句,我不确定它与
    的结合是如何工作的。也许
    是唯一有效的方法。至少,关键是您需要在后续请求中保留相同的数据模型/bean。JSF2.x解决方案是将bean放在视图范围内。第三个解决方案也给了我一个例外:视图范围bean的属性“name”必须是literal根据属性名应该是
    beanName
    ,并且它应该接受EL。您使用的是什么RF/A4J版本?异常基本上告诉我们它实际上应该是一个类似于
    的文本。试试看,显然你使用的是旧版本。myBean是指bean名称还是bean实例?对于第三种解决方案,这两种方法都不适用。当我使用第一种解决方案时,它会给出一个异常:java.io.NotSerializableException,因此我使bean实现了serializable,错误消失了,但当我尝试它时,没有新的、仍然旧的行文本文件重置是的,bean必须实现serializable。试试
    。顺便说一句,我不确定它与
    的结合是如何工作的。也许
    是唯一有效的方法。至少,关键是您需要在后续请求中保留相同的数据模型/bean。JSF2.x解决方案是将bean放在视图范围内。第三个解决方案也给了我一个例外:视图范围bean的属性“name”必须是literal根据属性名应该是
    beanName
    ,并且它应该接受EL。您使用的是什么RF/A4J版本?异常基本上告诉我们它实际上应该是一个类似于
    的文本。试试看,显然你使用的是旧版本。myBean是指bean名称还是bean实例?这两种方法都不适用于第三种解决方案。