# [JSF] Input-highlighting bei fehlgeschlagener Validierung



## melhor (4. Aug 2010)

Hallo!

Ich habe ein Problem bei der Validierung von Textfeldern mit MyFaces, speziell dem Setzen von css-Klassen bei fehlgeschlagener Validierung. Verwende MyFaces 1.2 mit Richfaces 3.3.3 und Facelets.

Habe zu Testzwecken einen Validator gebaut, der mir nur mal die Feldlänge (ich weiß, da gibts bereits vorgefertigte ... ist, wie gesagt, zu Testzwecken) überprüft.


```
<rich:messages showSummary="false" showDetail="true" />
<h:inputText id="nachname_person" value="#{person.nachname}">
   <f:validator validatorId="lengthValidator"/>
   <f:attribute name="maxLength" value="#24"/>
   <rich:ajaxValidator event="onblur" />
</h:inputText>
```

Die Fehlermeldung wird jetzt auch richtig angezeigt, aber beim Textfeld ändert sich kein Style. Deswegen habe ich einen Phaselistener gschrieben, der in der RENDER_RESPONSE Phase alle Komponenten mit Messages ausließt und dann ein Attribut "styleClass" setzt.


```
public class ValidationStylePhaseListener implements PhaseListener {
 @Override
 public void afterPhase(PhaseEvent event) {}
 
 @Override
public void beforePhase(PhaseEvent event) {
	FacesContext context = FacesContext.getCurrentInstance();
	Iterator<String> clientIdList = context.getClientIdsWithMessages();
	String errorStyle = "error";
		
	StringBuilder highlight = new StringBuilder();
	while (clientIdList.hasNext()) {
		String clientId = clientIdList.next();
		UIComponent component = FacesContext.getCurrentInstance().getViewRoot().findComponent(clientId);
			
		if (component instanceof UIInput) {
			String style = (String) component.getAttributes().get(HTML.STYLE_CLASS_ATTR);
			component.getAttributes().put(
				HTML.STYLE_CLASS_ATTR,
				StringUtils.implode(new Object[] { style, errorStyle }, " "));
			}
		}
	}

 @Override
 public PhaseId getPhaseId() {return PhaseId.RENDER_RESPONSE;}
}
```

Er findet zwar die fehlerhaften Felder und setzt auch das Attribut richtig, allerdings ändert sich bei der Ausgabe nichts.


----------



## Semerzo (4. Aug 2010)

Ist nur ins Blaue geschossen, versuch mal im rich:ajaxValidator _rerender="nachname_person"_ zu ergänzen.

```
<rich:messages showSummary="false" showDetail="true" />
<h:inputText id="nachname_person" value="#{person.nachname}">
   <f:validator validatorId="lengthValidator"/>
   <f:attribute name="maxLength" value="#24"/>
   <rich:ajaxValidator event="onblur" rerender="nachname_person" />
</h:inputText>
```
Das könnte helfen, weil rich:ajaxValidator ein ajaxSingle="true" request ist. Damit werden nur jene jsf Komponenten neu gerendert (deren HTML nachgeladen) die das flag ajaxRendered="true" inne haben. Das sind für gewöhnlich nur rich:messages und rich:message.

Steht so ähnlich auf der richfaces demo Seite


> The component is ajaxSingle by default so only the current field will be validated.


Allerdings wird die Konsequenz, dass eben auch nur ajaxRendered neu gestaltet wird verschwiegen


----------



## melhor (4. Aug 2010)

Habe ich auch schon probiert. Im Firebug sehe ich, dass das Feld 'nachname_person' auch nicht aktualisiert wird, sowohl mit als auch ohne reRender.


----------



## Semerzo (6. Aug 2010)

Also dein Code sieht schon gut aus. Ich vermute mal, Du bist über einen der beiden Blogs gestolpert
Change the style of the erroneous fields
Set focus and highlight in JSF

Das Attribut wird auch im HTML Code richtig gesetzt schreibst Du? Ist denn die CSS Klasse eingebunden? Falls ja, überschreibt die erste Style Class evtl. die Zweite? Zumal ich nicht sicher bin, was passiert, wenn Du folgendes hast

```
<p class="redText blueText">mein text</p>
```


----------



## melhor (9. Aug 2010)

Genau die zwei Links habe ich mir zu Herzen genommen.

Ich habe es jetzt auch mit anderen Attributen probiert, aber es scheint gar nichts gesetzt zu werden. Die Validierung läuft aber sauber durch, weil mir die Validierungsfehler wie erwartet angezeigt werden.

Wie gesagt, ich habe mir mit dem Firebug alles ausgeben lassen, was sich so an der Seite ändern und die Input-Felder waren da leider nicht dabei.


----------

