Vím že to asi patří jinam, ale už jsem zoufalý:
Pokouším se vytvořit tabulku položek z databáze. U každé z nich mám tlačítko smazat. Jakým způsobem nejlépe předat backing beaně id položky, ke které se akce vztahuje? Tohle jsem vyřešil, ale zajímalo by mě, jak byste to řešili vy.
Na co ale nemůžu přijít:
U každé položky mám taky inputbox a tlačítko update. Inputbox mám pomocí valuebindingu vázaný na hodnoty vlastností jednotlivých položek. Chtěl bych aby po úpravě inputboxu a kliknutí na tlačítko update se nová hodnota uložila do databáze.
Tak jak to mám to funguje pouze u posledního řádku v tabulce. K zavolání update metody dojde vždycky, ale u jiného než posledního řádku nedojde k aktualizaci vázané hodnoty v beaně, dokonce ani k volání valuechangelisteneru. Čím to může být?
Pokud byste mi někdo chtěl vysvětlit, jak funguje valuebinding (např. při vázání více polí na jednu proměnnou) budu rád.
Děkuji!
Můj kód:
<h:dataTable var="hudebnik" value="Bean.hudebnici">
<h:column>
<h:form>
<h:inputText valueChangeListener="#{hudebnik.change}" value="#{hudebnik.vstup}"/>
<h:commandButton value="pridat" action="#{hudebnik.pridej}"/>
</h:form>
</h:column>
</h:dataTable>
public class Hudebnik {
private String vstup;
public void change(ValueChangeEvent event) {...}
public void pridej() {...}
[gettery a settery]
}
úplný kód:
<h:dataTable cellpadding="3" rowClasses="lichy,sudy" var="hudebnik" value="#{HudebnikBean.hudebnici}">
<h:column>
<f:facet name="header"><h:outputText value="id"/></f:facet>
<h:outputText value="#{hudebnik.id}"/>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="jméno"/></f:facet>
<h:outputText value="#{hudebnik.jmeno}"/>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="příjmení"/></f:facet>
<h:outputText value="#{hudebnik.prijmeni}"/>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="kapely"/></f:facet>
<h:dataTable var="kapela" value="#{hudebnik.kapely}">
<h:column>
<h:outputText value="#{kapela.jmeno}"/>
</h:column>
</h:dataTable>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="kapely"/></f:facet>
<h:form>
<h:inputText valueChangeListener="#{hudebnik.value}" value="#{hudebnik.vstup}"/>
<h:commandButton value="přidat" action="#{hudebnik.pridejHudebnika}"/>
</h:form>
</h:column>
</h:dataTable>
HudebnikBean.java
public class HudebnikBean {
@EJB
public HudebnikManagerLocal hudebnikManager;
public HudebnikBean() {
}
public Collection<TableRow> getHudebnici() {
Collection<TableRow> tabulka = new ArrayList<TableRow>();
for (HudebnikEntity hudebnik : hudebnikManager.vratHudebniky())
tabulka.add(new TableRow(hudebnik));
return tabulka;
}
}
[/bold]
public class TableRow {
private Long id;
private String jmeno;
private String prijmeni;
private String vstup;
public void pridejHudebnika() {
System.out.println(id + " " + vstup);
}
public String smazHudebnika() {
return "obnovZobrazeni";
}
public void value(ValueChangeEvent event) {
System.out.println("AHOJ"); // debug info
}
public TableRow() {
super();
}
public TableRow(HudebnikEntity hudebnik) {
super();
this.id = hudebnik.getId();
this.jmeno = hudebnik.getJmeno();
this.prijmeni = hudebnik.getPrijmeni();
this.kapely = hudebnik.getKapely();
this.vstup = new String("Původní text");
}
public Long getId() {
System.out.println("id get " + id); // debug info
return id;
}
public void setId(Long id) {
System.out.println("id set " + id); // debug info
this.id = id;
}
public String getJmeno() {
return jmeno;
}
public void setJmeno(String jmeno) {
this.jmeno = jmeno;
}
public String getPrijmeni() {
return prijmeni;
}
public void setPrijmeni(String prijmeni) {
this.prijmeni = prijmeni;
}
public String getVstup() {
System.out.println("vstup get " + id); // debug info
return vstup;
}
public void setVstup(String vstup) {
System.out.println("vstup set " + id); // debug info
this.vstup = vstup;
}
}
[bold]výpis při prvním načtení stránky
id get 854
vstup get 854
id get 1102
vstup get 1102
id get 1103
vstup get 1103
id get 1152
vstup get 1152
výpis při změně některé z prvních položek a kliknutí na odpovídající tlačítko
854 Původní text
id get 854
vstup get 854
id get 1102
vstup get 1102
id get 1103
vstup get 1103
id get 1152
vstup get 1152
výpis při změně některé z poslední položky a kliknutí na poslední tlačítko
vstup get 1152
AHOJ
vstup set 1152
1152 Nově zadaný text
id get 854
vstup get 854
id get 1102
vstup get 1102
id get 1103
vstup get 1103
id get 1152
vstup get 1152
Je mi jasné, že jelikož nastavuju jméno v konstruktoru na "Původní text", pokaždé se zobrazí ten ůvodní ve všech kolonkách. To je ale pouze pro DEBUG. Jde o to, že kromě poslední kolonky se nevolá setter ani valueChangeListener.
Jak to?
Už si vážně začínám myslet že to je bug v mé implementaci JSF.
Díky každému kdo si to aspoň přečtě :)