JSF: Bei Seitenaufruf eine Methode starten

Millman

Mitglied
Hey Leute,

ich möchte, sobald meine Index-Seite aufgerufen wird eine Methode starten lassen, die wiederum eine Listenvariable in der BackingBean der Index-Seite befüllt, so dass sofort eine DataGrid mit dieser Liste angezeigt werden kann.

Wie schaffe ich das? Über den Konstruktor Index() bekomme ich immer eine Fehlermeldung, weil er scheinbar irgendwie mit meiner EJB nicht klarkommt. Lasse ich die Liste manuell befüllen, indem ich die befüllende Methode auf einen CommandButton lege, funzt alles ohne Probleme.
 

MrWhite

Bekanntes Mitglied
Wüsste nicht, wie das mit der web.xml geht und ob es überhaupt geht, ohne eigene Lifecycle-Listener einzusetzen.

Aber wenn du zusätzlich noch JBoss Seam einsetzt, kannst du das in einer Datei namens pages.xml definieren:

Code:
<action execute="#{aBean.anAction}" />[/xml]
 

internet

Top Contributor
web-xml
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/jsf-config/anwendung.taglib.xml</param-value>
</context-param>




anwendung.taglib.xml
<?xml version="1.0"?>
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">

<namespace>http://anwendung.de</namespace>

<function>
<function-name>nameDerMethode</function-name>
<function-class>
ort deiner Bean (de.anwednung.ui.Bean)
</function-class>

<function-signature>
java.util.List methodeName()
</function-signature>
</function>
</facelet-taglib>


So sollte es gehen
 

MrWhite

Bekanntes Mitglied
web-xml
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/jsf-config/anwendung.taglib.xml</param-value>
</context-param>




anwendung.taglib.xml
<?xml version="1.0"?>
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">

<namespace>http://anwendung.de</namespace>

<function>
<function-name>nameDerMethode</function-name>
<function-class>
ort deiner Bean (de.anwednung.ui.Bean)
</function-class>

<function-signature>
java.util.List methodeName()
</function-signature>
</function>
</facelet-taglib>


So sollte es gehen

Das ist wohl ne klare Themaverfehlung! Hier wird nur eine Funktion definiert, die dann im EL genutzt werden kann. Das wird aber nicht automatisch bei einem Page Request ausgeführt!

Wenn der OP SEAM nicht nutzen will, könnte er noch mittels Javascript und AJAX einen quick & dirty Workaround schaffen.
 

Millman

Mitglied
Gibt es für so etwas denn nicht einen anderen Weg als einen Workaround?

Ich meine, ich möchte auf meiner Startseite ja eigentlich nur eine Liste haben, welche zuvor aus der Datenbank gezogen wird. So etwas gibt es doch heutzutage auf jeder Website.

Aber falls es nur mit einem Workaround mit Ajax und JS geht, wie würde dieser aussehen?
 

Luu

Aktives Mitglied
Richfaces Lösung:

Java:
<body onload="execute();">
....
</body>

<a4j:jsFunction name="execute" action="#{bean.action}" reRender="IDsToRerender" ... />
 

MrWhite

Bekanntes Mitglied
Gibt es für so etwas denn nicht einen anderen Weg als einen Workaround?

Ich meine, ich möchte auf meiner Startseite ja eigentlich nur eine Liste haben, welche zuvor aus der Datenbank gezogen wird. So etwas gibt es doch heutzutage auf jeder Website.

Aber falls es nur mit einem Workaround mit Ajax und JS geht, wie würde dieser aussehen?

JBoss SEAM einsetzen oder einen Phase-Listener schreiben, der entsprechend definierte Aktionen für Page Requestes durchführt. Das ist aber aufwendig.

JBoss Seam hat auch noch die @Create-Annotation um eine Methode beim Erstellen einer Komponenten-Instanz aufzurufen (Wäre für dich unter Umständen auch eine Lösung). JSF ohne SEAM ist echt grausam (mit SEAM auch noch, aber ... naja).
 

