Jsf 封闭panelGrid对selectonemenu的影响

Jsf 封闭panelGrid对selectonemenu的影响,jsf,primefaces,selectonemenu,panelgrid,Jsf,Primefaces,Selectonemenu,Panelgrid,我的primefaces selectOneMenu出现问题,并(意外地)修复了它。但我不明白为什么,因为我所做的一切,使它的工作是包装一个panelGrid周围的所有组件。(我还没有接触转换器或底层bean) 下面是一个重现行为的示例: 豆子: import java.io.Serializable; 导入java.util.ArrayList; 导入java.util.List; 导入javax.annotation.PostConstruct; 导入javax.inject.Named;

我的primefaces selectOneMenu出现问题,并(意外地)修复了它。但我不明白为什么,因为我所做的一切,使它的工作是包装一个panelGrid周围的所有组件。(我还没有接触转换器或底层bean)

下面是一个重现行为的示例:

豆子:

import java.io.Serializable;
导入java.util.ArrayList;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.inject.Named;
导入org.apache.myfaces.extensions.cdi.core.api.scope.conversation.viewAccessScope;
@命名为(“testBean”)
@ViewAccessScope
公共类TestBean实现了可序列化{
私有静态最终长serialVersionUID=-83944943048902124L;
私有字符串selectedString;
私人物品清单;
私有列表可用的列表;
@施工后
公共void init(){
things=新ArrayList();
添加(“汽车”);
添加(“猫”);
添加(“房屋”);
添加(“银行”);
listAvailableStrings=new ArrayList();
listAvailableStrings.添加(“一”);
添加(“两个”);
添加(“三”);
添加(“四”);
}
公共物品{
System.out.println(this.things.get(0));
}
公共无效onStringChange(){
System.out.println(this.selectedString);
}
公共字符串getSelectedString(){
返回selectedString;
}
public void setSelectedString(String selectedString){
this.selectedString=selectedString;
}
公共列表getListAvailableStrings(){
返回listAvailableStrings;
}
public void setListAvailableStrings(列表listAvailableStrings){
this.listAvailableStrings=listAvailableStrings;
}
公共列表getThings(){
归还物品;
}
公共物品(列出物品){
这个东西=东西;
}
}
selectOneMenu不工作的xhtml版本(selectedString始终为空):


我的xhtml版本,其按预期工作:(selectedString代表selectOneMenu的选择)


使用版本:

  • 莫哈拉2.2.13
  • Primefaces 6.0
  • 帕亚拉4.1.1#163
  • 尾波1.0.6
  • 焊接2.3.5
  • JSF2.1
有谁能解释一下为什么第一个版本是错误的,这样我可以在进一步发展时考虑到这一点


谢谢

“谁能解释一下为什么第一个版本错了?”这很难,因为它不是一个简单的版本。让代码中的许多“噪音”能够在这里重现。而且版本信息丢失。请阅读并使用测试bean和测试XHTML改进您的示例,在这里可以复制行为。添加版本信息“Mojarra 2.2.13”和“JSF 2.1”是矛盾的。
p:dataTable
是否相关?如果你把它拿走怎么办?垫片?您是否在开发模式下运行jsf应用程序以查看需要更新的“id”是否正确?您是否检查过html源代码,如果panel2_3的客户端id在这两种情况下根本不同(panelgrid是命名容器)Glassfish启动期间控制台告诉我Mojarra 2.2.13,并且配置的Maven依赖项是javax.faces jsf api 2.1 p:dataTable是相关的,只要我对其进行注释,两个版本都可以工作:-),panel2_3的id在两个版本中都是相同的
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Named;

import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ViewAccessScoped;

@Named("testBean")
@ViewAccessScoped
public class TestBean implements Serializable {

    private static final long serialVersionUID = -8394494304848902124L;

    private String selectedString;

    private List<String> things;
    private List<String> listAvailableStrings;

    @PostConstruct
    public void init() {
        things = new ArrayList<String>();
        things.add("Car");
        things.add("Cat");
        things.add("House");
        things.add("Bank");

        listAvailableStrings = new ArrayList<String>();
        listAvailableStrings.add("one");
        listAvailableStrings.add("two");
        listAvailableStrings.add("three");
        listAvailableStrings.add("four");

    }

    public void printThings() {
        System.out.println(this.things.get(0));
    }

    public void onStringChange() {
        System.out.println(this.selectedString);
    }

    public String getSelectedString() {
        return selectedString;
    }

    public void setSelectedString(String selectedString) {
        this.selectedString = selectedString;
    }

    public List<String> getListAvailableStrings() {
        return listAvailableStrings;
    }

    public void setListAvailableStrings(List<String> listAvailableStrings) {
        this.listAvailableStrings = listAvailableStrings;
    }

    public List<String> getThings() {
        return things;
    }

    public void setThings(List<String> things) {
        this.things = things;
    }

}
    <h:form id="testForm">
        <p:panelGrid id="testPanel">

            <p:dataTable id="testTable" value="#{testBean.things}" var="thing">
                <p:column headerText="Things">
                    <h:outputText value="#{thing}" />
                </p:column>

            </p:dataTable>

            <p:commandButton id="btnPrintThing" value="DoIT"
                actionListener="#{testBean.printThings()}">
            </p:commandButton>


    </p:panelGrid>
            <p:spacer height="20" width="100%" />

            <p:panelGrid id="panel2" columns="3" border="0" cellpadding="0"
                style="width:80%">

                <p:panelGrid id="panel2_1">

                    <p:row>
                        <p:column>
                            <p:outputLabel for="somTestSOM" value="selectOneNotWorking"></p:outputLabel>
                        </p:column>
                        <p:column>
                            <h:messages></h:messages>
                            <p:selectOneMenu id="somTestSOM" onchange=""
                                value="#{testBean.selectedString}">
                                <p:ajax update="@([id$=panel2_3])"
                                    listener="#{testBean.onStringChange}" />
                                <f:selectItem itemValue="#{null}" itemLabel="" />
                                <f:selectItems value="#{testBean.listAvailableStrings}"
                                    var="thingSOM" itemValue="#{thingSOM}" itemLabel="#{thingSOM}"></f:selectItems>
                            </p:selectOneMenu>
                        </p:column>

                    </p:row>

                </p:panelGrid>

                <p:spacer width="1" height="250"
                    style="position: relative; bottom: -5px; top: -10px; background-color: #A8A8A8; margin-left: 20px; margin-right: 20px" />


                <p:panelGrid id="panel2_3">
                    <p:row>
                        <p:column colspan="2">
                            <p:outputLabel value="#{testBean.selectedString}"></p:outputLabel>
                        </p:column>
                    </p:row>
                </p:panelGrid>
            </p:panelGrid>

    </h:form>
<h:form id="testForm">
        <p:panelGrid id="testPanel">

            <p:dataTable id="testTable" value="#{testBean.things}" var="thing">
                <p:column headerText="Things">
                    <h:outputText value="#{thing}" />
                </p:column>

            </p:dataTable>

            <p:commandButton id="btnPrintThing" value="DoIT"
                actionListener="#{testBean.printThings()}">
            </p:commandButton>



            <p:spacer height="20" width="100%" />

            <p:panelGrid id="panel2" columns="3" border="0" cellpadding="0"
                style="width:80%">

                <p:panelGrid id="panel2_1">

                    <p:row>
                        <p:column>
                            <p:outputLabel for="somTestSOM" value="selectOneNotWorking"></p:outputLabel>
                        </p:column>
                        <p:column>
                            <h:messages></h:messages>
                            <p:selectOneMenu id="somTestSOM" onchange=""
                                value="#{testBean.selectedString}">
                                <p:ajax update="@([id$=panel2_3])"
                                    listener="#{testBean.onStringChange}" />
                                <f:selectItem itemValue="#{null}" itemLabel="" />
                                <f:selectItems value="#{testBean.listAvailableStrings}"
                                    var="thingSOM" itemValue="#{thingSOM}" itemLabel="#{thingSOM}"></f:selectItems>
                            </p:selectOneMenu>
                        </p:column>

                    </p:row>

                </p:panelGrid>

                <p:spacer width="1" height="250"
                    style="position: relative; bottom: -5px; top: -10px; background-color: #A8A8A8; margin-left: 20px; margin-right: 20px" />


                <p:panelGrid id="panel2_3">
                    <p:row>
                        <p:column colspan="2">
                            <p:outputLabel value="#{testBean.selectedString}"></p:outputLabel>
                        </p:column>
                    </p:row>
                </p:panelGrid>
            </p:panelGrid>
        </p:panelGrid>
    </h:form>