Jakarta ee selectonemenu未使用<;从另一个selectonemenu更新;p:ajax>;素面
我正在尝试通过从其他selectonemenu中选择一些值来更新selectonemenu。我正在使用Jakarta ee selectonemenu未使用<;从另一个selectonemenu更新;p:ajax>;素面,jakarta-ee,jsf-2,primefaces,Jakarta Ee,Jsf 2,Primefaces,我正在尝试通过从其他selectonemenu中选择一些值来更新selectonemenu。我正在使用 但是侦听器没有调用updateName方法。 在使用id manufacturename从selectonemenu中选择一些值之后,我尝试使用id-deviceosName更新selectonemenu id为ManufactureName的selectonemenu正在再次更新 这是我的xhtml页面- <h:form id="main" enctype="multipart/for
但是侦听器没有调用updateName方法。
在使用id manufacturename从selectonemenu中选择一些值之后,我尝试使用id-deviceosName更新selectonemenu
id为ManufactureName的selectonemenu正在再次更新
这是我的xhtml页面-
<h:form id="main" enctype="multipart/form-data">
<p:growl id="messages" showDetail="true" />
<p:panel id="os_version_panel" header="Os Version">
<h:panelGrid columns="3" title="Os Version" style="width:40%;height:20%;padding:10%;padding-left:30%">
<h:outputLabel for="manufectureName" value="Manufecture Name:*" style="float:right;font-size:15px;width:200px" />
<p:spacer width="20" height="50" />
<p:selectOneMenu id="manufectureName" value="#{deviceRegistration.selectedManufacture}" effect="fade" converter="deviceManufactureConverter"
style="width:200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{deviceRegistration.manufactureNameList}" var="manufacturer" itemLabel="#{manufacturer.manufacturersName}"
itemValue="#{manufacturer}" />
<p:ajax event="valueChange" update=":main:deviceosName" listener="#{deviceRegistration.updateOSName}" />
</p:selectOneMenu>
<h:outputLabel for="deviceosName" value="Device OS Name:*" style="float:right;font-size:15px;width:200px" />
<p:spacer width="20" height="50" />
<p:selectOneMenu id="deviceosName" value="#{deviceRegistration.selectedOsName}" effect="fade" converter="deviceOsNameConverter"
style="width:200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{deviceRegistration.osNamesList}" var="name" itemLabel="#{name.osName}" itemValue="#{name}" />
</p:selectOneMenu>
<h:outputLabel for="versionName" value="Device OS Version Name:*" style="float:right;font-size:15px;width:200px" />
<p:spacer width="20" height="50" />
<p:inputText id="versionName" value="#{deviceRegistration.selectedVersion.osVersionName}" required="true" label="versionName" size="30">
<f:validateLength minimum="2" />
</p:inputText>
<h:outputLabel for="version" value="Device Os Version:*" style="float:right;font-size:15px;width:200px" />
<p:spacer width="20" height="50" />
<p:inputText id="version" value="#{deviceRegistration.selectedVersion.osVersion}" required="true" label="version" size="30">
<f:validateLength minimum="2" />
</p:inputText>
<f:facet name="footer">
<p:spacer width="20" height="80" />
<p:commandButton id="addOsVersion" value="Add OS Version" actionListener="#{deviceRegistration.addOsVersion}"
action="addversion.xhtml?faces-redirect=true" ajax="false" style="float:right;" />
</f:facet>
</h:panelGrid>
</p:panel>
</h:form>
将菜单更改为:
<p:selectOneMenu id="manufectureName" value="#{deviceRegistration.selectedManufacture}" effect="fade" converter="deviceManufactureConverter"
style="width:200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{deviceRegistration.manufactureNameList}" var="manufacturer" itemLabel="#{manufacturer.manufacturersName}"
itemValue="#{manufacturer}" />
<p:ajax update="deviceosName" listener="#{deviceRegistration.updateOSName}" />
</p:selectOneMenu>
p:ajax
的默认事件是change
。您的侦听器方法是否被调用?您也不需要:main:deviceosName
,因为deviceosName
与manufacturename
在同一个from中 一个运行良好的示例应用程序。
托管bean:
package app.so.dev.web.controller;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import app.so.dev.web.model.Manufacturer;
import app.so.dev.web.model.Product;
@ManagedBean(name = "so15369641")
@ViewScoped
public class SO15369641 implements Serializable {
private static final long serialVersionUID = 3128349336575959334L;
private static final String[] manufacturerNames;
private static final String[] productNames;
private List<Manufacturer> manufacturers;
private List<Product> products;
private List<Product> productsForManufacturer;
private String selectedManufacturer;
private String selectedProduct;
static {
manufacturerNames = new String[3];
manufacturerNames[0] = "Intel";
manufacturerNames[1] = "Asus";
manufacturerNames[2] = "AMD";
productNames = new String[5];
productNames[0] = "Motherboard";
productNames[1] = "Processor";
productNames[2] = "Graphics card";
productNames[3] = "NIC";
productNames[4] = "RAM";
}
@PostConstruct
public void init() {
manufacturers = new ArrayList<Manufacturer>();
for(String manufactureName : manufacturerNames) {
manufacturers.add(new Manufacturer(manufactureName));
}
products = new ArrayList<Product>();
for (String productName : productNames) {
products.add(new Product(productName, getRandomManufacturerName()));
}
productsForManufacturer = new ArrayList<Product>();
}
public void updateProduct(AjaxBehaviorEvent event) {
if(selectedManufacturer == null || selectedManufacturer.trim().length() == 0) {
return;
}
productsForManufacturer.clear();
for(Product product : products) {
if(product.getManufactureName().equals(selectedManufacturer)) {
productsForManufacturer.add(product);
}
}
}
private String getRandomManufacturerName() {
return manufacturerNames[(int) (Math.random() * 3)];
}
public List<Manufacturer> getManufacturers() {
return manufacturers;
}
public void setManufacturers(List<Manufacturer> manufacturers) {
this.manufacturers = manufacturers;
}
public List<Product> getProductsForManufacturer() {
return productsForManufacturer;
}
public void setProductsForManufacturer(List<Product> productsForManufacturer) {
this.productsForManufacturer = productsForManufacturer;
}
public String getSelectedManufacturer() {
return selectedManufacturer;
}
public void setSelectedManufacturer(String selectedManufacturer) {
this.selectedManufacturer = selectedManufacturer;
}
public String getSelectedProduct() {
return selectedProduct;
}
public void setSelectedProduct(String selectedProduct) {
this.selectedProduct = selectedProduct;
}
}
包app.so.dev.web.controller;
导入java.io.Serializable;
导入java.util.ArrayList;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
导入javax.faces.event.AjaxBehaviorEvent;
导入app.so.dev.web.model.Manufacturer;
导入app.so.dev.web.model.Product;
@ManagedBean(name=“so15369641”)
@视域
公共类SO15369641实现了可序列化{
私有静态最终长serialVersionUID=3128493336575959334L;
私有静态最终字符串[]制造商名称;
私有静态最终字符串[]产品名称;
私人名单制造商;
私人上市产品;
私有列表产品制造商;
私有字符串selectedManufacturer;
私有字符串选择产品;
静止的{
manufacturerNames=新字符串[3];
制造商名称[0]=“英特尔”;
制造商名称[1]=“Asus”;
制造商名称[2]=“AMD”;
productNames=新字符串[5];
产品名称[0]=“主板”;
产品名称[1]=“处理器”;
产品名称[2]=“图形卡”;
产品名称[3]=“NIC”;
产品名称[4]=“RAM”;
}
@施工后
公共void init(){
制造商=新的ArrayList();
for(字符串制造商名称:制造商名称){
制造商。添加(新制造商(制造商名称));
}
products=新的ArrayList();
用于(字符串productName:productNames){
添加(新产品(productName,getRandomManufacturerName());
}
productsForManufacturer=new ArrayList();
}
public void updateProduct(AjaxBehaviorEvent事件){
如果(selectedManufacturer==null | | selectedManufacturer.trim().length()=0){
返回;
}
productsForManufacturer.clear();
用于(产品:产品){
if(product.getManufactureName().equals(selectedManufacturer)){
productsForManufacturer.add(产品);
}
}
}
私有字符串getRandomManufacturerName(){
返回制造商名称[(int)(Math.random()*3)];
}
公共制造商名单(){
退货制造商;
}
公共制造商(列出制造商){
这是。制造商=制造商;
}
公共列表getProductsForManufacturer(){
退回产品给制造商;
}
public void setProductsForManufacturer(列出产品ForManufacturer){
this.productsForManufacturer=productsForManufacturer;
}
公共字符串getSelectedManufacturer(){
返回所选制造商;
}
public void setSelectedManufacturer(字符串selectedManufacturer){
this.selectedManufacturer=selectedManufacturer;
}
公共字符串getSelectedProduct(){
返回所选产品;
}
公共无效集合selectedProduct(字符串selectedProduct){
this.selectedProduct=selectedProduct;
}
}
以及xhtml:
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" template="/WEB-INF/templates/globalTemplate.xhtml">
<ui:define name="title">15369641</ui:define>
<ui:define name="content">
<p:growl id="growl" showDetail="true" />
<h:form id="form">
<p:selectOneMenu id="manufacturer" value="#{so15369641.selectedManufacturer}">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{so15369641.manufacturers}" var="manufacturer" itemLabel="#{manufacturer.name}" itemValue="#{manufacturer.name}" />
<p:ajax listener="#{so15369641.updateProduct}" update="product"/>
</p:selectOneMenu>
<p:selectOneMenu id="product" value="#{so15369641.selectedProduct}">
<f:selectItem itemLabel="Select One" itemValue=""/>
<f:selectItems value="#{so15369641.productsForManufacturer}" var="product" itemLabel="#{product.name}" itemValue="#{product.name}"/>
</p:selectOneMenu>
</h:form>
</ui:define>
</ui:composition>
15369641
希望这会有帮助
环境:
- JBossAS7
- JBossorg提供的JSF Mojarra 2.1.7
- 第3.4.2条
updateName
方法
如果发生转换或验证错误,则可能发生这种情况。然后,调用应用程序阶段将完全跳过。您没有使用
,可能也没有注意服务器日志中的警告,因此这些转换/验证错误没有引起您的注意
确保注意转换/验证错误。事实上,你有一个成功的机会是很大的
main:ManufactureName:验证错误:值无效
如果这是真的,那么请针对所有可能的原因和适当的解决方案,回答以下问题:
另一个可能的原因是您没有正确注册PrimeFaces
FileUploadFilter
。这里有一个默认JSF不支持的
。但是,这不会只导致这个问题,而是整个表单根本不可提交/处理,根据目前提供的信息,情况似乎并非如此。在这种情况下,什么是:main?你能试一下吗?snamemain是你的id