Jsf 封闭panelGrid对selectonemenu的影响
我的primefaces selectOneMenu出现问题,并(意外地)修复了它。但我不明白为什么,因为我所做的一切,使它的工作是包装一个panelGrid周围的所有组件。(我还没有接触转换器或底层bean) 下面是一个重现行为的示例: 豆子: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;
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>