T
transdenzentral
Gast
Hallo Leute,
ich habe folgendes KSKB, was die Problematik darstellt. Vielleicht kurze Erklärung, bevor ich das eigentliche Problem schildere.
Setup:
Es gibt im Prinzip zwei Beans:
Dazu noch 2 XHTML Seiten
Die Problematik ist folgende (lässt sich in zwei Fälle aufteilen):
Prinzipiell geht es mir also um den 2.) Fall. Was mach ich falsch? Habe ich einen Denkfehler? Gibt's eine Lösung, sodass das funktioniert, wie ich mir das vorstelle?
Vielen Dank,
transdenzentral
Hier das KSKB:
ich habe folgendes KSKB, was die Problematik darstellt. Vielleicht kurze Erklärung, bevor ich das eigentliche Problem schildere.
Setup:
- Tomcat 7.0
- Primefaces 3.4.1
- Eclipse Juno
- Test Browser: Firefox 16.0.2
Es gibt im Prinzip zwei Beans:
- einmal ein einfacher Login (der eigentlich der Einfachheit halber nichts tut, außer die nächste Seite zurückgeben).
- einmal eine Bean für die Tabelle, die ein paar Dummy Daten initalisiert, ein einfaches Datenmodell enthält und eben einen ausgewählten Datensatz speichern soll.
Dazu noch 2 XHTML Seiten
- index.hxtml: Enthält einfach einen Button, der auf die LoginBean zugreift und auf die table.xhtml weiterleitet.
- table.xhtml: Zeigt eine Tabelle an und soll über das Selektieren eines Datensatzes, diesen in das entsprechende Datenfeld der SomeSampleDataTableBean schreiben. Wenn man auf den darunterliegenden Button klickt, soll auf diesem Wert gearbeitet werden. (Den Fall, dass nichts ausgewählt ist und man trotzdem drauf drückt, sei mal zu vernachlässigen)
Die Problematik ist folgende (lässt sich in zwei Fälle aufteilen):
- Gehe ich direkt über den Browser auf die table.xhtml Seite, so geht das Selektieren einer Tabellenzeile sofort - in diesem Fall klappt alles, wie ich es erwarte.
- Gehe ich indirekt, also zuerst über die index.xhtml Seite (per Button Interaktion), auf die table.xhtml Seite, so wird das erste Selektieren einer Tabellenzeile praktisch "verschluckt" und die Selektion praktisch vom System nicht angenommen. Beim zweiten Selektieren klappt dann alles, wie ich es erwarte.
Prinzipiell geht es mir also um den 2.) Fall. Was mach ich falsch? Habe ich einen Denkfehler? Gibt's eine Lösung, sodass das funktioniert, wie ich mir das vorstelle?
Vielen Dank,
transdenzentral
Hier das KSKB:
Java:
package de.test.beans;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@SuppressWarnings("serial")
@ManagedBean
@SessionScoped
public class SimpleLoginBean implements Serializable {
public SimpleLoginBean() {
}
public String login() {
return "table.xhtml";
}
}
Java:
package de.test.beans;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import de.test.data.SomeSampleData;
import de.test.data.SampleTableDataModel;
@ManagedBean
@SessionScoped
@SuppressWarnings("serial")
public class SomeSampleDataTableBean implements Serializable {
private final SampleTableDataModel dataModel;
private SomeSampleData selectedData;
public SomeSampleDataTableBean() {
// fill with dummy data...
List<SomeSampleData> dummy = new ArrayList<SomeSampleData>();
String[] names = new String[] { "Test 1", "Test 2", "Test 3", };
long a = 0;
for (String name : names) {
SomeSampleData q = new SomeSampleData(a);
q.setName(name);
dummy.add(q);
a++;
}
// end of dummy data...
dataModel = new SampleTableDataModel(dummy);
}
public void showSelected() {
System.out.println("Selected: " + selectedData.getName());
}
public SampleTableDataModel getDataModel() {
return dataModel;
}
public SomeSampleData getSelectedData() {
return selectedData;
}
public void setSelectedData(SomeSampleData selectedData) {
this.selectedData = selectedData;
}
}
Java:
package de.test.data;
import java.util.List;
import javax.faces.model.ListDataModel;
import org.primefaces.model.SelectableDataModel;
public class SampleTableDataModel extends ListDataModel<SomeSampleData> implements
SelectableDataModel<SomeSampleData> {
public SampleTableDataModel(List<SomeSampleData> data) {
super(data);
}
@Override
@SuppressWarnings("unchecked")
public SomeSampleData getRowData(String rowKey) {
List<SomeSampleData> data = (List<SomeSampleData>) getWrappedData();
for (SomeSampleData object : data) {
if (object.getId().equals(Long.parseLong(rowKey))) {
return object;
}
}
return null;
}
@Override
public Object getRowKey(SomeSampleData data) {
return data.getId();
}
}
Java:
package de.test.data;
import java.io.Serializable;
@SuppressWarnings("serial")
public class SomeSampleData implements Serializable{
private String name;
private Long id;
public SomeSampleData(long id) {
super();
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Questionnaire [name=" + name + "]";
}
public Long getId() {
return id;
}
}
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
<h:form id="login">
<p:commandButton id="loginButton" value="Login" action="#{simpleLoginBean.login()}"></p:commandButton>
</h:form>
</h:body>
</html>
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
<h:form id="test">
<p:dataTable id="sample" var="data"
value="#{someSampleDataTableBean.dataModel}"
selection="#{someSampleDataTableBean.selectedData}"
selectionMode="single">
<f:facet name="testdata"></f:facet>
<p:ajax event="rowSelect" update="@form" />
<p:column>#{data.name}</p:column>
</p:dataTable>
</h:form>
<h:form id="testButton">
<p:commandButton id="command"
action="#{someSampleDataTableBean.showSelected()}" value="Test"></p:commandButton>
</h:form>
</h:body>
</html>
Zuletzt bearbeitet von einem Moderator: