Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jsf2中的表内选择一个菜单_Java_Ajax_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Java 在jsf2中的表内选择一个菜单

Java 在jsf2中的表内选择一个菜单,java,ajax,jsf,jsf-2,primefaces,Java,Ajax,Jsf,Jsf 2,Primefaces,我有一张带有2个SelectOne功能表组件的桌子 我希望在第一个selectOneMenu组件中选择一条记录后,它将在同一行中用Ajax更新另一个selectOneMenu 我的桌子: <p:dataTable value="#{myBean.myInfo}" var="myInfo"> <p:column> <f:facet name="header">Group</f:facet> <h:sele

我有一张带有2个SelectOne功能表组件的桌子

我希望在第一个selectOneMenu组件中选择一条记录后,它将在同一行中用Ajax更新另一个selectOneMenu

我的桌子:

<p:dataTable value="#{myBean.myInfo}" var="myInfo">
    <p:column>
        <f:facet name="header">Group</f:facet>
        <h:selectOneMenu value="#{myInfo.myInfoType.code}">
            <f:selectItems value="#{myBean.myList}" />
            <f:ajax event="change" execute="@this" listener="#{myBean.refershNames}" render="myNames"/>
        </h:selectOneMenu>
    </p:column>
    <p:column>
        <f:facet name="header">Name</f:facet>
        <h:selectOneMenu id="myNames" value="#{myInfo.myInfoType.secondCode}">
            <f:selectItems value="#{myBean.mySecondList}" />
        </h:selectOneMenu>
    </p:column>
<p:dataTable>

团体
名称
在bean中,我有:

List<SelectItem> myList,mySecondList;

public void refershNames(AjaxBehaviorEvent event){
    //how can I retrieve the selected item and update the relevant record?
}
List myList,mySecondList;
公共无效引用名称(AjaxBehaviorEvent事件){
//如何检索所选项目并更新相关记录?
}

我如何使用Ajax实现它?我正在使用JSF2

将datatable值包装在中,这样您就可以通过以下方式获得有问题的
myInfo
对象。所以


更新根据评论,这是我在你告诉我它不起作用后创建的测试用例。在Tomcat 7.0.5和Glassfish 3.0.1上,Mojarra 2.0.3对我都有效

com.example.Item

public class Item {

    private String value1;
    private String value2;

    // Generate public getters/setters.    
}
com.example.Bean

@ManagedBean
@ViewScoped
public class Bean {

    private List<Item> items;
    private DataModel<Item> model;
    private List<String> list;

    @PostConstruct
    public void init() {
        items = Arrays.asList(new Item(), new Item(), new Item());
        model = new ListDataModel<Item>(items);
        list = Arrays.asList("one", "two", "three");
    }

    public void change(AjaxBehaviorEvent e) {
        Item item = model.getRowData();
        item.setValue2(item.getValue1());
    }

    public DataModel<Item> getModel() {
        return model;
    }

    public List<String> getList() {
        return list;
    }

}

这个测试用例证明,每当您更改第一列中的下拉列表值时,同一行中第二列中的下拉列表值将被反映以检索相同的值。

我也遇到了同样的问题,经过大量的尝试和错误后,这对我是有效的

<p:column style="width:50%">
                    <f:facet name="header">
                        <h:outputText value="Criteria" />
                    </f:facet>
                    <h:selectOneMenu value="#{option.predefinedMessageId}"
                        valueChangeListener="#{predefinedMessageBean.predefinedMessageChangeListener}">
                        <f:selectItems
                            value="#{campaignRecipientCriteriaBean.messages}"
                            var="predef" itemLabel="#{predef.fieldName}"
                            itemValue="#{predef.predefinedMessageId}" />
                            <p:ajax event="change" update="optionsList"/>

                    </h:selectOneMenu>
                </p:column>


                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Options" />
                    </f:facet>
                    <p:outputPanel id="optionsList">
                    <h:selectOneMenu
                        value="#{option.predefinedMessageOptionId}">
                        <f:selectItems
                            value="#{predefinedMessageBean.emptyOptionBeansList}"
                            var="predef" itemLabel="#{predef.optionCaption}"
                            itemValue="#{predef.predefinedMessageOptionId}" />

                    </h:selectOneMenu>
                    </p:outputPanel>
                </p:column>

这很简单,对我来说效果很好,因为我在第一列中选择的消息更新了第二列中的选项,它是通过ajax完成的。但是,我仍然在学习,我对jsf的很多知识都来自@BalusC blog:),因此,如果这种方法有一些缺陷,请让我知道。

但是我如何只刷新同一行中的选择项?但它不会呈现所有表中的所有选择项吗?不,您指定了一个相对标识符。每行都有行索引的父标识符。或者它对你不起作用吗?它没有帮助。它只返回原始值,而不返回新的选定值。请参见答案更新。请注意,我现在意识到您正在使用PrimeFaces。您可能需要改用
。还请注意,对于不是标准类型(字符串、数字、布尔值)的情况,项值必须正确实现
equals()
public class Item {

    private String value1;
    private String value2;

    // Generate public getters/setters.    
}
@ManagedBean
@ViewScoped
public class Bean {

    private List<Item> items;
    private DataModel<Item> model;
    private List<String> list;

    @PostConstruct
    public void init() {
        items = Arrays.asList(new Item(), new Item(), new Item());
        model = new ListDataModel<Item>(items);
        list = Arrays.asList("one", "two", "three");
    }

    public void change(AjaxBehaviorEvent e) {
        Item item = model.getRowData();
        item.setValue2(item.getValue1());
    }

    public DataModel<Item> getModel() {
        return model;
    }

    public List<String> getList() {
        return list;
    }

}
<h:form>
    <h:dataTable value="#{bean.model}" var="item">
        <h:column>
            <h:selectOneMenu value="#{item.value1}">
                <f:selectItem itemLabel="select..." itemValue="#{null}" />
                <f:selectItems value="#{bean.list}" />
                <f:ajax execute="@this" listener="#{bean.change}" render="list2" />
            </h:selectOneMenu>
        </h:column>
        <h:column>
            <h:selectOneMenu id="list2" value="#{item.value2}">
                <f:selectItem itemLabel="select..." itemValue="#{null}" />
                <f:selectItems value="#{bean.list}" />
            </h:selectOneMenu>
        </h:column>
    </h:dataTable>
</h:form>
<p:column style="width:50%">
                    <f:facet name="header">
                        <h:outputText value="Criteria" />
                    </f:facet>
                    <h:selectOneMenu value="#{option.predefinedMessageId}"
                        valueChangeListener="#{predefinedMessageBean.predefinedMessageChangeListener}">
                        <f:selectItems
                            value="#{campaignRecipientCriteriaBean.messages}"
                            var="predef" itemLabel="#{predef.fieldName}"
                            itemValue="#{predef.predefinedMessageId}" />
                            <p:ajax event="change" update="optionsList"/>

                    </h:selectOneMenu>
                </p:column>


                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Options" />
                    </f:facet>
                    <p:outputPanel id="optionsList">
                    <h:selectOneMenu
                        value="#{option.predefinedMessageOptionId}">
                        <f:selectItems
                            value="#{predefinedMessageBean.emptyOptionBeansList}"
                            var="predef" itemLabel="#{predef.optionCaption}"
                            itemValue="#{predef.predefinedMessageOptionId}" />

                    </h:selectOneMenu>
                    </p:outputPanel>
                </p:column>
public void predefinedMessageChangeListener(ValueChangeEvent e)
{

        getPredefinedMessageOptions(Integer.parseInt(e.getNewValue().toString()));


}