JSF Managed Bean - Property Setzen

KarlRannseier

Grünschnabel
Hi all,
vorab : ich bin relativ neu in JSF/Faclets/etc..... .
Naja, also ich will eigenlich nur ein Property eine Managed Bean setzen und bekomme es nicht hin. es wäre nett wenn Ihr mir helfen könnt.
Folgendes habe ich gemacht :
Ich habe mir ein kleine Klasse mit einer einzigen Property erstellt. zu der Property dann auch getter und setter definiert. Zusätzlich habe ich während meiner versuche zwei Funktionen ergänzt.

Java:
 package com.antoniushof.navigation;

public class MainNavigation {
	private String currentNavigation;
	
	public MainNavigation(){
		super();
	}

	public String getCurrentNavigation() {
		return currentNavigation;
	}
                
	public void setCurrentNavigation(String currentNavigation) {
		this.currentNavigation = currentNavigation;
	}
	
	public void navigate(String target){
		this.currentNavigation = target;
		
	}
	
	public String test(){
		this.currentNavigation = "Das ist ein Test";
		return "sucess";
	}
}

Dann habe ich die Klasse über die faces-config.xml mit demJSF verbunden :

HTML:
<?xml version='1.0' encoding='UTF-8'?>


<!DOCTYPE faces-config PUBLIC
  "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
  "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">

<faces-config>
	
	<managed-bean>
		<description>
			Dies Klasse hilft die Navigation zu verwirklichen
		</description>
		<managed-bean-name>MainNav</managed-bean-name>
		<managed-bean-class>com.antoniushof.navigation.MainNavigation</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	
	<application>
		<locale-config>
      		<default-locale>de</default-locale>
    	</locale-config>
		<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>		
	</application>

</faces-config>


Und in meiner "body.xhtml" Datei kann ich so das Property auch auslesen :
HTML:
<html xmlns="http://www.w3.org/1999/xhtml"
	  xmlns:ui="http://java.sun.com/jsf/facelets" >
<head></head>
<body>
	  <p>Das ist ein Test :</p>
	  <p>#{MainNav.currentNavigation}</p>
</body>
</html>

Aber das setzen der Property über ein commandlink o.ä. bekomme ich einfach nicht hin.
bis jetzt habe ich es so versucht (zumindes iast das der letzte stand):
HTML:
<jsp:root 	xmlns="http://www.w3.org/1999/xhtml"
	  		xmlns:ui="http://java.sun.com/jsf/facelets" 
	  		xmlns:h="http://java.sun.com/jsf/html"
	  		xmlns:f="http://java.sun.com/jsf/core"
	  		xmlns:jsp="http://java.sun.com/JSP/Page">
	  		
	<head></head>
	<body>
			<h:form>
				<h:commandLink  action="#{MainNav.setCurrentNavigation}">
					<h:outputText value="Body1"/>
					<f:param name="currentNavigation" value="body1.xhtml" />
				</h:commandLink>
				<br/>
				<h:commandLink  action="#{MainNav.test}">
					<h:outputText value="Body2"/>
				</h:commandLink>
			</h:form>
	</body>  				
</jsp:root>

Der Link "Body2" mit der action "Test" geht, also scheint die Verknüpfung ok zu sein.
aber bei dem Link "Body1" bekomme ich folgende Fehlermeldung :
Code:
javax.servlet.ServletException: #{MainNav.setCurrentNavigation}: javax.el.MethodNotFoundException: /WEB-INF/Templates/navigation.xhtml @10,62 action="#{MainNav.setCurrentNavigation}": Method not found: com.antoniushof.navigation.MainNavigation@1be4777.setCurrentNavigation()
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:277)
Soweit ich es verstanden habe schafft er nicht den Parameter für die Funktion zu übergeben, dadurch ist die Funktionssignatur verschieden, und er findet die Funktion nicht.
Den Parameter zu übergeben habe ich auch schon per <f:commandButton> probiert, und auch als "value" im commandlink tag und noch ein wenig mehr.

Es wäre schön wenn mir jemand sagen könnte wie ich das Property richtig setzen kann.

