# Funktionen und Variablen aus Facelet heraus ansprechen



## sataan (23. Nov 2010)

moin ^^

erstmal vorneweg, ich habe die befürchtung (/hoffnung ^^) dass es sich entweder um einen blöden fehler von mir oder ein grundsätzliches verständnisproblem mit javaEE handelt, ich versuche mich grade etwas reinzuarbeiten
also seid bitte nachsichtig falls die frage blöd erscheint ^^ ich bin schon seit tagen am rumbasteln / rumprobieren damit 

das problem ist folgendes: ich habe ein Facelet (index.xhtml) und ein ManagedBean dass sich um die Session bzw die Datenbank kümmern soll, u.a. auch um login und logout auf der seite

login funktioniert über ein primefaces forumlar und den entsprechenden beispielcode ganz gut, mit dem logout habe ich allerdings ein paar probleme:

momentan habe ich es folgendermaßen:

in der index.xhtml:

```
<p:menuitem value="Logout" helpText="Logout"  icon="/images/system-log-out.png" url="javascript:window.location.reload()"  style="z-index:200; color:white;" onclick="#{loginBean.logout}"/>
```
(in einem primefaces element, hat den gleichen effekt wenn ich es in einen normalen link setze)

in der loginBean.java:

```
@ManagedBean (name="loginBean")
@SessionScoped
public class LoginBean {
    private HttpSession session; // = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);

    public LoginBean(){
        session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        if (session == null) session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
            if (session.getAttribute("loggedin") == null) setLoggedin(false);
            if (session.getAttribute("loggedin").equals("true")) setLoggedin(true);
    }
...
...
...
    private boolean logout;
    public boolean getLogout(){
        setLoggedin(false);
        return false;
    }
```

damit habe ich jetzt die folgenden Probleme:


 die Logout-Funktion wird beim laden / aktualisieren der Seite aufgerufen
 sie wird nicht aufgerufen wenn ich auf den link klicke
 das aufrufen der Funktion über nen missbrauchten getter erscheint mir falsch, (bzw ich hoffe dass es besser geht ^^), ich habe es allerdings noch nicht hinbekommen eine funktion so zu definieren dass sie aus dem facelet heraus aufrufbar ist
 die art und weise wie die verfügbaren Funktionen erkannt werden ist mir unklar, ich habe z.b. auch eine Funktion getAdministrator() (ohne entsprechende variable), die wird erkannt - ebenso isAdministrator(), getLogout wird nicht erkannt wenn die variable fehlt oder getLogou() einen anderen Rückgabetyp besitzt - ich sehe da irgendwie nicht wirklich durch bzw konnte auch nicht viel zu dem thema finden

falls jemand von euch einen Tipp zu den Problem-punkten oder den einen oder anderen nützlichen Link hat wäre ich dankbar ^^

lg, sataan


----------



## gman (23. Nov 2010)

> die Logout-Funktion wird beim laden / aktualisieren der Seite aufgerufen



Welche Logout-Funktion? Ich sehe nur den Konstruktor und einen Getter für eine Boolean-Variable.



> die art und weise wie die verfügbaren Funktionen erkannt werden ist mir unklar




```
public String <methodenname>() {
    // hier kommt der Code der Methode rein
    // und danach wird die gewünschte "Folgeseite" aufgerufen
    return "seite.xhtml";
}
```

Solcher Code müsste aber in jedem JSF-Tutorial drinstehen (zb. hier).


----------



## sataan (24. Nov 2010)

wie gesagt, ich hab die logout funktion aus nem zweckendfremdeten getter heraus aufgerufen weil das das einzige war was mir eingefallen ist, was zumindest erstmal so aussah als würde es funktionieren ^^ ( "setLoggedin(false);" , die funktion setzt dann nen wert in der session)

die funktion die du geschrieben hast, hab ich etliche male in verschiedenen ausführungen (mit / ohne rückgabewert, mit bool, string, int, sonstwas probiert - aus der xhtml meldet mir netbeans dass ers nicht findet => ich kanns weder erstellen noch deployen)

könnte eventuell mein netbeans 'defekt' sein / eine neuinstallation helfen?

falls es hilft lad ich morgen mal die projektdaten hoch

danke auf jeden fall für eure hilfe ^^


----------



## gman (24. Nov 2010)

> könnte eventuell mein netbeans 'defekt' sein / eine neuinstallation helfen?



