JSF Formular in Accordion Panel

Todo

Aktives Mitglied
Hi,

da ich mittlerweile zwei Tage dran sitze und ich immer noch nicht weiter komme, bitte ich euch mal um Hilfe.

Schreibe gerade eine Webanwendung, wo der Admin Accounts erstellen kann und ändern kann.
Das erstellen ist auch kein Problem, leider hampel ich extrem lange bei dem bearbeiten rum.

Arbeite mit Apache Tomcat 7, JSF mit Primefaces 3.3.1 und EclipseLink.

Ich liste die Accounts folgendermaßen auf:
Java:
<h:form id="form">
            <p:accordionPanel value="#{accountMB.allAccounts}" var="account">
                <p:tab title="Kundennummer: #{account.kundennummer}">

                    <p:panelGrid id="confirmation">
                        <p:row>
                            <p:column><h:outputText value="Kundennummer:" /></p:column>
                            <p:column><h:outputText styleClass="outputLabel" value="#{account.kundennummer}" /></p:column>
                        </p:row>

                        <p:row>
                            <p:column colspan="6" style="font-weight: bolder;">Addresse</p:column>
                        </p:row>
                        <p:row>
                            <p:column><h:outputText value="Strasse u. Nr.: " /></p:column>
                            <p:column><p:inputText styleClass="outputLabel"
                                                   value="#{account.strasse}" /></p:column>

                            <p:column><h:outputText value="Postleitzahl:" /></p:column>
                            <p:column><p:inputText styleClass="outputLabel"
                                                   value="#{account.postleitzahl}" /></p:column>

                            <p:column><h:outputText value="Ort:" /></p:column>
                            <p:column><p:inputText styleClass="outputLabel"
                                                   value="#{account.ort}" /></p:column>
                        </p:row>
                    </p:panelGrid>

                    <p:commandButton  value="Account &auml;ndern" update=":form" action="#{accountMB.change}">
                        <f:param name="action" value="#{account}" />
                    </p:commandButton> 
                </p:tab>
            </p:accordionPanel>
        </h:form>

Die Accounts werden über die ManagedBean über eine DAO geladen und als Collection zurück gegeben. So weit auch kein Problem. Wenn man jetzt einen Account bearbeitet, soll der bearbeitet Account wieder in die ManagedBean zurück damit ich diesen in die DB schreiben kann. Leider ist er immer unbearbeitet. Das wird wohl an Ajax liegen, jedoch auch wenn ich dem CommandButton als Ajax="false" deklariere ist es immer noch der alte. Da es ein Iterator ist, denke ich mal das ich diesen irgendwie updaten muss leider weiß ich absolut nicht wie. Vielen Dank für eure Hilfe.
 

Templarthelast

Bekanntes Mitglied
List implementiert Collection und hat einen Iterator. Es ist ja kein Hexenwerk aus einer Collection eine List zu machen und ich würde es einfach mal probieren.
 

JimPanse

Bekanntes Mitglied
das process-Attribute ist nicht definiert - so sollte funktionieren

Java:
<h:form id="form">
            <p:accordionPanel value="#{accountMB.allAccounts}" var="account">
                <p:tab title="Kundennummer: #{account.kundennummer}">
                    <p:panelGrid id="#{account.kundennummer}">
             ....
                    </p:panelGrid>
 
                    <p:commandButton  value="Account &auml;ndern" 
                                                 process="@this #{account.kundennummer}" 
                                                 update="#{account.kundennummer}" >
                        <f:param name="action" value="#{account}" /> 
                    </p:commandButton> 
                </p:tab>
            </p:accordionPanel>
        </h:form>
 

Todo

Aktives Mitglied
Bekomme immer die Meldung leere IDs sind nicht erlaubt, was auch logisch ist, obwohl die Liste nur Accounts mit Kundennummer enthält. Wenn ich statisch was rein setze als id für das Panelgrid funktioniert es jedoch auch nicht. Sorry leider Anfänger....
 

Todo

Aktives Mitglied
No Chance geht leider auch nicht....

So weit ich es nachvollziehen kann...:

Ich ändere die Parameter des Objektes in der View.
Da ich aber das Objekt als Parameter übertrage bleibt immer das alte Objekt drin, da es beim Aufbau der View das Objekt schon feststeht und dieses auch nicht mehr geändert wird kann das?
 

JimPanse

Bekanntes Mitglied
Du kannst aber kein Objekt als Request-Parameter übertragen:noe:

-> 4 ways to pass parameter from JSF page to backing bean


Wenn dann, entweder mit der EL 2.2 oder <f:setPropertyActionListener/>

[XML]
<p:commandButton value="Account &auml;ndern"
action="#{myBean.saveOrUpdate(account)}"
process="@form"
update="@form" >

</p:commandButton>
[/XML]


Java:
@SessionScope
public class MyBean{

public void savrOrUpdate(Account account){
 // tue was
}

}
 

Nogothrim

Aktives Mitglied
finde das mit der Collection irgendwie sehr umständlich und verstehe auch nicht wirklich was da schief läuft. Zu den vorherigen Versuchen: Die "update" und "process" Attribute verarbeiten html IDs oder deklarativ Dinge wie @this oder @form, aber keine Properties ;) Bei einem Button mit process="@this", würde der Button alles was um ihn herum geschieht ignorieren.
Was spricht denn gegen eine Zwischenvariable in der ManagedBean mit dem aktuellen Datensatz?
Z.B. so:
[XML]
<p:commandButton action="#{accountMB.change}" value="Change" update="@form">
<f:setPropertyActionListener target="#{accountMB.selected}" value="#{account}" />
</p:commandButton
[/XML]
 

Todo

Aktives Mitglied
@JimPanse

du hast natürlich recht das man das nicht als Requestparameter übertragen kann, meinte auch als Attribute sorry

Habe auch gelesen das man mittlerweile die Aktion mit Parameter übertragen kann und hatte es auch schon ausprobiert, das mit dem von Nogothrim sieht auch total gut aus, kannte ich auch noch nicht.

Leider beide die gleichen Effekte:
Es ist und bleibt der Account, wie er vorher in der Collection ist, also er wurde nicht geändert.

[Edit]
Meine Bean läuft über ViewScoped, sollte aber eigentlich reichen oder sehe ich das falsch?
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben