# JSF/Facelets mit Seam-Framework



## thommy.s (24. Mrz 2010)

Hallo liebe Leuts,

hab ein vllt. für den Kenner einfaches Problem, komm' aber nicht mehr weiter und kau' an diesem auch schon ne Weile herum.

Nutze JSF (1.2) bzw. Facelets innerhalb des Seam-Frameworks (Ver. 2.2), mit Templating. Nun ja, die Startseite wird auch richtig zusammengesetzt, links an der Seite wie üblich eine Navigation mit Buttons, includiert. Dazu eine "managed-bean", die auf die Buttonaktionen reagieren soll bzw. auch die Zustände der Buttons setzen soll ("enabled-disabled)

Bean hier:


```
package jsf.managedbeans;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;


@Name("globalSettings")
@Scope(ScopeType.SESSION)
public class GlobalSettings {
	public GlobalSettings() {
		
		
	}	
	
	

	
	private String stateHome;
	private String stateThemes;
	private String stateSearch;
	private String stateLinks;
	private String stateLogin;
	
	
	public String getStateHome() {
		return stateHome;
	}
	public void setStateHome(String stateHome) {
		this.stateHome = stateHome;
	}
	
	public String getStateThemes() {
		return stateThemes;
	}
	public void setStateThemes(String stateThemes) {
		this.stateThemes = stateThemes;
	}
	
	public String getStateSearch() {
		return stateSearch;
	}
	public void setStateSearch(String stateSearch) {
		this.stateSearch = stateSearch;
	}
	
	public String getStateLinks() {
		return stateLinks;
	}
	public void setStateLinks(String stateLinks) {
		this.stateLinks = stateLinks;
	}
	
	public String getStateLogin() {
		return stateLogin;
	}
	public void setStateLogin(String stateLogin) {
		this.stateLogin = stateLogin;
	}
	
	
	
	
public String pressThemesButton() {
		
		this.stateThemes = "true";
		this.stateSearch = "false";
		this.stateLinks = "false";		
		this.stateLogin = "false";
		this.stateHome = "false";
		
		
		System.out.println("Ich, der Thememliste-Button, wurde gedrückt");


		return stateThemes;
		
	}
	
	public String pressSearchButton() {
		
		this.stateThemes = "false";
		this.stateSearch = "true";
		this.stateLinks = "false";		
		this.stateLogin = "false";
		this.stateHome = "false";
		this.navigation = "/searchthemes.xhtml";

		return stateSearch;
		
	}
	
	
	public String pressLinksButton() {
		
		this.stateThemes = "false";
		this.stateSearch = "false";
		this.stateLinks = "true";		
		this.stateLogin = "false";
		this.stateHome = "false";
		

		return stateLinks;
		
	}
	
	
	public String pressLoginButton() {
		
		this.stateThemes = "false";
		this.stateSearch = "false";
		this.stateLinks = "false";		
		this.stateLogin = "true";
		this.stateHome = "false";
		

		return stateLogin;
		
	}
```


die zugehörige faces-config.xml


```
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" 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_1_2.xsd">
 
 <navigation-rule>
  <from-view-id>*</from-view-id>
  <navigation-case>
   <from-action>#{globalSettings.pressThemesButton()}</from-action>
   <from-outcome>true</from-outcome>
   <to-view-id>/themes.xhtml</to-view-id>
   <redirect/>
  </navigation-case>
 </navigation-rule>
 <navigation-rule>
  <from-view-id>*</from-view-id>
  <navigation-case>
   <from-action>#{globalSettings.pressHomeButton()}</from-action>
   <from-outcome>true</from-outcome>
   <to-view-id>/welcome.xhtml</to-view-id>
   <redirect/>
  </navigation-case>
 </navigation-rule>
 <application>
  <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
  
 </application>
</faces-config>

[ /JAVA]

Die Buttons sollen letztlich auf die anderen Seiten weiterleiten, wie gesagt aus einem includierten Schnipsel. Hab' u.a. auch schon mal versucht, den Pfad in der faces-config.xml relativ auf den Schnipsel zu beziehen; das meckert Eclipse aber an, der Pfad müsste mit "/" beginnen. Jedenfalls gibt es keine Reaktion auf eine Button-Drückaktion, ein Kontroll System.out.println("bla") in der aufzurufenden Methode wird auch nicht erreicht. Es scheint also so zu sein, dass die entsprechende Methode eben gar nicht aufgerufen wird.

Hier auch noch die XHTML-Seite, die die Buttons "trägt"

[code=Java]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
	  xmlns:ui="http://java.sun.com/jsf/facelets">
	  
	    

<ui:composition>	
	 
		<h:commandButton styleClass="navibtns" disabled="false" action="#{globalSettings.pressHomeButton()}" value="Home" />
		<p />
		<h:commandButton styleClass="navibtns" disabled="#{globalSettings.stateThemes}" action="#{globalSettings.pressThemesButton()}" value="Themenliste" />
		<p />
		<h:commandButton styleClass="navibtns" disabled="#{globalSettings.stateSearch}" action="#{globalSettings.pressSearchButton()}" value="Suche" />
		<p />
		<h:commandButton styleClass="navibtns" disabled="#{globalSettings.stateLinks}" action="#{globalSettings.pressLinksButton()}" value="Links" />
		<p />
		<hr />
		<h:commandButton styleClass="navibtns" disabled="#{globalSettings.stateLogin}" action="#{globalSettings.pressLoginButton()}" value="Login" />
		<p />		

	
</ui:composition>

</html>
```


Wäre für Hilfe echt dankbar; in einer früheren Version (ohne Seam) hat zumindest das mit den Zuständen schon  mal funktioniert. Wenn noch weitere Informationen benötigt werden, nur zu.


Seid gegrüßt

Thomas


----------



## MrWhite (25. Mrz 2010)

Zunächst mal: Ich sehe da nirgends eine Form! Also ohne Form geht schonmal nix!


```
<h:form>
```
!


Wenn es das nicht ist:

Geb dir mal die Faces Messages aus, vielleicht steht was drin.

Wenn die Methode nicht aufgerufen wird, kommst du erst gar nicht in die Invoke Application Phase von JSF, sprich, du bleibst irgendwo vorher hängen (evtl. bei der Validierung von irgendwelchen Items?).

Was mir mal passiert ist: Sieh nach, ob du irgendwo, z.B. bei der Vergabe von IDs gegen den W3C Standard verstößt. Bestimmte Zeichen darin mag JSF ganz und gar nicht, z.B. Square Brackets ('[').

Hier die erlaubten Zeichen als regex: [A-Za-z0-9.,:=]


----------



## MrWhite (25. Mrz 2010)

p.s. eine ui composition kommt eigentlich auch in eine eigene datei, ohne das html gedöns aussenrum.


----------



## thommy.s (26. Mrz 2010)

danke, der Tipp war schon mal gut...

Hatte mich grad mit JSF anfreunden wollen, dann sollte ich doch gleich 'Seam' nehmen, weil da ja alles so viel einfacher ist...

Hab's einfach nicht mehr gesehen

Jetzt bekomm' ich zwar ne Debug-Page, aber es passiert wieder was

javax.el.PropertyNotFoundException: /includes/navigation_one.xhtml @14,152 action="#{globalSettings.pressThemesButton()}": Target Unreachable, identifier 'globalSettings' resolved to null.


Und das schau' ich mir erst morgen an, nach dem Aufsteh'n...:toll:


----------



## thommy.s (26. Mrz 2010)

nun hab' ich die Bean doch noch mal in der faces-config.xml konfiguriert, und siehe da, da geht's.

Mir wurde allerdings gesagt, dass ich innerhalb des Seam-Frameworks mit Annotations arbeiten könnte (siehe oben im Bean-Quelltext), das würde reichen. 

Vielleicht könntest du, MrWhite, mir noch erklären, warum das anscheinend nicht geht?  Hab' ich noch 'ne Konfiguration übersehen?


----------



## MrWhite (27. Mrz 2010)

Sieht aus, als wuerde der Seam-Filter nicht greifen.

Hast du den in der web.xml eingetragen? Auf jeden Fall solltest du keine Managed Beans mehr konfigurieren muessen! Dafuer hat man ja Seam-Komponenten!

Chapter25.Configuring Seam and packaging Seam applications

4.2.2.*Migrating web.xml and faces-config.xml to Seam 2


----------



## thommy.s (27. Mrz 2010)

Seam Filter ist konfiguriert, siehe Ausschnitt web.xml

[XML]
 <filter>
    <filter-name>Seam Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Seam Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
[/XML]

Wenn ich deine Hinweise richtig gelesen habe, ist alles korrekt... hmm


Hab' aber auch noch gesehen , dass je nach Quelle nicht 

org.jboss.seam.servlet.SeamFilter, sondern

org.jboss.seam.web.SeamFilter  verwendet wird. Ist schon alles ganz schön verwirrend.

Hab' es jedenfalls mit beiden versucht, jedoch immer noch ohne Erfolg. Den Filter auszukommentieren brachte keinerlei Veränderung im Verhalten der Anwendung; derzeit verwende ich wohl noch keine Seam-Komponenten.


----------



## thommy.s (28. Mrz 2010)

Jetzt funktioniert's.... Puaah


Geholfen hat mir dieser Forumseintrag von der Konkurrenz:

ServletException: Target Unreachable - Entwickler-Forum


Es war die schnöde seam.properties, die im Wurzelverzeichnis der Java-Klassen fehlte. Echt unglaublich. Sie ist zwar leer, wird aber wohl gebraucht.

Fein, das.

Grüße Thomas


----------