Vielen Dank für eure mühe im Voraus.
Beste Grüße
Karl
 
Ich weiß zwar nicht obs dir weiterhilf, aber hast du evtl. <f:view> vergessen (glaube das ist beim Tag f dabei). Das musst du normalerweise fast immer schreiben wenn du mit JSF arbeitest (glaub ich mal).
Code:
<jsp:root 	xmlns="http://www.w3.org/1999/xhtml"
	  		xmlns:ui="http://java.sun.com/jsf/facelets" 
	  		xmlns:h="http://java.sun.com/jsf/html"
	  		xmlns:f="http://java.sun.com/jsf/core"
	  		xmlns:jsp="http://java.sun.com/JSP/Page">
	  		
	<head></head>
	<body>
                  <f:view>
			<h:form>
				<h:commandLink  action="#{MainNav.setCurrentNavigation}">
					<h:outputText value="Body1"/>
					<f:param name="currentNavigation" value="body1.xhtml" />
				</h:commandLink>
				<br/>
				<h:commandLink  action="#{MainNav.test}">
					<h:outputText value="Body2"/>
				</h:commandLink>
			</h:form>
                  </f:view>
	</body>  				
</jsp:root>

mfg
 
Hi Frozenlife,
Danke für dein Antwort. Irgendwie wunder es mich schon ein wenig, dass ich der Einzigste bin der eine Property einer Managed Bean ändern will.
Naja, leider hat dein Vorschlag nicht das Problem gelöst, aber ich habe gerade eben eine alternative gefunden und ausprobiert (siehe Andere Möglichkeit).
Und der sort beschriebene zweite weg hat gut funktioniert.

Ich fasse das mal kurz zusammen was ich gemacht habe:
In der Klasse/Managed-Bean habe ich eine Funktione hinzugefügt die ich zum setzen der Propertys verwenden.
Java:
	public void callSetter(ActionEvent event)
	{
		UIParameter component = (UIParameter) event.getComponent().findComponent("currentNavigation");
		this.currentNavigation = component.getValue().toString();
	}

Und in der JSF Datei habe ich den commandLink folgendemaßen angepasst :
HTML:
<h:commandLink  actionListener="#{MainNav.callSetter}">
	<h:outputText value="Body1"/>
	<f:param id="currentNavigation" value="Body1"></f:param>
</h:commandLink>

Und wenn ich andere Propertys verarbeiten will so muss ich die nur in der neuen Funktion der Klasse hinzufügen.

Ich weiss nicht ob das so die "übliche" Lösung ist, aber für mich reicht es fürs erste.

Danke und Gruß
Karl
 
NACHTRAG :
also in der gerade geposteten Lösung gibt es das Problem das man die ID im param nur 1x vergeben darf. Vergibt man andere IDs so findet man aber diese in der Bean nicht wieder.
Das Ganze habe ich jetzt etwas angepasst. Das grundprinzip bleib aber gleich.

Also in der JSF-Datei muss der Command jetzt so aussehen :
HTML:
<h:form>
	<h:commandLink value="#{x}" actionListener="#{MainNav.callSetter}">
		<f:attribute  name="test" value="#{x}" />
	</h:commandLink>
</h:form>
(aus <f : para> wird <f : attribute>)

Und der ActionListener in der Bean muss dann so aussehen :
Java:
	public void callSetter(ActionEvent event)
	{
	      this.currentNavigation = event.getComponent().getAttributes().get("test").toString(); 
	}
wie man sehen kann, kann man dan ganz bequem über eine aufruf die Attribute per name holen.

Gruß
Karl
 
Das ist komisch...Ich habe bis jetzt alles Lösungen gesehen, wie du sie gemacht hasst. Also mit param (und auch mehrmals). Deswegen wundere ich mich warum das nicht gehen sollte. Aber danke für die Antwort, vielleicht werd ichs mal brauchen. Jetzt fang ich aber bald mit EJB 3 an. Das soll sogar nur auf dem Tomcat (ohne JBoss) laufen.
 

Neue Beiträge

Zurück