Home > Individuelle required-Message mit JSF 1.1

Individuelle required-Message mit JSF 1.1

8. Februar 2007 — 8 Kommentare

Das Einrichten von individuellen Messages für Java Server Faces 1.1 sind begrenzt.

Möchte man z.B. zu einer einzelnen Input-Komponente eine individuelle Message ausgegeben, so ist dies mit normalen Mitteln im Validierungskontext nicht möglich. Hier ist man auf die allgemeingültige Nachricht, unter dem Key ‚javax.faces.component.UIInput.REQUIRED[_detail]‘ der message-properties von JSF beschränkt, welche dann für alle Input-Komponenten gilt, die mit einem required=“true“-Attribut versehen sind und somit keine Individualisierung zulässt.

Anmerkung: In JSF 1.2 ist dieser Mißstand behoben. Hier ist ein requiredMessage-Attribut für alle UIInput-Komponenten definiert.

Nachfolgende Lösung soll es möglich machen, für alle UIInput-Komponenten eine individuelle required-Nachricht in JSF 1.1 zu setzen. Eine Erweiterung auf Converter-Nachrichten usw. sollte leicht möglich sein.

Diese Lösung basiert auf einem PhaseListener und ist einem Artikel von Hans Bergsten (Designing and Implementing Web Application Interfaces) nachempfunden, enthält aber einige Fehlerbehebungen und läßt auch den Einsatz bei Tomahawk-Komponenten mit aktiviertem forceId-Attribut zu.

Installation

Die Jar-Datei JSFMessagePhaseListener.jar ist dem Classpath hinzuzufügen. Für die Verwendung wird eine JSF 1.1 Version (RI oder MyFaces) und ein JDK 1.5 (oder höher) benötigt.

Zur Aktivierung des PhaseListeners ist ein Eintrag in der faces-config.xml vorzunehmen:


<lifecycle>
<phase-listener>
de.rebbert.faces.listener.MessageListener
</phase-listener>
</lifecycle>

Verwendung

Für die Benutzung sind folgende Schritte notwendig:

Die Werte für die ‚javax.faces.component.UIInput.REQUIRED[_detail]‘ key sind in den Message.properties zu überschreiben:
javax.faces.component.UIInput.REQUIRED = *
javax.faces.component.UIInput.REQUIRED_detail = VALUE_REQ_MSG

Um nun eine eigene required-Nachricht zu setzen ist der UIInput-Komponente ein weiteres Attribut hinzuzufügen:

<f:attribute name="custMsg" value="Please enter your lastname." />

Alternativ ist es möglich einen Message-Bundle key zu übergeben:
<f:attribute name="custMsg" value="lastname.required" />

Beispiel:
<h:inputText id="lastname" value="#{person.lastname}" required="true">
<f:attribute name="custMsg" value="Bitte geben Sie Ihren Nachnamen ein." />
</h:inputText>

Download

Binary: JSF-MessagePhaseListener

Javadoc: JSF-MessagePhaseListener-Javadoc

Source: JSF-MessagePhaseListener-Source

8 Antworten an Individuelle required-Message mit JSF 1.1

  1. Daniel Franke 23. Mai 2007 at 13:31

    Hallo Markus,

    es gibt einen kleinen Bug in deinem Listener.
    Und zwar: Wenn man im managed Bean eine FacesMessage erzeugt und mittels FacesContext.getCurrentInstance().addMessage ausgibt, wirft deine Methode eine null-pointer-exception bei: UIComponent c = root.findComponent(clientId);

    Wenn man das Ganze mit nem Try/catch-block umgibt läuft Alles bestens:

    UIComponent c;
    try
    {
    c = root.findComponent(clientId);
    }
    catch (Exception ex1)
    {
    c = null;
    }

    if (c == null) {
    //if the component could not be found directly from the root
    //component.

    try
    {
    c = findComponent(root, clientId);
    }
    catch (Exception ex)
    {
    c = null;
    }
    }

    Gruß, Daniel

  2. Hi Daniel,

    danke für den Hinweis!

    Werde das, sobald ich wieder mehr Zeit habe, einbauen und prüfen.

    Gruß,
    Markus

  3. Daniel Franke 24. Mai 2007 at 08:53

    Hi Markus,

    ich hab das Szenario bei einem Login-Form herrausgefunden
    Wenn man dort 2 Eingabefelder für Passwort und Loginname macht und für jedes Feld eine spezielle Error-Message (die dann anzeigt, dass das jeweilige Feld nicht ausgefüllt ist) PLUS ein extra Element welches dann anzeigt, dass zB die Kombination aus User und/oder Passwort nicht stimmt, dass dann die Exception geworfen wird.

    Kann dir auf Wunsch auch das Form schicken.

    Gruß, Daniel

  4. Komme um diesen Bug mit Nullpointer-Exception nicht rum:

    c = findComponent(root, clientId);
    ist es eine selbstgeschrieben Funktion oder sollte es:
    c = root.findComponent(root, clientId); heißen.
    Denn ich finde so eine Methode (mit 2 Parametern) bei mir nicht.

  5. Hallo,
    bei mir funktioniert das ganze nicht (benutze MyFaces 1.1.5). Es erscheint statt der Fehlermeldung „Bitte geben Sie Ihren Nachnamen ein.“ immer nur „VALUE_REQ_MSG“.
    Eine Idee woran es liegen könnte?

  6. Hi Michael,

    hast Du, wie oben angegeben, das Attribut custMsg innerhalb der Komponente angegeben?

    Ansonsten schick mir mal den Code an vorname ad nachname punkt de

    Gruß,
    Markus

  7. Danke für deine Antwort. Ich habe den Code 1zu1 von dir kopiert. Hast du vielleicht eine komplette Beispielsanwendung (z.B. als Netbeans-Projekt mit Tomcat, JSF-Beispielsseite) welche du zum Download bereit stellen könntest? Könnte daran dann dies schneller nachvollziehen.

    Vielen Dank
    Grüßle
    Michael

  8. Hi,

    danke fürs teilen!

    Du kannst folgendes noch machen:

    um die Messages nicht jedes mal zu prüfen (eigentlich nur nötig vor der Render Response Phase)
    kannst du folgendes noch voran setzen:

    public void beforePhase(PhaseEvent e) {

    if (e.getPhaseId() == PhaseId.RENDER_RESPONSE) {

Schreibe einen Kommentar

Textformatierung: HTML. <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*