JSF Richfaces rich:messages

  • Themenstarter Themenstarter Gast2
  • Beginndatum Beginndatum
G

Gast2

Gast
Hallo,

wie kann man eine rich message ausgeben wenn man auf einen Button geklickt hat?
Wenn ich einen Button betätige habe ich den FacesContext eine Message geaddet und mit rich:messages for="submit" versucht auszugeben.Der commanButton hat die id="submit" aber es wird nichts ausgegeben
 
Hast Du auch submit als clientId bei der FacesMessage angegeben? Ansonsten ist es eine globale message, die man nur mit einer globalen rich/h:messages ausgeben kann.
 
Hi,

du hast 2 Möglichkeiten eine Nachrichten auszugeben:

Java:
<!-- globale Nachricht -->
<h:messages global="true"/>

<h:commandButton id="submit" value="Click me" actionListener="#{myBean.submitActionEvent}" action="#{myBean.submitAction}"/>
<h:message for="submit"/>


Java:
@ManagedBean
@ViewScope
public class MyBean{

    public String submitAction(){
     //global
     addMessage(null,"myMessage",FacesMessage.SEVERITY_INFO);

     return "success";
    }
    
     public void submitActionEvent(ActionEvent arg0){
 
       //direkt an die Komponente
       addMessage(arg0.getComponent(),"myMessage",FacesMessage.SEVERITY_INFO);
    }
    
    public void addMessage(UIComponent aUIComponent, String aMessage, Severity aSeverity) {
       FacesContext context = FacesContext.getCurrentInstance();
       if(component == null){
          context.addMessage(null, new FacesMessage(aSeverity, aMessage, null));
       } else {
	context.addMessage(aUIComponent.getClientId(context), new FacesMessage(aSeverity,    aMessage, null));
	}
     }
}

Greetz
 
Danke ich kenne beide Möglichkeiten, aber wenn ich 2 solche Message für 2 verschiedene Buttons habe, bekomme ich es nur hin das gar keine message ausgegeben wird oder alle beide zusammen.

Code:

[XML]
<rich:messages for="save" />
<h:commandButton value="Save"
action="#{controller.save}" id="save" />
<rich:messages for="delete" />
<h:commandButton value="Delete"
action="#{controller.delete}" id="delete" />
[/XML]

Java:
	public void save(){
		FacesContext.getCurrentInstance().addMessage("save", new FacesMessage(FacesMessage.SEVERITY_INFO, "Save", "Save"));
	}

	public void save(){
		FacesContext.getCurrentInstance().addMessage("delete", new FacesMessage(FacesMessage.SEVERITY_INFO, "Delete", "Delete"));
	}

So klappts leider nicht wird nichts ausgegeben...
 
Das Problem ist das du nicht die ClientId verwendest!

Komponenten Id != Client Id

"save" ist nicht die ClientId! Soweit ich weiß baut JSF die ClientId aus dem Parent container und der Komponenten Id zusammen d.h.

BSP:

Java:
<h:form id="form>

<h:commandButton id="submit" .../>

ClientId = form:submit

und damit funktioniert die Angabe "submit" nicht weil es keine Komponente dazu existiert. Schau dir die Id's im Browser Quellcode an.

Grüße
 
Das Problem ist das du nicht die ClientId verwendest!

Komponenten Id != Client Id

"save" ist nicht die ClientId! Soweit ich weiß baut JSF die ClientId aus dem Parent container und der Komponenten Id zusammen d.h.

BSP:

Java:
<h:form id="form>

<h:commandButton id="submit" .../>

ClientId = form:submit

und damit funktioniert die Angabe "submit" nicht weil es keine Komponente dazu existiert. Schau dir die Id's im Browser Quellcode an.

Grüße

Ok versuch ich mal. Bei einem textfeld hat es so funktioniert, deshalb habe ich gedacht es gibt bei einem Button keinen Unterschied!!!
 
Danke ich kenne beide Möglichkeiten, aber wenn ich 2 solche Message für 2 verschiedene Buttons habe, bekomme ich es nur hin das gar keine message ausgegeben wird oder alle beide zusammen.

Code:

[XML]
<rich:messages for="save" />
<h:commandButton value="Save"
action="#{controller.save}" id="save" />
<rich:messages for="delete" />
<h:commandButton value="Delete"
action="#{controller.delete}" id="delete" />
[/XML]

Java:
	public void save(){
		FacesContext.getCurrentInstance().addMessage("save", new FacesMessage(FacesMessage.SEVERITY_INFO, "Save", "Save"));
	}

	public void save(){
		FacesContext.getCurrentInstance().addMessage("delete", new FacesMessage(FacesMessage.SEVERITY_INFO, "Delete", "Delete"));
	}

So klappts leider nicht wird nichts ausgegeben...