JanHH

Top Contributor
Frage mich da wo das eigentliche Problem liegt, oder bin ich einfach zu naiv!? In der jsf-Seite gibts irgendwo <h:datatable value=#{meineBean.liste}">. In meineBean gibts eine getter-Funktion "getList", die die Liste aus der Datenbank liest. Und schon ist die gewünschte Funktionalität da. Wo ist das Problem?

Ansonsten, klarer Fall, seam, @DataModel und Factory-Methoden..
 
B

bananenkasper

Gast
PhaseListener ist jetzt auch nicht das Problem:

Java:
public class QueryPhaseListener implements PhaseListener {
	@Override
	public void beforePhase(PhaseEvent e) {
		// do stuff just before page loads
	}
	@Override
	public PhaseId getPhaseId() {
		return PhaseId.RENDER_RESPONSE;
	}
	@Override
	public void afterPhase(PhaseEvent e) {
	}

in der faces.config:
Code:
<lifecycle>
      <phase-listener>x.y.z.QueryPhaseListener</phase-listener>
   </lifecycle>
 
B

bananenkasper

Gast
Ja, aber implementier da jetzt mal die geforderte Logik rein. Sowas will doch kein Mensch machen. Andere Frameworks haben Module und Handler die man vorschalten kann.

Einen leeren FaceListener zu präsentieren ... tsss, das ist doch trivial.

tsssssssssssssssss, sind wir nicht alle ein bisschen trivial?

Java:
public class QueryPhaseListener implements PhaseListener {
    public static <V> V getManagedObject(String elString, Class<V> c) {
		Application a = context.getApplication();
		V v = c.cast(a.evaluateExpressionGet( FacesContext.getCurrentInstance(), elString, c));
		return v;
	}
    @Override
    public void beforePhase(PhaseEvent e) {
        final SessionBean sBean = getManagedObject("#{sessionBean}",
				SessionBean.class);
		if (sBean == null) {
			log.warn("no sessionBean found!");
			return;
		}
        sBean.setData(/** get data from DB */);
    }
    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }
    @Override
    public void afterPhase(PhaseEvent e) {
    }
}
 
Zuletzt bearbeitet von einem Moderator:

MrWhite

Bekanntes Mitglied
tsssssssssssssssss, sind wir nicht alle ein bisschen trivial?

Java:
public class QueryPhaseListener implements PhaseListener {
    public static <V> V getManagedObject(String elString, Class<V> c) {
		Application a = context.getApplication();
		V v = c.cast(a.evaluateExpressionGet( FacesContext.getCurrentInstance(), elString, c));
		return v;
	}
    @Override
    public void beforePhase(PhaseEvent e) {
        final SessionBean sBean = getManagedObject("#{sessionBean}",
				SessionBean.class);
		if (sBean == null) {
			log.warn("no sessionBean found!");
			return;
		}
        sBean.setData(/** get data from DB */);
    }
    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }
    @Override
    public void afterPhase(PhaseEvent e) {
    }
}

:bloed: Das hat mal wieder null mit der Frage vom OP zu tun, aber na gut.

Manche Menschen...
 

Deadalus

Bekanntes Mitglied
Was zum Teufel macht ihr hier alle?

Problem des Users: Eine Methode soll ausgeführt werden sobald ein User die Web Applikation lädt:

Lösung:

  1. BackingBean bekommt einen Session oder View Scope -> Bean wird erzeugt wenn Nutzer die Seite aufruft.
  2. Methode die ausgeführt werden soll wird mit @PostConstruct annotiert -> Methode wird ausgeführt wenn Bean instanziiert wird!

