JSF history.back in JSF

bolda

Mitglied
Hallo

Dieses Thema wurde schon vielfach besprochen, eine Lösung dazu habe ich jedoch noch nicht gefunden. :-(

Mein Problem sieht folgendermaßen aus:

Ich habe ein Suchformular welches mir Objekte durchsucht, diese werden mir dann als in einer Resultatenseite mittels JSF darstellt. In dieser Resultatenliste kann ich dann die Details anzeigen lassen.

Nun gehe ich auf das Suchformular zurück und suche mir etwas anderes.
Jetzt gibt es scheinbar User die mit history.back auf die letzte Suchresultatenseite zurückgehen um sich Details der letzten Suche anzeigen zu lassen.

Das angezeigte Detail ist jedoch falsch, da diese Liste nicht mehr aktuell ist. Es wird dem User einfach das Detail der aktuellen Resultatenseite angezeigt.

Was habe ich für Möglichkeiten dem User zu sagen, dass er eine veraltete Suchresultatenseite nicht benutzen darf, bzw. ihm das irgendwie verbieten?


Danke für gute Tipps.
 
S

SlaterB

Gast
wieso darf denn nicht mehr ein Detail zu einer früheren Suche angezeigt werden?
entweder es geht noch im Programm, dann gibts keinen Grund für Verbot, oder es gibt einen Fehler, dann daraufhin die Seite mit Hinweis zeigen,
entweder allgemeiner Fehler oder anhand der Anfrage mutmaßen, dass es was mit Suchergebnissen/ Details zu tun hat

(edit: ganz schlecht wäre, wenn der Request nur 'zeige 75. Ergebnis' lautet und dann das 75. Ergebnis der neuen Suche statt der alten Suche angezeigt wird,
Links müssen immer eindeutig sein, also 'zeige Eintrag mit Id 5433'
oder wenigstens 'zeige 75. Ergebnis für Suche 17' wenn denn die Suchen eindeutig einem User zugeordnet sind,
bei Login/Logout zwischendurch wäre Username dazu nicht schlecht, dann wirds aber langsam wirklich aufwendig,
oder die Ids für die Suchen etwas weiter fassen)


------

falls du dennoch genau die Suche erkennen willst, schlage ich allgemein im Aufbau der Sucherergebniss-Liste mit Links auf Details einen zusätzlichen Kontrullfluss-Parameter vor,
je nach Wunsch unterschiedlich kompliziert,
von einfachem "search=5" für 5. Suche (im Server die letzte(n) bekannte(n) Suche(n) für die User-Session archivieren, wenn unbekannt dann Fehler)
über "linkFrom=58948" mit genauer Historie im Server, welcher der nummierten Requests der User-Session welche Seite war,
bis zu "linkFrom=SearchXYPage,requestWas=queryX,parameter:y=z, ..."

beim Aufbau der Originalseite wurden die Parameter für die Links passend gesetzt,
bei Verarbeitung des Request kann genau rekonstruiert werden, was denn das für eine vorherige Seite war,
ob die zuletzt gesendete oder eine frühere in der Historie

ist alles allgemein gedacht, hat weniger mit JSF zu tun, falls es dort spezielles gibt
 
Zuletzt bearbeitet von einem Moderator:

bolda

Mitglied
@slaterB

Dürfen schon, nur geht es leider nicht. Ich habe eine List[Object] und diese wurde bei der neuen Suche überschrieben und somit sind diese nicht mehr verfügbar.

Ich mache das mit einer <h:dataTable> und darin dann
<h:commandLink id="Detail" action="suchResultatDetail" actionListener="#{searchController.searchDetailActionEvent}">
<h:eek:utputText value="#{search.documentTitle}"></h:eek:utputText>
</h:commandLink>

und im ActionListener dann sowas wie:
Java:
public void searchDetailActionEvent(ActionEvent event) throws Exception {
		UIParameter component = (UIParameter) event.getComponent().findComponent("docId");
		Iterator<?> iter = this.getSearchResultList().iterator();
		while (iter.hasNext()) {
			Search search = (Search) iter.next();
			if (search.getId().equals(component.getValue().toString())) {
				DMSDocument myDoc = tool.getConnection().getDocument(search.getObjectStore(), search.getId());
				Search searchFull = new Search();
				searchAndPrepareFull(searchFull, myDoc);
				this.setSearchDetail(searchFull);
			}
		}
	}

@Nao88

Wo, wie und mit was, soll ich das dann vergleichen?
 
S

SlaterB

Gast
siehe auch meinen Edit Zeile 4-10 in erster Antwort

zum neuen:
documentTitle sieht doch relativ gut aus, entweder das wird gefunden oder wenn nicht, dann Fehlermeldung, ist das nicht umsetzbar?
zu den speziellen JSF-Mechanismen kann ich leider nichts beitragen,
notfalls an früherer Stelle der Verabeitung nur prüfen ob Suchergebnis in der Liste vorhanden

oder besteht noch die Gefahr dass ein falsches Ergebnis gefunden und angezeigt wird? documentTitle klingt doch recht eindeutig

> Das angezeigte Detail ist jedoch falsch, da diese Liste nicht mehr aktuell ist. Es wird dem User einfach das Detail der aktuellen Resultatenseite angezeigt.

weil beide gleichen Titel haben? oder ist der Titel eine schlichte Nummerierung der Ergebnisse?
 

bolda

Mitglied
Leider wird mit dem JSF-Gedöns nur die Position des Eintrags gespeichert. Wenn ich also auf einer alten Liste ein Detail ansehen will, sehe ich den Inhalt des Eintrags der aktuellen Abfrage. Die DocId bzw. auch der documentTitle sind schon eindeutig, aber auf diese habe ich irgendwie im ActionEvent keinen Zugriff mehr, sondern eben nur auf die neuen.
Eine Zeile sieht im HTML-Code so aus:
HTML:
<td><a href="#" onclick="return oamSubmitForm('List','List:data:0:Detail');" id="List:data:0:Detail">Dings 1</a></td>
<td><a href="#" onclick="return oamSubmitForm('List','List:data:1:Detail');" id="List:data:1:Detail">Dings 2</a></td>
<td><a href="#" onclick="return oamSubmitForm('List','List:data:2:Detail');" id="List:data:2:Detail">Dings 3</a></td>

Das sieht bei jeder neuen Abfrage gleich aus...
 
K

KlugScheissA

Gast
Ganz einfach: Aufhören unnötig den Session-Context zu verwenden ist ein ganz schlechter Stil!!!! Die Controller sollten standardmäßig nur an die Lebensdauer einer Seite gebunden sein. Seit JSF 2.0 gibt es den ViewScope d.h. beim zurück gehen wird die Seite neugeladen und die alten Daten verworfen... vor jsf 1.2 <t:saveState value="#{}" verwenden...

Damit umgeht man die Nachteile von SessionScope bzw. RequestScope...
 

Oben