Wohl eher nicht. Allenfalls ist mit der Konfiguration von deinem Projekt irgendwas nicht in Ordnung.



> falls es hilft lad ich morgen mal die projektdaten hoch



Ist eine gute Idee.


----------



## sataan (25. Nov 2010)

Hier mal der Code von index.xhtml und der dazugehörigen Java-Klasse

(das komplette projekt lad ich grad hoch, sind ~ 7mb - http://sataan1337.dyndns.org/stud/WebApps.zip, sollte in ~10 minuten verfügbar sein ^^

wie gesagt, das ist beim rumprobieren entstanden und dementsprechend schlecht geschrieben ^^


----------



## gman (25. Nov 2010)

> ein grundsätzliches verständnisproblem mit javaEE handelt



Vor allem was "SessionScoped" angeht. Wieso speicherst du mühsam selbst Sachen in der Session?
Schau dir am besten einmal das Tutorial an (oder irgendein anderes), und erstelle auch solche
"Bastelprojekte" am besten so als wäre es etwas wichtiges (damit meine ich auch solche Kleinigkeiten
wie deine Package-Bezeichnungen).

Und noch einmal: der Code enthält keine "logout"-Funktion. 


```
public String doLogout() {
        logout = true;
        
        return "index.xhtml";
    }
```

Aufruf:

[c]<p:menuitem value="Logout" helpText="Logout" icon="/images/system-log-out.png" url="javascript:window.location.reload()"  style="z-index:200; color:white;" onclick="#{loginBean.doLogout}"/>[/c]

Probier das mal aus, ich habs nicht getestet da mir die DB fehlt.


----------



## sataan (25. Nov 2010)

also, das problem scheint sich erstmal gelöst zu haben, obwohl ich nicht genau sagen kann warum ^^

netbeans zeigt mir jetzt die verfügbaren funktionen mit an, und beschwert sich auch nicht (mehr) darüber dass er sie nicht finden würde ^^

es lag wohl daran dass die funktionen aus manchen primefaces elementen heraus nicht verfügbar sind (ich hatte tatsähclich gehofft action wäre gleich action und onclick gleich onclick ^^)

was mich allerdings nach wie vor etwas verwirrt ist die art und weise wie die verfügbaren Funktionen erkannt / benannt werden

z.b. eine Funktion isAdministrator oder getAdministrator wird mir aus dem facelet heraus nur als "administrator" angezeigt, habe ich beide funktionen bietet er mir zweimal administrator an und ich weiss nichtmehr was das programm jetzt überhaupt damit macht ^^ - andere funktionen werden mir manchmal angezeigt, manchmal nicht, manchmal sogar unter dem namen den ich ihnen gegeben habe

kurzgesagt, ich bin ziemlich verwirrt ^^

ps: welches tutorial meinst du? - bzw dass die session unnötig ist hab ich heute auch bemerkt ^^, das problem ist dass in vielen (allen die ich gesehen hab) tutorials auf die annotationen kaum bis garnicht  eingegangen wird ^^

lg


----------



## gman (26. Nov 2010)

> eine Funktion isAdministrator oder getAdministrator wird mir aus dem facelet heraus nur als "administrator" angezeigt



"isAdministrator" und "getAdministrator" sind auch nur Getter-Methoden für die Instanzvariable "administrator". Netbeans
ist so schlau und merkt das, daher zeigt es dir direkt "administrator" an. Zur besseren Unterscheidung kann man die
"richtigen" Methoden mit dem Prefix "do" ausstatten, zB. "doLogout". 



> ps: welches tutorial meinst du?



Sorry, hab vergessen den Link zu setzen:

http://jsfatwork.irian.at/semistatic/introduction.html

Oder direkt vom Hersteller:

- The Java EE 5 Tutorial

Oder die aktuelle Version vom Hersteller:

- The Java EE 6 Tutorial


----------



## sataan (26. Nov 2010)

gman hat gesagt.:


> "isAdministrator" und "getAdministrator" sind auch nur Getter-Methoden für die Instanzvariable "administrator". Netbeans
> ist so schlau und merkt das, daher zeigt es dir direkt "administrator"



ob das gut oder schlecht ist sei mal dahingestellt, anfangs ist es auf jeden fall ziemlich irritierend ^^

bzw danke für die links, ich werd mich da mal etwas reinlesen ^^

*edit: der erste link sieht genau nach dem aus was ich ewig gesucht habe, danke nochmal ^^


----------