fertig!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Wie eine Chatprotokoll realisieren? Web Tier 13
jann Servlet Bei jedem Request wird eine neue Session erstellt. Web Tier 6
S JSF Eine XHTML-Datei in zwei andere XHTML integrieren Web Tier 0
V Wie baue ich eine Ajax Webanwendung? Suche Beispielanwendung (UML) eines AJAX Service Web Tier 0
X JSF - eine Liste aller Sessions, Instanzen bzwFacesContexte bekommen? Web Tier 4
M JSP Mit JSP eine SQLite Datenbank editieren? Web Tier 1
P JSF Eine JSF-Applikation in Drupal darstellen - Möglich? Web Tier 5
T JSF Primefaces beim öffnen eines p:dialog wird eine neue View ManagedBean erstellt Web Tier 2
J Was ist denn eine index.jsp seite ? Web Tier 5
M rendered ruft eine Methode auf, andere aber nicht Web Tier 15
M JSP Objekt in eine JavaBean übergeben Web Tier 7
N rich:extendedDataTable hat eine Spalte zuviel Web Tier 4
T Richtige Aussgabe in eine HTML mit JSF Web Tier 2
S Auswahl eine Zeile von einer HTML Tabelle im Servlet Web Tier 4
C Aktualisieren eine Tabelle mit OnetoMany-Beziehuung Web Tier 6
Scorpi41 RequestDispatcher eine anderes Projekt zugreifen Web Tier 8
C GWT: Eine Variable in allen Widgets Web Tier 6
I Eine Bean von einer anderen Bean aufrufen Web Tier 2
L Unter JSP eine XML Datei erstellen Web Tier 3
I Export in eine CSV - Datei und PDF Web Tier 5
2 Pro Action nur eine ActionForm? Web Tier 4
H Gibt es für das message-bundle eine Standard - Ordnung? Web Tier 2
B Bei eine eienen Tag auf einen Parent zugreifen. Web Tier 3
S nur eine Message auf Faceskontext ausgeben Web Tier 2
O eine .do-File als welcome-file im web.xml Web Tier 4
T Was nehmen für eine Datenbankapplikation mit Webinterface Web Tier 5
G Eine Instanz pro Managed Bean? Web Tier 2
F Beim Aufruf von einer JSF Seite eine Methode ausführen Web Tier 9
S Button klick soll Java methode aufrufen Web Tier 2
M JSF JSF: Methode bei versteckt aufrufen & Parameter übergeben Web Tier 6
R get-methode der Managed-Bean wird immer 3 mal ausgeführt Web Tier 4
Joew0815 Spring Handle All Requests Methode Web Tier 1
V Mittels JavaScript Methode aufrufen Web Tier 23
M JSF Button - Methode wird nicht aufgerufen Web Tier 4
K JSF Unified-EL- Methode mit Parameterübergabe Web Tier 9
F NullPointerException auf validator methode Teil2? Web Tier 2
B JSF NullPointerException auf validator methode Web Tier 7
P Mit EL Parameter an Methode übergeben Web Tier 5
I Im PhaseListener Service Methode aufrufen Web Tier 21
J JSF Datatable bestimmte Methode Web Tier 4
I Automatische Weiterleitung JSF mit Aufruf einer Methode Web Tier 2
H JSF - Methode kann nicht aufgerufen werden Web Tier 5
M Body onUnload Java Methode aufrufen Web Tier 13
K bean methode von jslt aufrufen Web Tier 7
D <html:select> bzw. <html:option> - Methode auslösen ? Web Tier 2
D [JSF] Lifecycle Methode wird mehrfach aufgerufen Web Tier 4
F Problem mit der Methode request.getRemotePort() Web Tier 2
D Methode bei Server Startup ausführen Web Tier 2
E Methode einer Bean aus anderer Bean aufrufen Web Tier 10
S JSF: Methode mit Parametern aufrufen Web Tier 7
J Fehler Tomcat/JSP findet Methode nich Web Tier 3
G Mit JSTL Rückgabe von Bean Methode ausgeben Web Tier 3
G in validate methode auf form objekte zugreifen Web Tier 3
A Action-Methode soll Ausgabe auf der Responsepage steuern Web Tier 4

Ähnliche Java Themen

Neue Themen


Oben