0

我在动态生成的文本框中编辑时遇到问题。

看我的代码。

<h:form>
                <h:panelGroup>
                    <h:panelGrid columns="2"> 
                        <h:panelGrid columns="1"> 
                            <h:selectOneRadio id="radio1" value="#{dynamicBean.radiovalue}" layout="pageDirection" >
                                <f:selectItems value="#{dynamicBean.objectList}" var="k1" itemValue="#{k1.value}" itemLabel="" />
                            </h:selectOneRadio>
                        </h:panelGrid>
                        <h:panelGrid columns="1" rowClasses="raw1">
                            <c:forEach items="#{dynamicBean.objectList}" var="k3">
                                <p:inputText value="#{k3.textvalue}" valueChangeListener="#{dynamicBean.ajaxEvent}" >
                                </p:inputText>
                            </c:forEach>
                        </h:panelGrid>
                        <h:commandButton value="add new" action="#{dynamicBean.addNew}"/>
                    </h:panelGrid>
                </h:panelGroup>
            </h:form>

这是我的豆子。

@ManagedBean
@ViewScoped
public class DynamicBean implements Serializable{

    private String radiovalue;
    private List<Pojo> objectList=new ArrayList<Pojo>();
    int i=0;
    private Pojo single=new Pojo();

    public DynamicBean() {   
        System.out.println("In Cons");
        if(objectList.isEmpty())
        {
            Pojo p1=new Pojo();
            p1.setName("Name-"+i);
            p1.setValue("Value-"+i);
            p1.setTextvalue("Text-"+i);
            objectList.add(p1);
            i++;
            setRadiovalue(p1.getValue());
        }
    }

    public void addNew()
    {   
        Pojo p1=new Pojo();
        p1.setName("Name-"+i);
        p1.setValue("Value-"+i);
        p1.setTextvalue("Text-"+i);
        objectList.add(p1);
        i++;
        setRadiovalue(p1.getValue());
    }

    public void ajaxEvent(ValueChangeEvent e)
    {
        System.out.println("New:"+e.getNewValue());
        System.out.print("Old:"+e.getOldValue());
    }

以下是 Pojo 中带有 getter 和 setter 的三个变量

private String name;
    private String value;
    private String textvalue;

最大的困惑是我可以在文本框中更改第一个对象的值,但我不能更改新生成的对象的值。

谢谢。

4

1 回答 1

1

您的具体问题是因为您使用<c:forEach>的是在视图构建期间运行的 JSTL 标记,而您使用的是视图范围的 bean。视图范围的 bean 存储在视图状态中。当您将表单提交到服务器时,视图状态将恢复,但此时原始视图范围 bean 尚不可用,因此将创建一个新的(因此,所有属性都设置为默认值!)。恢复视图后,原始视图范围 bean 将被放回范围内,覆盖临时的。

您需要一个完整的 JSF UI 组件而不是 JSTL 标记。为此,您需要<h:dataTable>.

代替

<h:panelGrid columns="1" rowClasses="raw1">
    <c:forEach items="#{dynamicBean.objectList}" var="k3">
        <p:inputText value="#{k3.textvalue}" valueChangeListener="#{dynamicBean.ajaxEvent}" >
        </p:inputText>
    </c:forEach>
</h:panelGrid>

经过

<h:dataTable value="#{dynamicBean.objectList}" var="k3" rowClasses="raw1">
    <h:column>
        <p:inputText value="#{k3.textvalue}" valueChangeListener="#{dynamicBean.ajaxEvent}" />
    </h:column>
</h:dataTable>

也可以看看:


与具体问题无关,您在构造函数中有一些代码重复。只需addNew()在其中调用方法即可。我也会删除实例变量i,因为这没有任何意义。只需使用本地的,而不是使用List#size().

public DynamicBean() {
    addNew();
}

public void addNew() {
    Pojo p1 = new Pojo();
    int i = objectList.size();
    p1.setName("Name-" + i);
    p1.setValue("Value-" + i);
    p1.setTextvalue("Text-" + i);
    objectList.add(p1);
    setRadiovalue(p1.getValue());
}
于 2012-05-13T04:02:08.330 回答