0

PrimeFaces でピックリストを作成しました。コマンドボタンをクリックすると、ターゲットリストにリストされている選択されたアイテムを処理したいと思います。

コントローラーを介してデータを渡し、データベースに保存したいと考えています。しかし、関数 duallist.getTarget() を呼び出すたびに、それは空です。

ターゲット リスト内のすべての項目を選択する foreach-Loop を作成しました。

コントローラー (Bean):

private List<DTOAktivitaet> source = new ArrayList<DTOAktivitaet>();
private List<DTOAktivitaet> target = new ArrayList<DTOAktivitaet>();

private List<DTOAktivitaet> zwischen = new ArrayList<DTOAktivitaet>();

public void speicherAktiZug() {

    DTOAktivitaet aktivitaet_vorgaenger = null;

    for (DTOAktivitaet item : controller.getAktivitaeten()) {
        if (item.toString().equals(selected)) {
            aktivitaet_vorgaenger = item;
        }
    }

    for (DTOAktivitaet aktivitaet : zwischen) {
        try {
            dao.aktiZugAkt(aktivitaet_vorgaenger, aktivitaet);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

public AktiListController() {
    for (DTOAktivitaet ak : controller.getAktivitaeten()) {
        source.add(ak);
    }
    aktis = new DualListModel<DTOAktivitaet>(source, target);
    zwischen = aktis.getTarget();
}

JSF:

        <h:form id="form" name="formular">
                <h:outputText id="aktivitaet"
                                value="#{aktiListController.selected}" />


                <p:pickList id="pickList" value="#{aktiListController.aktis}"
                    var="aktivitaet" itemValue="#{aktivitaet}"
                    itemLabel="#{aktivitaet}" converter="aktivitaetsConverter"
                    showSourceControls="true" showTargetControls="true" />
                <h:commandButton
                    action="#{aktiListController.speicherAktiZug}"
                    value="Aktivität-Abhängigkeit anlegen" class="commandButton">
                </h:commandButton>
            </h:form>

コンバータ:

@EJB
public class AktiListConverter implements Converter {

private InitialisierungController controller = InitialisierungController
        .getInstance();
DTOAktivitaet aktivitaet = new DTOAktivitaet();
String name = "";

@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {

    for (DTOAktivitaet item : controller.getAktivitaeten()) {
        if (item.toString().equalsIgnoreCase(arg2)) {
            this.aktivitaet = item;
            System.out.println(aktivitaet);
            return aktivitaet;
        }

    }

    return null;

}

@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {

    this.aktivitaet = (DTOAktivitaet) arg2;

    return this.name = aktivitaet.getTeambezeichnung();

}
}

私の問題:アイテムをデータベースに保存する前に、ターゲット リストが空です。

4

2 に答える 2

1

あなたのコードは英語で書かれていないため、完全には理解できませんが、私が見る限り、あなたのコンバーターはひどく書かれています。私が見る限り、あなたは基本的にatoString()と aをやっています。fromString()これは非常にエラーが発生しやすく、パフォーマンスが高くなります。一意の ID (ビジネスまたはデータベース) を使用することをお勧めします。

例:

@FacesConverter(value = "aktiListConverter")
public class AktiListConverter implements Converter
{
    private InitialisierungController controller = InitialisierungController.getInstance();

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2)
    {
        //Get object by it's unique ID
        return controller.getById(Long.parseLong(arg2));
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2)
    {
        //Return object's unique ID
        return ((DTOAktivitaet) arg2).getId();
    }
}

オブジェクトを itemLabel ( を実行するtoString()) として使用する代わりに、人のような素敵なラベルを生成するものを使用しますgetName()

itemLabel="#{aktivitaet.nameOrSomething}"

このspeicherAktiZug()方法は私にはあまり意味がないので、ここまで来ました:

public class AktiListController
{
    private List<DTOAktivitaet> source;
    private List<DTOAktivitaet> target = new ArrayList<DTOAktivitaet>();
    private DualListModel<DTOAktivitaet> aktis;

    public AktiListController()
    {
        source = controller.getAktivitaeten();
        aktis = new DualListModel<DTOAktivitaet>(source, target);
    }

    //Getters and setters

    public void speicherAktiZug()
    {
        target = aktis.getTarget();

        //target should contain the picked items here.
    }
}

あなたも使っているようですが、aktiListController.selected何に使われているのかわかりません。

于 2012-08-22T12:29:19.553 に答える