在jsf中动态添加radio和InputText

时间:2012-05-12 21:13:11

标签: jsf-2

我在动态生成的textBox中遇到编辑问题。

看我的代码。

<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;

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

感谢。

1 个答案:

答案 0 :(得分:1)

您的具体问题是由于您正在使用JSTL <c:forEach>标记而导致的,该标记在您使用视图范围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());
}