# Verständnisfrage zum Defaultcontext (JSF)



## 2AndAHalfBit (24. Aug 2012)

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?


```
<!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:

```
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 (25. Aug 2012)

Du renderst laut web.xml JSF nur mit Datein, die auf .jsf enden. Änder mal 
	
	
	
	





```
<url-pattern>*.jsf</url-pattern>
```
 in 
	
	
	
	





```
<url-pattern>/faces/</url-pattern>
```
 und rufe dann mal deine Datei unter /faces/home.xhtml auf.


----------



## 2AndAHalfBit (25. Aug 2012)

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):


```
<!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)...


----------



## F.S.WhiTeY (25. Aug 2012)

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:


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

Edit: 

habe den Import noch mal erweitert.


----------



## 2AndAHalfBit (25. Aug 2012)

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:


```
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 (25. Aug 2012)

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 (25. Aug 2012)

> 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.


----------



## 2AndAHalfBit (26. Aug 2012)

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.


----------



## 2AndAHalfBit (14. Sep 2012)

ich hol das Thema nochmal hoch, bevor es in der Versenkung verschwindet 
Oder hat niemand eine Idee?

Grüße


----------



## F.S.WhiTeY (15. Sep 2012)

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 (15. Sep 2012)

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


----------



## F.S.WhiTeY (16. Sep 2012)

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

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 
	
	
	
	





```
private String message;
```
 mal bitte
	
	
	
	





```
private String message="test";
```
 ( was eigentlich keine auswirkungen haben sollte) 

und wenn dann nix kommt mach mal aus
	
	
	
	





```
RequestScoped
```
 ein freundliches 
	
	
	
	





```
ViewScoped
```


----------



## 2AndAHalfBit (16. Sep 2012)

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 (16. Sep 2012)

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 (16. Sep 2012)

F.S.WhiTeY hat gesagt.:


> 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
> 
> 
> 
> ...



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


----------

