Anonymní profil Michal – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Michal – Programujte.comAnonymní profil Michal – Programujte.com

 

Příspěvky odeslané z IP adresy 89.103.35.–

Michal
HTML / XHTML › JSF inputText in dataTable
18. 7. 2008   #79911

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ě :)

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý