Verständnisfrage zum Defaultcontext (JSF)

2AndAHalfBit

Aktives Mitglied
Guten abend,

ich habe eine Verständnisfrage zum Defaultcontext in JSF. Und zwar beziehe ich mich auf folgendes Tutorial, welches bestimmt einige von euch kennen: JSF 2.0 Tutorial (JavaServer Faces 2 Tutorial) with Eclipse

Wenn ich es richtig verstanden habe, sollte - sofern nix anderes Konfiguriert - als ManagedBean eine Default Naming convention verwendet werden - Klassenname mit kleinem Anfangsbuchstaben ohne Package. Meine Erwartung wäre also dass in der folgenden Webanwendung auf der Webseite der Text "Hello Welt" erscheint - tut es aber nicht.

Kann mir jemand sagen warum?

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.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">
<h:head>
	<title> Example Page</title>
</h:head>

<h:body>
	 <h:outputText value="#{paladiumBean.message}" />
</h:body>
</html>

faces-config.xml
[XML]
<?xml version="1.0"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
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-facesconfig_2_0.xsd"/>
[/XML]

web.xml
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<context-param>
<param-name>javax.faces.PROJECT_STATE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>home.xhtml</welcome-file>
</welcome-file-list>
</web-app>
[/XML]

Managed Bean:
Java:
import javax.faces.bean.ManagedBean;

@ManagedBean
public class PaladiumBean {
	
	private String message;
	
	
	public PaladiumBean()
	{
		message = "Hello world";
	}


	public String getMessage() {
		return message;
	}


	public void setMessage(String message) {
		this.message = message;
	}
}

Danke für eure Hilfe!
 

Templarthelast

Bekanntes Mitglied
Du renderst laut web.xml JSF nur mit Datein, die auf .jsf enden. Änder mal
Code:
 <url-pattern>*.jsf</url-pattern>
in
Code:
 <url-pattern>/faces/</url-pattern>
und rufe dann mal deine Datei unter /faces/home.xhtml auf.
 

2AndAHalfBit

Aktives Mitglied
Hi,

