Marka ve model seçimi için iki tane selectOneMenu komponentim var. Marka değiştiğinde ajax ile model komponenti güncellenecek. Bu durumda brandChanged metodu hiç tetiklenmemektedir. Daha önceki denemelerimde tetiklenmesine rağmen brand değişkeni null olarak set ediliyordu. Sorun neden kaynaklanıyor olabilir? Şimdiden ilgilenen arkadaşlara teşekkürler.

Brand.java

    public class Brand {
    private int id;
    private String name;

public Brand(int id, String name) {
        this.id = id;
        this.name = name;
    }

public int getId() {
        return id;
    }

public void setId(int id) {
        this.id = id;
    }

public String getName() {
        return name;
    }

public void setName(String name) {
        this.name = name;
    }
    }
**Model.java**
    public class Model {
    private int id;
    private String name;

public Model(int id, String name) {
    this.id = id;
    this.name = name;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

CarBean.java

@ManagedBean(name = "carbean")
@ViewScoped
public class CarBean implements Serializable {
    private Brand brand;
    private Model model;
    private List<brand> brandList = new ArrayList<brand>();
    private List<model> modelList = new ArrayList<model>();

@PostConstruct
    public void init() {
        System.out.println("PostConstruct");
        brandList.add(new Brand(1, "Audi"));
        brandList.add(new Brand(2, "Opel"));

modelList.add(new Model(1, "A1"));
        modelList.add(new Model(2, "A3"));
    }

public void brandChanged(AjaxBehaviorEvent event) {
        System.out.println("brandChanged");
        modelList.clear();
        if (brand.getId() == 1) {
            modelList.add(new Model(1, "A1"));
            modelList.add(new Model(2, "A3"));
        } else if (brand.getId() == 2) {
            modelList.add(new Model(1, "Astra"));
            modelList.add(new Model(2, "Corsa"));
        }
    }

public Brand getBrand() {
        return brand;
    }

public void setBrand(Brand brand) {
        this.brand = brand;
    }

public Model getModel() {
        return model;
    }

public void setModel(Model model) {
        this.model = model;
    }

public List<brand> getBrandList() {
        return brandList;
    }

public void setBrandList(List<brand> brandList) {
        this.brandList = brandList;
    }

public List<model> getModelList() {
        return modelList;
    }

public void setModelList(List<model> modelList) {
        this.modelList = modelList;
    }
}

home.xhtml

<h:form>
<h:selectOneMenu id="brandid" value="#{carbean.brand}">
    <f:selectItems value="#{carbean.brandList}" var="brand" itemValue="#{brand.id}" itemLabel="#{brand.name}" />
    <f:ajax event="change" listener="#{carbean.brandChanged}" execute="@this" render="modelid" />
</h:selectOneMenu>

<h:selectOneMenu id="modelid" value="#{carbean.model}">
    <f:selectItems value="#{carbean.modelList}" var="model" itemValue="#{model.id}" itemLabel="#{model.name}" />
</h:selectOneMenu></h:form>

soruldu: 16 Mar, 17:34

alikurnaz's gravatar image

alikurnaz
51112
cevap kabul oranı: 0%

execute this yerine execute = "@form" der misn

(17 Mar, 04:18) ibrahim472 ibrahim472's gravatar image

Şimdi sen <h:selectOneMenu'den bir değer seçtiğin zaman bu değerin ilgili değişkene set olabilmesi için formun submit edilmesi gerekiyor.Genelde biz bunu buttonlar ile yapıyoruz fakat sen şimdi <h:selectOneMenu'den bir değer seçtiğin zaman form submit edilmediği için o anda değer ilgili değişkenine set olmuyor.Eğer selectOneMenu'ne attribute olarak onChange="submit()" koyarsan sanırsam problemin çözülecek.Bir dener misin?

permanent link

cevaplandı: 17 Mar, 03:59

BatuhanApaydin's gravatar image

BatuhanApaydin
1501
cevap kabul oranı: 12%

Denedim ama olmadı. Acaba componentten nesne almaya çalıştığım için çalışmıyor olabilir mi? İlla primitive bir tip mi almam gerekiyor? Converter yazmam gerekiyor mu?

(19 Mar, 14:56) alikurnaz alikurnaz's gravatar image

Evet kardeşim fark ettim ki sen <h:selectonemenu id="brandid" value="#{carbean.brand}"> <f:selectitems value="#{carbean.brandList}" var="brand" itemvalue="#{&lt;a href=" http:="" brand.id"="">brand.id}" itemLabel="#{brand.name}" />

Kısmında brand objesine bir Integer id set etmek istiyorsun.Oysaki şöyle yapmalısın.

<f:selectitems value="#{carbean.brandList}" var="brand" itemvalue="#{brand}" itemlabel="#{brand.name}"/>

itemValue kısmına dikkat et.Ayrıca bu objenin dönüşümünü sağlamak için de converter yazmalısın.Bir böyle dene olmazsa bana yaz tekrar birlikte bakalım.Kolay gelsin geç cevap için kusura bakma.

permanent link

cevaplandı: 19 Mar, 16:57

BatuhanApaydin's gravatar image

BatuhanApaydin
1501
cevap kabul oranı: 12%

itemValue="#{brand}" olarak değiştirdim. Converter ekledim. Converter metodları düzgün bir şekilde çalışıyor fakat managedbean'deki metod tetiklenmiyordu. f:ajax tagının immediate özelliğini true yaptım. bu şekilde brandChanged metodunu çalıştırdı ama brand nesnesi null olduğu için null pointer exception hatası aldım. Vaktinizi ayırdığınız için teşekkür ederim.

BrandConverter

@FacesConverter("brandConverter")
public class BrandConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value.equals("1")) {
            return new Brand(1, "Audi");
        } else if (value.equals("2")) {
            return new Brand(2, "Opel");
        }
        return new Brand();
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return Integer.toString(((Brand) value).getId());
    }
}
permanent link

cevaplandı: 19 Mar, 18:19

alikurnaz's gravatar image

alikurnaz
51112
cevap kabul oranı: 0%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×281
×41
×2

Soruldu: 16 Mar, 17:34

Görüntüleme: 320 kez

Son güncelleme: 19 Mar, 18:19

powered by BitNami OSQA