Merkwürdig das beide Methode gleich heißen???

Hier habe ich gerade mal getestet funz wunderbar:

Java:
<?xml version='1.0' encoding='UTF-8' ?>
<!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:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:c="http://java.sun.com/jsp/jstl/core">
<f:view contentType="text/html">

	<!-- Define the head parameters -->
	<h:head>
		<title>My Test App</title>
		<meta name="robots" content="noindex" />
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<meta http-equiv="Content-Script-Type" content="text/javascript" />
		<meta http-equiv="Content-Style-Type" content="text/css" />

	</h:head>

	<!-- Define the body content  -->
	<h:body>
	<h:form id="myform">
		<h:panelGrid columns="2">
                    <h:commandButton actionListener="#{Controller.submit}" value="submit" id="submit1"/>
		    <h:message for="submit1"/>
		    <h:commandButton actionListener="#{Controller.delete}" value="delete" id="delete"/>
		    <h:message for="delete"/>
			</h:panelGrid>
		</h:form>
	</h:body>
</f:view>
</html>

Und die ManagedBean dazu

Java:
@ManagedBean(name = "Controller")
@ViewScoped
public class Controller {
	public void submit(ActionEvent arg0) {
		addMessage(arg0.getComponent(), "Submit-Error", FacesMessage.SEVERITY_ERROR);
	}

	public void delete(ActionEvent arg0) {
		addMessage(arg0.getComponent(), "Delete-Failure", FacesMessage.SEVERITY_ERROR);
	}

	public void addMessage(UIComponent aUIComponent, String aMessage, Severity aSeverity) {
		FacesContext context = FacesContext.getCurrentInstance();
		if (aUIComponent == null) {
			context.addMessage(null, new FacesMessage(aSeverity, aMessage, null));
		} else {
			context.addMessage(aUIComponent.getClientId(context), new FacesMessage(aSeverity, aMessage, null));
		}
	}


}

Greetz
 
mmm und was spricht dagegen eine ActionEvent-Methode zu verwenden wenn der Anwendungsfall es bedingt????

Stärkere Kopplung des Bean an JSF und Interesse ob es auch anders geht 😛...

bei mir haben die id namen immer so jdt irgendwas davor, kann man das auch beeinflussen, weil eine message jdt_5: "a" ist keine zahl sieht iwie doof aus 😛
 
Stärkere Kopplung des Bean an JSF und Interesse ob es auch anders geht 😛...

ÄÄ???? Die ManagedBean ist ein Bestandteil von JSF d.h. Kopplung ist irgendwie unsinn -> die Bean's kannst du eh in keiner anderen Anwendung verwenden.

bei mir haben die id namen immer so jdt irgendwas davor, kann man das auch beeinflussen, weil eine message jdt_5: "a" ist keine zahl sieht iwie doof aus 😛

Wenn du selber keine eindeutigen Id's vergibt -> werden von JSF welche berechnet und die sehen halt 'doof' aus....

Das hat einen guten Grund warum die Id's alle eindeutig sind! In alten JSP-basierenden Anwendungen wo keine Validierung erfolgte ob eine Tag-id bereits vergeben ist hat man damit schöne Fehler produziert wenn man über die Tag-id Berechnungen vorgenommen hat (für AJAX z.B.).

Greetz
 
ÄÄ???? Die ManagedBean ist ein Bestandteil von JSF d.h. Kopplung ist irgendwie unsinn -> die Bean's kannst du eh in keiner anderen Anwendung verwenden.

Ich verwende keine ManagedBean, sondern JEE6 CDI

Wenn du selber keine eindeutigen Id's vergibt -> werden von JSF welche berechnet und die sehen halt 'doof' aus....

ja ich hab aber eine id vergeben oder muss ich dem converter eine id verpassen? Mal testen...
 
Ich verwende keine ManagedBean, sondern JEE6 CDI

Dennoch verwendest du JSF für die View bzw. addFacesMessage-Methode d.h. spielt es in diesen Fall keine Rolle ob du nun das Komponentenmodell von CDI oder die ManagedBean-Annotation verwendest.

ja ich hab aber eine id vergeben oder muss ich dem converter eine id verpassen? Mal testen...

Ich glaube das du den Parent Container (form, panelGrid etc) keine Id vergeben hast d.h. würde ich schauen ob alle Id's vergeben hast.
 
Dennoch verwendest du JSF für die View bzw. addFacesMessage-Methode d.h. spielt es in diesen Fall keine Rolle ob du nun das Komponentenmodell von CDI oder die ManagedBean-Annotation verwendest.

Ja macht schon einen Unterschied weil die Message Sachen ausgelagert sind. Naja wie gesagt anders würde ich es schöner finden. Aber schlimm ist es nicht...
 

Zurück
Oben