das ändert leider nichts (ich rufe ausser das ich nun die xhtml aufrufen muss anstatt der jsf.

Übrigens: Die Webseite ist eine home.xhtml seite - trägt nicht die Erweiterung jsf.

So wie ich den Konfigurationseintrag verstanden habe, sorgt er dafür, das du mit *.jsf die Seiten im Browser aufrufen kannst, auch wenn die "reale Datei" die Endung .xhtml hat.

Hinweis2: Wenn ich fix einen Text ausgebe, wird der Tag auch gerendert.
Es wird nur keine Instanz meiner ManagedBean erstellt...

//update leicht abgeänderte home.xhtml (wieder mit mapping auf *.jsf):

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.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">
<h:head>
	<title> Example Page</title>
</h:head>

<h:body>
	 <h:outputText value="some text" />
	 <br/>
	 <h:outputText value="#{paladiumBean.message}" />
</h:body>
</html>

some text wird ausgegebnen, das Property message aber nicht.
Und wie gesagt: Es wird keine Instanz meiner ManagedBean erzeugt. Also zumindest wird der Konstruktor nicht aufrufen (Ich habe einen Breakpoint gesetzt und eclipse wechselt nicht in den Debugmode)...
 
Zuletzt bearbeitet:

F.S.WhiTeY

Bekanntes Mitglied
Ist ja auch ganz logisch, deine Bean hat ja auch keinen Scope.

Der Default Scope ist None und None bedeutet in einer JSF-Page nicht sichtbar.

Mach mal folgendes:

Java:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped; 
@ManagedBean
@RequestScoped
public class PaladiumBean {

Edit:

habe den Import noch mal erweitert.
 
Zuletzt bearbeitet:

2AndAHalfBit

Aktives Mitglied
Hi,

nope, funktioniert immer noch nicht.
Aber danke für den Hinweis, ist gut zu wissen, das None der Defaultwert ist.
Den import brauche ich nicht, das macht eclipse ja selbst...


Neue Bean:

Java:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;


@ManagedBean
@RequestScoped
public class PaladiumBean {
	
	private String message;
	
	
	public PaladiumBean()
	{
		message = "Hello world";
	}


	public String getMessage() {
		return message;
	}


	public void setMessage(String message) {
		this.message = message;
	}
}

neue faces-config.xml:

[XML]
<?xml version="1.0"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
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-facesconfig_2_0.xsd">
<!--
<managed-bean>
<managed-bean-name>paladiumBean</managed-bean-name>
<managed-bean-class>PaladiumBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
-->
</faces-config>

[/XML]

Rest unverändert.
Wenn ich die Bean explizit angebe (siehe auskommentierten Teil in faces-config.xml) funktionierts. Wenn ich auskommentiere, funktioniert es nicht mehr. Hat jemand eine Idee, warum?

BTW: Vielleicht hilft es ja. Nur reproduzierbar, wenn ich jedesmal das Tomcat Workingdirectory cleane. Ansonsten gibt es keine Änderung.

Viele Grüße.
 

Fant

Bekanntes Mitglied
Liegt die Bean tatsächlich im default-Package? Da gehört eigentlich nix hin...

Was meinst du mit "Eclipse macht die imports selbst"? Hast du bei dir vielleicht die falschen imports und nur hier zufällig die richtigen zusammenkopiert? In javax.enterprise.context gibt es nämlich z.B. auch noch die ganzen ***Scoped-Klassen.
 

F.S.WhiTeY

Bekanntes Mitglied
In javax.enterprise.context gibt es nämlich z.B. auch noch die ganzen ***Scoped-Klassen.

Richtig und das sorgt oft und gerne für Fehler. Das ist mir auch schon passiert, das ich die EJB-Annotations importiert habe ohne es zu merken bzw. genau drauf zu gucken ;)

Poste mal bitte deine Package-Strucktur bzw. allgemein den Aufbau deiner Apllikation. Also Ordner und Dateien.
 
Zuletzt bearbeitet:

2AndAHalfBit

Aktives Mitglied
Hallo,

normales Eclipse Dynamic Web Project. Ich habe einen Screenshot der Projektstruktur angehangen, siehe anhang. Es gibt aber noch keine weitere Package-Struktur, weil ich versucht habe, diesen "Test" möglichst einfach zu halten.

Naja EJB-Annotations sollte ich eigentlich nicht erwischt haben, das würdet ihr ja schon an den Imports in der Bean sehen.

Viele Grüße.
 

Anhänge

  • default context jsf.png
    default context jsf.png
    27,2 KB · Aufrufe: 38

F.S.WhiTeY

Bekanntes Mitglied
die anrwort wurde schon gegeben, deine bean liegt im default package und ist damit unsichtbar. mach nen package und schmeiß die bean da rein. dann lösch die facesconfig und arbeite mit annotationen. für bean und scope.
 

2AndAHalfBit

Aktives Mitglied
Die Antwort wurde gegeben - sorry muss ich wohl überlesen oder nicht verstanden haben.
Aber es funktioniert jetzt immer noch nicht.
Die faces-config ist weg, die bean liegt in einem Package.
An den Annotations habe ich nichts mehr geändert die sind ja schon in der Bean.

//edit: es kommt allerdings eine Warnung:
Information: JSF1048: PostConstruct/PreDestroy-Annotationen vorhanden. Verwaltete Bean-Methoden, die mit diesen Annotationen markiert sind, lassen die entsprechenden Annotationen verarbeiten.

sagt die euch was? Hilft die evtl. weiter?

Grüße
 
Zuletzt bearbeitet:

F.S.WhiTeY

Bekanntes Mitglied
Ähhhhhh..... joa das sagt mir schon was. Ich habe nur keine Ahnung wo du PostConstruct und PreDestroy genutzt haben solltest :D

Kann aber auch irgend eine Bean eines Mitgelieferten Frameworks sien. Davon mal ab sollte das was du da nun hast funktionieren, denn diese warnung ist kein fehler sondern wirklich nur eine warnung. Nagut das macht es nun nicht also lass uns noch mal von vorne anfangen und alles durch gehen.

Deine web.xml: Es hatte mit der faces config funktioniert, also kann es am pattern nicht liegen CHECK

Facesconfig: Ist gelöscht CHECK

JSF-Page: wirft keine Fehler und hat mit faces-config funktioniert CHECK

Annotationen: Sind vorhanden und imports sind richtig CHECK

Scope: Jaaaa... der liebe Scope... an dem kann es liegen. Der kleine s*****er macht gerne mal ärger.

Probier mal bitte folgendes:

mach aus
Code:
private String message;
mal bitte
Code:
 private String message="test";
( was eigentlich keine auswirkungen haben sollte)

und wenn dann nix kommt mach mal aus
Code:
 RequestScoped
ein freundliches
Code:
ViewScoped
 

2AndAHalfBit

Aktives Mitglied
erstmal, bringt beides bringt nichts.
Dabei ist es egal, ob meine Bean einen leeren ctor besitzt, keinen (bzw. den default ctor).
Ist ist auch egal ob die (leere) faces-config existiert oder nicht.
In allen 4 Fällen funktioniert es nicht.

Noch eine Idee?
Ansonsten ist es auch egal geb ich die Bean halt an....

Grüße
 

F.S.WhiTeY

Bekanntes Mitglied
aus irgend einem grund kennt dein servletcontainer die bean nicht. du kannst nun lediglich noch folgendes probieren:

@ManagedBean(name=paladiumBean)

sonst fällt mir nichts mehr ein. allerdings könntest du dir ja mal den spaß machen das ganze im glassfish zu testen. der tomcat macht gerne mal probleme. kommt auch auf die version an. wenn ich mich nicht irre sollte der tomcat bei 7.0.22 oder so angekommen sein und der glassfish sollte mit der version 3.1.2.2 auf dem neusten stand sein.... aber das kannst du ja auf den seiten nachlesen.
 

xehpuk

Top Contributor
Ist ja auch ganz logisch, deine Bean hat ja auch keinen Scope.

Der Default Scope ist None und None bedeutet in einer JSF-Page nicht sichtbar.
ManagedBean (Java EE 6) :rtfm:
The scope of the managed bean is declared using one of
Code:
NoneScoped
,
Code:
RequestScoped
,
Code:
ViewScoped
,
Code:
SessionScoped
,
Code:
ApplicationScoped
, or
Code:
CustomScoped
annotations. If the scope annotations are omitted, the bean must be handled as if the
Code:
RequestScoped
annotation is present.

Zum Thema an sich fällt mir nichts ein. Vielleicht kannst du mal das ganze Projekt hier hochladen, damit wir selbst testen können.
 

Ähnliche Java Themen

Neue Themen


Oben