2

この件についてよく検索しましたが、問題を解決するのに役立つ解決策が見つかりませんでした。selectOneMenu の selectItems と outputText (selectOneMenu と同じ Bean を使用) として配置される "Kategorie" オブジェクトのリストで構成されるフォームがあります。コンバーターが仕事をし、すべてのカテゴリ名が正しく表示されます。ajax タグを使用すると、フォームは selectOneMenu onchange の値を変更します。これも機能し、bean-property が更新されます! しかし今、選択したカテゴリを変更直後に outputText に表示したいと考えています。私は何をしなければなりませんか?

outputText の新しい値を確認するには、ページを更新する必要があります。(CategoryBean は SessionScoped)

outputText-value の getter は、Bean のカテゴリ プロパティが更新される前に常に呼び出されます。

ビュー.xhtml:

    <h:form>
        Wähle eine Kategorie:
        <h:selectOneMenu 
                            value="#{kategorieBean.kategorie}">
            <f:selectItem
                            itemLabel="Wählen..."
                            itemValue="#{null}"/>
            <f:selectItems 
                            value="#{kategorieBean.allKategories}"
                            var="k" 
                            itemLabel="#{k.name}"
                            itemValue="#{k}" />     
            <f:ajax 
                            event="change"
                            execute="@form"
                            render="result"
                            listener="#{kategorieBean.kategorieChangeListener}"/>
        </h:selectOneMenu>
        Ausgewählte Kategorie:      
        <h:outputText id="result" value="#{kategorieBean.kategorie.name}" />
    </h:form>

また、ajax-tag で Listener を使用しようとしました。リスナーは機能しましたが、まだ実行順序に問題がありました:(

カテゴリーBean:

package xxx.bean;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import xxx.hibernate.entity.Kategorie;
import xxx.hibernate.dao.KategorieDao;

@ManagedBean(name="kategorieBean")
@SessionScoped
public class KategorieBean{

private Kategorie kategorie;
private KategorieDao kategorieDao;
private List<Kategorie> allKategories;

@PostConstruct
public void init(){
    kategorie = null;
    kategorieDao = new KategorieDao();
    allKategories = kategorieDao.getAllKategories();
}

public List<Kategorie> getAllKategories() {
    return allKategories;
}
public void setAllKategories(List<Kategorie> allKategories) {
    this.allKategories = allKategories;
}

public Kategorie getKategorie() {
    if (kategorie != null)
        System.out.println("getter kategorie: name=" + kategorie.getName());
    else
        System.out.println("getter kategorie: kategorie=null");
    return kategorie;
}
public void setKategorie(Kategorie kategorie) {
    System.out.println("setter kategorie: name=" + kategorie.getName());
    this.kategorie = kategorie;
}
    public void kategorieChangeListener(AjaxBehaviorEvent e) {
        System.out.println("kategoriename: " + kategorie.getName());
    }

カテゴリコンバーター:

package xxx.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import xxx.bean.KategorieBean;
import xxx.hibernate.entity.Kategorie;

@FacesConverter(forClass = Kategorie.class)
public class KategorieConverter implements Converter{

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        System.out.println("Converter: getAsObject");
        KategorieBean kB = (KategorieBean) FacesContext.getCurrentInstance().
                getExternalContext().getSessionMap().get("kategorieBean");
        for (Kategorie k : kB.getAllKategories()){
            if (k.getKategorieId() == Long.valueOf(value))
                return k;
        }
        return null;
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        System.out.println("Converter: getAsString");
        return String.valueOf(((Kategorie) value).getKategorieId());
    }
}

コンソール出力 (初期):

  • Hibernate: this_.kategorie_id を kategori1_1_0_ として、this_.beschreibung を beschrei2_1_0_ として、this_.liferay_company_id を liferay3_1_0_ として、this_.liferay_group_id を liferay4_1_0_ として、this_.name を name5_1_0_ として、this_.parent_id を parent6_1_0_ として usushop_kategorie this_ から選択します。
  • ゲッター カテゴリ: kategorie=null
  • コンバーター: getAsString
  • コンバーター: getAsString
  • コンバーター: getAsString
  • コンバーター: getAsString
  • コンバーター: getAsString
  • コンバーター: getAsString
  • ゲッター カテゴリ: kategorie=null

selectOneMenu の値が変更された後のコンソール出力:

  • コンバーター: getAsObject
  • ゲッター カテゴリ: kategorie=null
  • セッターカテゴリ: name=Kategorie4
  • カテゴリ名: カテゴリ4
  • getter カテゴリ: name=Kategorie4
4

1 に答える 1