【问题标题】:dynamic adding radio and InputText in jsf在jsf中动态添加radio和InputText
【发布时间】:2012-05-20 23:59:42
【问题描述】:

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

查看我的代码。

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

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

谢谢。

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

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

    您需要一个完整的 JSF UI 组件而不是 JSTL 标记。为此,您需要&lt;h:dataTable&gt;

    替换

    <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());
    }
    

    【讨论】:

    • 非常感谢。我真的很期待你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2011-04-08
    相关资源
    最近更新 更多